YTM32使用eTMR定时器产生1Hz低频率PWM信号
需求
客户使用YTM32B1LE05
微控制器(下文简称LE05)开发车载ECU,本机作为传感器设备,需要通过输出1Hz
的PWM
信号,告知主机当前设备的采样值。这个PWM
信号的占空比可调,精度0.1%
,表示输出0 - 1000
范围内的采样数据。
软件模拟PWM
可用软件模拟,使用1ms周期的定时器中断:
- 用一个变量对定时器中断进行计数,
- 用一个常量作为周期计数器,
- 再用一个变量作为占空比控制量的计数器,
- 到了占空比事件和周期事件时,控制GPIO输出合适的电平即可。
对于48MHz主频的CPU,没有更多实时任务的场景中,以1ms周期的产生中断事件产生的系统负载是可以接受的。
- 如果考虑为了防止被别的中断打断而影响输出信号的准确度:如果中断延迟发生在非事件点,则对控制GPIO完全没有影响;如果中断延迟发生在事件点,对控制GPIO的时间偏差最大为1ms。这在应用层面上是可以接受的。
- 如果考虑为了防止打断别的中断服务而影响别的实时任务的时效性:定时器中断服务里仅仅对软件变量进行递增、判断,并在事件点控制GPIO输出电平而已,任务量极轻。
- 作为参考,一些RTOS的时间片中断的周期也有用5ms或者10ms的的,其中还运行了比较繁重的调度器任务,包括操作任务的上下文切换等等。
但是,但是,但是,客户还是考虑尽量用硬件实现这个1Hz的功能,进一步减轻CPU的负载。(话说不影响性能的情况下,软件实现的可移植性不是更好么?)。好吧,大略一想,还是有机会实现的。
需求分析 - why not?
LE05的eTMR定时器外设模块可用于产生高速和高精度的PWM信号,但不能直接输出频率低至1Hz的PWM。
阅读LE05的手册可知,eTMR定时器的时钟源被绑定到高速总线时钟(FAST_BUS_CLK),并且没有分频可选,如图x所示。
此处的FAST_BUS_CLK
时钟源为48MHz,即为eTMR的计数器时钟。eTMR内部分频配置寄存器eTMR_CTRL[CLKPRS]
只有7位,对应最大分频可以达到128。如图x