这几天一直在使用STM32来写sensorless BLDC的驱动框架,那么必须会用到TIM1的CCR1/CCR2/CCR3产生的六路互补PWM,以及用CCR4来产生一个中断,用来在PWM-ON的时候产生中断进行过零检测,以及相电流的检测等。

这几天一直在测试PWM,CCR4的中断,ADC1的采样触发+DMA等功能,现在也了解的差不多了,先记录下来,先看下我的一些设置,TIM1设置:

   /* Time Base configuration ,init time1 freq*/
TIM_TimeBaseStructure.TIM_Period = Period;
TIM_TimeBaseStructure.TIM_Prescaler = ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision = ;
TIM_TimeBaseStructure.TIM_RepetitionCounter = ;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* Automatic Output enable, Break, dead time and lock configuration*/
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStructure.TIM_DeadTime = ;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); /*pwm driver set ,channel 1,2,3,4set pwm mode*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
//set OC1/OC1N
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//set oc2/oc2n
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
//set OC3/OC3N
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
//set adc sample time
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//CCR4这个输出使能后才能用来触发ADC1的注入通道采样
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //enable interrupt
TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);  //CCR4的中断,这个通过设置CCR4的pulse来控制产生中断相当于PWM-ON的位置
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_COM,ENABLE); /* BLDC_TIMER_NUM counter enable */
TIM_Cmd(TIM1, ENABLE); /* Main Output Enable */
TIM_CtrlPWMOutputs(TIM1, ENABLE);

  ADC1设置,这里采用规则通道+DMA+软件触发,注入通道+CCR4事件触发:

     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = ;
ADC_Init(ADC1, &ADC_InitStructure); ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,,ADC_SampleTime_239Cycles5);//hand
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,,ADC_SampleTime_239Cycles5);//external temperature
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,,ADC_SampleTime_239Cycles5);//vol
ADC_RegularChannelConfig(ADC1,ADC_Channel_10 ,,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,,ADC_SampleTime_239Cycles5);
//上面规则通道的设置,注意采样时间,我发现如果时间设置过的可能数据会互相干扰
//下面是注入通道,这里注入通道设置成TIM1的CCR4事件触发
ADC_InjectedSequencerLengthConfig(ADC1, );
ADC_InjectedChannelConfig(ADC1,ADC_Channel_TempSensor,,ADC_SampleTime_7Cycles5);//CURRENT
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4);//这个可以使用time1的CCR4事件来触发采样
ADC_ExternalTrigInjectedConvCmd(ADC1,ENABLE); ADC_ITConfig(ADC1,ADC_IT_JEOC,ENABLE);//ENABLE INJECTED INTERRUPT
/* Enable automatic injected conversion start after regular one */
// ADC_AutoInjectedConvCmd(ADC1, ENABLE);//是否在规则通道结束之后自动开始注入通道采样 ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE);

  另外我还加了一个注入通道采样结束的中断,用来快速处理相电流的一些问题,比如限流、过流的处理。

  测试从发现如果把CCR4的pulse设为0,那么就不会触发ADC1的注入采样,也就不会产生ADC的中断,只有pluse设置为一定的有效数值,那么adc注入通道的采样才会被触发。

最新文章

  1. 深搜+回溯 POJ 2676 Sudoku
  2. nginx学习(二):初识配置文件
  3. poj 2096 Collecting Bugs (概率dp 天数期望)
  4. 中国的手写输入法iOS8.1在崩溃
  5. 1、java面试
  6. 从事务角度粗窥架构的可扩展性和可维护性:内容整理自java web轻量级开发面试教程
  7. django报错Manager isn't accessible via UserInfo instances
  8. elasticsearch6.6.2在Centos6.9的安装
  9. List实体去重
  10. java 线程(五)线程安全 Lock接口
  11. linux 的常用命令---------第四阶段
  12. 修改thinkpad 小红点(TrackPoint速度)
  13. Django中间件解析
  14. 解决Eclipse中新建jsp文件总是以ISO8859-1编码问题
  15. Python的优雅写法
  16. 一点一点看JDK源码(四)java.util.ArrayList 中篇
  17. Linux getcwd()的实现
  18. lintcode-148-颜色分类
  19. 【BZOJ4517】【SDOI2016】排列计数 [数论]
  20. java使用netty的模型总结

热门文章

  1. python的时间模块
  2. DLL技术应用04 - 零基础入门学习Delphi47
  3. C++----练习--string输入输出
  4. 你真的会玩SQL吗?透视转换
  5. Linux下编译boost库和qt和ImageMagick
  6. JavaScript 输入验证器工具
  7. LinearGradient线性渲染
  8. C++中如何建立一个顺序表
  9. windows下搭建及配置mantis缺陷管理工具
  10. pcl1.7.2_vs2013_x64工程配置