16位定时器/计数器在普通模式和CTC模式下的应用
16位定时器/计数器的工作模式和输出比较引脚的行为由波形发生模式(WG Mn3:o)及比较输出模式(COMnxl:o)的控制位决定。比较输出模式对计数序列没有影响,而波形产生模式对计数序列则有影响。COMnxl:0控制PWM输出是否为反极性。非PWM模式时.C()Mnxl:0控制输出是否应该在比较匹配发生时置位、清零或电平取反。
(1)晋通模式
普通模式(WGMn3:0=0)为最简单的工作模式。在此模式下计数器不停地累加,计到最 大值后(MAX=0xFFFF)由于数值溢出计数器简单地返回到最小值0 x0000重新开始。在TCNTn为零的同一个定时器时钟里,T/C溢出标志TOVn置位。此时,TOVn有点像第l7位,只是只能置位不会清零。但由于定时器中断服务程序能够自动清零TOVn,因此可以通过软件提高定时器的分辨率。在普通模式下没有什么需要特殊考虑的,用户可以随时写入新的计数器数值.
在普通模式下输入捕捉单元很容易使用。要注意的是,外部事件的最大时间间隔不能超过计数器的分辨率;如果事件间隔太长,必须使用定时器溢出中断或预分频器来扩展输入捕捉单元的分辨率。
输出比较单元可以用来产生中断。但是不推荐在普通模式下利用输出比较来产生波形,因为会占用太多的CPU时间。
(2)CTC(比较匹配时清除定时器)模式
在CTC模式(WGMn3:0=4或12)里,0CRnA或ICRn寄存器用于调节计数器的分辨率。当计数器的数值TCNTn等于0CRnA(WGMn3:0=4)或等于ICRn(WGMn3:0=12)时,计数器清零。OCRnA或ICRn定义了计数器的TOP值,亦即计数器的分辨率。这个模式使得用户可以很容易地控制比较匹配输出的频率,也简化了外部事件计数的操作。
图2-38为CTC模式的时序图。计数器数值TCNTn一直累加到TCNTn与OCRnA或ICRn匹配,然后TCNTn清零。
利用0CFnA或ICFn标志可以在计数器数值达到TOP时产生中断。在中断服务程序里可以更薪TOP的数值。由于CTC模式没有双缓冲功能,在计数器以无预分频器或很低的预分频器工作的时候将TOP更改为接近BOTTOM的数值时要小心。如果写入的OCRnA或ICRn的数值小于当前TCNTn的数值,计数器将丢失一次比较匹配。在下一次比较匹配发生之前.计数器不得不先计数到最大值0xFFFF,然后再从0x0000开始计数到OCRnA或ICRllo在许多情况下,这一特性并非我们所希望的。替代的方法是使用快速PWM模式,该模式使用OCRnA定义TOP值(WGMn3:0—1 5),因为此时OCRnA为双缓冲。
为了在CTC模式下得到波形输出,可以设置0CnA在每次比较匹配发生时改变逻辑电平。这可以通过设置COMnAl:o=1来完成。在期望获得OCnA输出之前.首先要将其端口设置为输出(DDR-OCnA=1)。波形发生器能够产生的最大频率为ƒoc0=ƒclkI/O/2(OCRnA=0x0000).频率由如下公式确定:
之中,变量N代表预分频因子(1、8、64、256或1024).
在普通模式下,TOVn标志的位置发生在计数器从MAX变为0x0000的定时器时钟周期。
【电子街】推荐阅读: