普通PWM输出的频率计算:假设系统时钟SYSCLK=168Mhz,APB2总线时钟84Mhz,使用TIM8,时钟为APB2的两倍,向上计数时,从0计数到ARR,向下计数时,从ARR计数到0;则频率为: f = 168M / (ARR+1)∗(PSC+1)。
ARR(自动重装载寄存器) 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
PSC是预分频值,将定时器预分频,便于计算。
先以向上计数模式为例:
htimx.Instance = TIM8;
htimx.Init.Prescaler = 0; //psc = 0
htimx.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数
htimx.Init.Period = 4200-1; //ARR = 4200 - 1
htimx.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //不分割时钟
htimx.Init.RepetitionCounter = 0; //进入中断后下次计数值到了又立即进入中断
HAL_TIM_PWM_Init(&htimx);
以上配置频率为 f = 168000000 / 4200 = 40000(Hz)
而中心对齐模式时,向上计数到ARR-1,再向下计数。
即为:一个周期内计数从0->ARR-1,然后又从ARR-1->0;来回计数了2次。注意此时计数到ARR-1,而非ARR了,所以相同的设置参数,中心对齐的PWM频率是: f = (168M / (ARR)∗(PSC+1))* 2 = 168000000/4199*2 = 80019(Hz)
如果将配置改为htimx.Init.Period = 4200,则频率为80000Hz,刚好为边沿对其模式的两倍。