STM32 PWM 计数器模式和对齐
- 1. TIM高级定时器简介
- 2. PWM计数模式
- 2.1 向上计数
- 2.2 向下计数
- 2.3 中心对齐模式(向上/向下计数)
- 2.4 重复计数
- 3 中心对齐模式1,2,3
- 4. FOC中PWM相关设置说明
- 4.1 Update Event 触发ADC采集
- 4.2 Output Channel4触发ADC采集
- 4.3 测试过程中发现的小问题
1. TIM高级定时器简介
TIM1和TIM8高级定时器框图如下:
- CCxI:capture/compare x interrupt,例如CC1I,表示CC1 interrupt
- OCxREF:
TIM中的中断如下图,除了DMA中断外,常用的几类中断:
- BI:break interrupt 刹车中断
- TI:Trigger interrupt 触发中断
- COMI:COM interrupt COM中断
- CCxI:capture/compare interrupt,捕获/比较中断
- UI:update interrupt,更新中断
2. PWM计数模式
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)中断
- 在极性为高时(CH polarity = High),得到如下图PWM波形。
- 计数器Counter< CCR时,输出高电平
- 计数器Counter> CCR时,输出低电平
2.4 重复计数
重复计数器在以下任一条件成立时递减:
- 向上计数模式下每次计数器溢出时
- 向下计数模式下每次计数器下溢时
- 中心对齐模式下,每次上溢和每次下溢时
从上图中可以看出:对于中心对齐模式,RCR不同值的含义,此处产生UI(update interrupt)中断
- 0: 每次上溢、下溢都会产生中断
- 1:每次下溢时产生中断
- 2:上溢、下溢间隔,产生中断
- 3:每两次下溢产生中断
- 3和重新同步:每两次下溢,或者同步时产生中断
在STM32CubeMX中设置Trigger Event为 UpdateEvent时,Repetition Counter才起作用
设置Trigger Event为其他模式时,Repetition Counter不起作用
3 中心对齐模式1,2,3
中心对齐模式寄存器TIMx_CR1中的CMS[1:0]:根据产生中断方式不同来区分,此处会产生CCxI(capture/compare interrupt),会影响输出比较中断触发时间点,但是不会影响PWM输出波形
- 00: 边沿对齐模式。计数器依据方向位(DIR)向上或向下计数
- 01:中心对齐模式1;输出比较中断标志位,向下计数时被设置
- 10:中心对齐模式2;输出比较中断标志位,向上计数时被设置
- 11:中心对齐模式3;输出比较中断标志位,向上计数和向下计数时被设置
对应STM32CubeMX选择counter mode
4. FOC中PWM相关设置说明
4.1 Update Event 触发ADC采集
- 选择Trigger EVent Selection为:Update Event
- 设置Repetition Counter = 1,只在每次下溢时产生中断,每次上溢时不产生中断
- 因为是中心对齐模式,所以Counter register从0向上计数ARR值(3500),再从ARR值(3500)向下计数到0。所以Update Event触发的时间只和ARR寄存器相关,和CCR值无关
- 这里CCR的值,即pulse,不会触发中断输出
4.2 Output Channel4触发ADC采集
-
选择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;
}