动态更改计时器频率



我试图在运行时修改pwm定时器的频率,但我不知道参考手册中描述的计数器溢出是如何触发的。

在递增计数、边缘对齐模式下(参考手册第354页和第372页(,输出应为恒定宽度(恒定TIMx_CCRx(、可变频率(TIMx_ARR(的短脉冲。我希望能够调整频率比最小可归档输出频率更快。

例如。节拍时间(CK_CNT(是1ms,最大时间是1000ms,并且我希望能够每100ms更新ARR值。当新的ARR值高于当前计数器寄存器值时,计时器应继续向上计数。当新的ARR值小于当前计数器寄存器值时,计时器应创建计数器溢出并从0重新启动。为了能够每100毫秒更新一次自动重新加载寄存器,我禁用了ARR预加载(ARPE=0(。

当我将一个小于当前计数器寄存器值的值写入ARR寄存器时会发生什么?只有一个新ARR值大于第356页计数器值的例子。

计数器是否会溢出并触发计时器从0开始?我是否必须手动创建更新事件(UEV(?如果新的ARR值会更低,我是否必须检查计数器值并手动重新启动计时器?

我在参考手册中没有找到任何东西,但最终在实际硬件上测试了行为:

  • 将ARR设置为低于当前计数器值的值不会创建中断/更新事件等,计时器会继续计数
  • 手动创建更新事件会自动重新启动计数器
  • 将ARR设置为当前计数器值将创建更新事件

当将ARR值设置为高于计数器值时,我不想重新启动计数器。解决方案是在ARR值低于计数器值时创建手动更新事件。计数器在设置时达到ARR应该不会有问题,因为这会自动创建更新事件。

这似乎不出所料:

void update_arr (TIM_HandleTypeDef* htim, uint16_t arr) {
__HAL_TIM_SET_AUTORELOAD(htim, arr);
if (__HAL_TIM_GET_COUNTER(htim) >= __HAL_TIM_GET_AUTORELOAD(htim)) {
htim->Instance->EGR  |= TIM_EGR_UG;
}
}

最新更新