之前使用定时器,主要用到的就是两个功能:一个是周期性的定时,用来调用一些类似按键检测的函数;另一个就是PWM输出,输出一个指定频率、占空比可调的脉冲。偶尔会用到频率的输入检测,但是很少。
前段时间,接触到一个需求:一个定时器同时输出两种或三种频率不同的PWM波形,有的用来驱动舵机,有的用来驱动直流电机,有的用来驱动蜂鸣器。总之,不同工作模式下,会有特定频率的PWM输出。
其实,有一些方案意识的人看到这里,应该能看出这个需求比较繁琐,单纯靠软件或者单纯靠硬件是很难实现比较好的效果的,需要双方的配合。但是我接手的时候,电路硬件已经成型了,只能在当前框架下面去想办法实现。
面对这种需求,我最开始想到的是把定时器的定时周期设置的比较短,在每个定时中断里判断工作模式、周期、占空比。但这种方式需要频繁的进入中断,对CPU的性能影响是非常大的。
所以后来评估了一下,觉得可靠度比较高的方式就是使用定时器的输出比较模式。这里放一个STM8S的定时器2的特征图:
主要看红色框起来的地方:3个独立通道,可用于:输入捕获、输出比较、PWM生成。“独立通道”这里有时候会让初学者有些困扰:是不是每个通道的所有特性都是独立的?
然而并不是这样,看一下这个图:
这是该定时器的结构框图,可以看到这三个通道的时基(TIME BASE,也就是定时周期)都是由一个地方提供的,因此但凡涉及到定时或者PWM的功能,基础时间都是一样的。也就意味着,如果我们想使用PWM功能,他们的周期是一样的,而占空比可以各不相同。
那么输出比较模式和PWM模式有什么区别?什么联系?
简单来说,可以理解为PWM模式是输出比较模式的一个子集。PWM模式的功能,输出比较模式都能实现。但为了能更高效的输出(固定周期的)PWM,对输出比较模式的状态和控制做了调整,因此得到了PWM模式。
那么,输出比较模式能做什么?
简单来说,可以输出任意周期、任意占空比的PWM波形。
那么,代价是什么?
代价就是程序需要频繁的进入中断。输出比较模式要求我们要监控一个周期内高电平和低电平的时间,时间到了自动进入中断、自动翻转相应IO管脚。进入中断后,可以对下一次周期、占空比(也就是中断到来的时候进行设置)。因此,它能实现各种频率、占空比的输出,但是代价就是频繁的进入中断。
因此,如果在中断源很少、且几乎不产生冲突的情况下,是可以使用输出比较模式的。但如果中断源很多、进入中断的频率也很高,这就容易产生冲突,导致部分周期状态异常。所以,这是一个需要多方评估、权衡的问题。
说了很多,基本是原理。人懒,就不上示波器截波形了,打完收工!