STM32 PWM 计数器模式和对齐
- 1. TIM高级定时器简介
- 2. TIM计数模式
- 2.1 向上计数
- 2.2 向下计数
- 2.3 中心对齐模式(向上/向下计数)
- 2.4 重复计数
- 3. PWM输出模式
- 3.1 举例看下PWM中心对齐模式,设置参数如下:
- 4. FOC中PWM相关设置说明
- 4.1 Update Event 触发ADC采集
- 4.2 Output Channel4触发ADC采集
- 4.3 测试过程中发现的小问题
- 5. 后记:TIM中心对齐与PWM中心对齐模式区别
- 5.1 TIM中心对齐
- 5.2 PWM中心对齐模式
1. TIM高级定时器简介
TIM1和TIM8高级定时器框图如下:
- CCxI:capture/compare x interrupt,例如CC1I,表示CC1 interrupt
- OCxREF:output compare reference,输出比较参考电平
TIM中的中断如下图,除了DMA中断外,常用的几类中断:
- BI:break interrupt 刹车中断
- TI:Trigger interrupt 触发中断
- COMI:COM interrupt COM中断
- CCxI:capture/compare interrupt,捕获/比较中断
- UI:update interrupt,更新中断
2. TIM计数模式
2.1 向上计数
- 计数器从0开始计数到自动加载值(TIMx_ARR),然后重新从0开始计数,并产生一个计数器溢出事件
- 如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新时间(UEV),否则每次计数器溢出时才产生更新时间
2.2 向下计数
- 计数器从自动加载值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件
- 如果使用了重复计数器功能,在向下计数达到设置的重复计数次数(TIMx_RCR)时,产生更新时间(UEV),否则每次计数器下溢时才产生更新时间
2.3 中心对齐模式(向上/向下计数)
- 在中心对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR)-1,产生一个计数器溢出时间,然后向下计数到1,并产生一个计数器下溢事件,然后再从0开始重新计数
- 中心对齐模式下:不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向
- 可以在每次计数上溢和每次计数下溢时产生更新事件,对应产生UI(update interrupt)中断
2.4 重复计数
重复计数器在以下任一条件成立时递减:
- 向上计数模式下每次计数器溢出时
- 向下计数模式下每次计数器下溢时
- 中心对齐模式下,每次上溢和每次下溢时
从上图中可以看出:对于中心对齐模式,RCR不同值的含义,此处产生UI(update interrupt)中断
- 0: 每次上溢、下溢都会产生中断
- 1:每次下溢时产生中断
- 2:上溢、下溢间隔,产生中断
- 3:每两次下溢产生中断
- 3和重新同步:每两次下溢,或者同步时产生中断
在STM32CubeMX中设置Trigger Event为 UpdateEvent时,Repetition Counter才起作用
设置Trigger Event为其他模式时,Repetition Counter不起作用
3. PWM输出模式
PWM输出模式可以与TIM的对齐模式对应起来。
PWM模式寄存器TIMx_CR1中的CMS[1:0]:根据产生中断方式不同来区分,此处会产生CCxI(capture/compare interrupt),会影响输出比较中断触发时间点,但是不会影响PWM输出波形
- 00: 边沿对齐模式。计数器依据方向位(DIR)向上或向下计数
- 01:中心对齐模式1;输出比较中断标志位,向下计数时被设置
- 10:中心对齐模式2;输出比较中断标志位,向上计数时被设置
- 11:中心对齐模式3;输出比较中断标志位,向上计数和向下计数时被设置
对应设置的中断标志位。
3.1 举例看下PWM中心对齐模式,设置参数如下:
- ARR = 8, 自动重载寄存器,周期计数8
- CCRx = 4,捕获/比较寄存器,计数值4
- 不同CMS模式下,CCI触发的时间点:
- CMS=01:中心对齐模式1,只在计数器向下计数时被设置。如图向下计数从5到4时触发CCxI
- CMS=10:中心对齐模式2,只在计数器向上计数时被设置。如图向上计数从3到4时触发CCxI
- CMS=11:中心对齐模式3,在计数器向上、向下计数时都会被设置。如图向上计数从3到4,向下计数从5到4时都会触发CCxI
- 同时可以看到:计数器<CCR值时,OCxREF输出高电平,计数器>CCR值时,OCxREF输出低电平
- 不同CMS模式下,CCI触发的时间点:
- 在极性为高时(CH polarity = High),得到如下图PWM波形。
- 计数器Counter< CCR时,输出高电平
- 计数器Counter> CCR时,输出低电平
对应STM32CubeMX选择counter mode
4. FOC中PWM相关设置说明
4.1 Update Event 触发ADC采集
-
选择Trigger EVent Selection为:Update Event,这里用的TIM计数器Update interrupt
-
设置Repetition Counter = 1,只在每次下溢时产生中断,每次上溢时不产生中断
-
因为是中心对齐模式,所以Counter register从0向上计数ARR值(3500),再从ARR值(3500)向下计数到0。所以Update Event触发的时间只和ARR寄存器相关,和CCR值无关
-
这里CCR的值,即pulse,触发的是ICxI,不会影响UI(Update interrupt)
4.2 Output Channel4触发ADC采集
-
选择Trigger EVent Selection为:Output compare(OC4REF),这里用的PWM的ICxI 中断
-
选择TIM1的Channel4为 PWM generation no Output
-
设置Trigger EVent Selection为 Output compare(OC4REF)
-
这里由CCR的值,即pulse触发中断,与ARR值,即period无关
- 如果pulse=1,则计数Counter刚开始马上触发中断,刚好在PWM Channel N的低电平中心点
- 如果pulse=ARR值-1,则计数Counter快到ARR值(3500)时才触发中断,刚好在PWM Channel N的高电平中心点
-
设置PWM generation Channel4的 pulse,确定采用时间点:
- 设置为3500-1时:PWM-Channel 1 N 高电平中心点采样。图中蓝色对应PWM-Channel 1 N ,黄色对应PC4(在ADC注入中断函数中toggle电平)
- 设置为1时: PWM-Channel 1 N 低电平中心点采样。图中蓝色对应PWM-Channel 1 N ,黄色对应PC4(在ADC注入中断函数中toggle电平)
4.3 测试过程中发现的小问题
以上两种模式存在同样的问题:
PWM Channel1 N(蓝色)高电平中心点,与注入中断触发输出(黄色)始终有3us的延时,无法消除。可能原因是中断回调函数中,设置PC4电平需要花费时间
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);
m0_phB = hadc->Instance->JDR1;
m0_phC = hadc->Instance->JDR2;
}
5. 后记:TIM中心对齐与PWM中心对齐模式区别
两者的主要区别:
- 上溢、下溢触发的时间点不同
- TIM中心对齐:上溢发生在计数器从ARR-1到ARR时,下溢发生在1到0时
- PWM中心对齐:上溢发生在计数器从CCR-1到CCR时,下溢发生在从CCR+1到CCR时
- 上溢、下溢触发的中断事件不同
- TIM中心对齐:上溢、下溢触发UI (Update interrupt)
- PWM中心对齐:上溢、下溢触发CCxI (capture/compare interrupt)
5.1 TIM中心对齐
- 触发时间点:ARR=0x6,(auto reload register)
- 上溢发生在计数器从ARR-1到ARR时。如图发生在计数器从5到6时
- 下溢发生在计数器从1到0时。如果发生在计数器从1到0时
- 触发的事件是Update event,如图UIF被置位(Update interrupt flag)
5.2 PWM中心对齐模式
- 触发时间点:ARR=0x08,(auto reload register),CCR=0x04,(capture/compare register)
- 上溢发生在计数器从CCR-1到CCR时。如图发生在计数器从3到4时
- 下溢发生在计数器从CCR+1到CCR时。如果发生在计数器从5到4时
- 触发的事件是CCxI,如图CCxIF被置位(capture/compare interrupt flag)