STM32 PWM 计数器模式及对齐方式详解

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输出低电平
  • 在极性为高时(CH polarity = High),得到如下图PWM波形。
  • 计数器Counter< CCR时,输出高电平
  • 计数器Counter> CCR时,输出低电平
  • 对应STM32CubeMX选择counter mode

    4. FOC中PWM相关设置说明

    4.1 Update Event 触发ADC采集

    1. 选择Trigger EVent Selection为:Update Event,这里用的TIM计数器Update interrupt

    2. 设置Repetition Counter = 1,只在每次下溢时产生中断,每次上溢时不产生中断

    3. 因为是中心对齐模式,所以Counter register从0向上计数ARR值(3500),再从ARR值(3500)向下计数到0。所以Update Event触发的时间只和ARR寄存器相关,和CCR值无关

    4. 这里CCR的值,即pulse,触发的是ICxI,不会影响UI(Update interrupt)

    4.2 Output Channel4触发ADC采集

    1. 选择Trigger EVent Selection为:Output compare(OC4REF),这里用的PWM的ICxI 中断

    2. 选择TIM1的Channel4为 PWM generation no Output

    3. 设置Trigger EVent Selection为 Output compare(OC4REF)

    4. 这里由CCR的值,即pulse触发中断,与ARR值,即period无关

    5. 如果pulse=1,则计数Counter刚开始马上触发中断,刚好在PWM Channel N的低电平中心点
    6. 如果pulse=ARR值-1,则计数Counter快到ARR值(3500)时才触发中断,刚好在PWM Channel N的高电平中心点
    7. 设置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中心对齐模式区别

    两者的主要区别:

    1. 上溢、下溢触发的时间点不同
    2. TIM中心对齐:上溢发生在计数器从ARR-1到ARR时,下溢发生在1到0时
    3. PWM中心对齐:上溢发生在计数器从CCR-1到CCR时,下溢发生在从CCR+1到CCR时
    4. 上溢、下溢触发的中断事件不同
    5. TIM中心对齐:上溢、下溢触发UI (Update interrupt)
    6. 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)
  • 作者:BobBobBao

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 PWM 计数器模式及对齐方式详解

    发表回复