T/C0的内部是由计数器单元和输出比较单元两部分构成,其结构图如下:
结构图
工作模式:
1、普通模式(定时器模式)。普通模式是最简单的工作模式。在此模式下,计数器TCNT0的值不停的累加,计数到最大值0XFF后,在下一个时钟来时产生计数溢出,计数值返回0X00并重新开始计数。当计数器TCNT0的值为0X00时,T/C0溢出标志位TOV0置位。如果T/C0举出中断得到使能,单片机会执行相应的中断程序,中断程序执行后,TOV0标志会硬件清0,在普通模式下,可以随时软件定入寄存器TCNT0。
2、CTC模式(比较匹配时清0定时器模式)。在此模式下,输出比较寄存器OCR0用于保存匹配值,计数器TCNT0的值持续增加,当TCNT0的值等于OCR0时,二者产生匹配,随后计数器TCNT0自动清0,中断标志OCF0置位,如果此中断得到使能,即可执行相应的中断服务程序。
如果引脚OC0的数据方向设定为输出,引脚上将产生电平变化,具体方式由控制寄存器TCCR0的COM01:COM00位设定,为了使OC0输出正确的波形,通常的做法是将引脚电平变化的方式设定为比较匹配时电平取反,这时其产生的波形频率可由下式计算:
输出频率=系统时钟/[2*N*(1+OCR0值)]
在上式中,N为预分频因子,其值为1,8,64,256或1024。
3、快速PWM模式。快速PWM模式是基于单斜坡操作的,这有助于产生更高频率的PWM波形。在此模式下,计数器人BOTTOM开始计数到MAX,然后立即返回到BOTTOM重新开始计数。
快速PWM时序图
快速PWM模式下的输出频率可由下式计算:
PWM频率=系统时钟频率/(N*256)
在上面公式中,N为预分频因子,其值为1、8、64、256或1024。另外,在快速PWM模式下,通过将OC0设定为比较匹配时电平取反,可以得到占空比为50%的PWM信号。
4、相位修正PWM模式。相位修正PWM模式是基于双斜坡操作的。在此模式下,计数器TCNT0正向的从BOTTOM计数到MAX,然后再从MAX倒退计数到BOTTOM,其时序图如下:
时序图
与快速PWM模式的单斜坡操作相比,双斜坡的相位修正PWM所获得的最大频率比快速PWM要小,但其波形对称性很好,非常适合电机的控制。相位修正PWM方式输出的频率可由下式计算:
PWM频率=系统时钟频率/(N*510)
相关寄存器说明:
1、TCCR0寄存器。该寄存器是T/C0的控制寄存器,包含了多少T/C0的工作模式和比较匹配单元输出模式控制位。
BIT 7 FOC0:强制输出比较控制位。该位置1时将强制OC0引脚进入比较匹配状态,具体工作方式由COM01:COM00位设定。强制输出比较匹配状态不会引发中断,并且只有在非PWM模式下有效,在PWM模式下,不可将该位置1。
BIT 6/3 WGM01:WGM00:波形发生模式设定位,用于设定T/C0的工作状态,如下表:
T/C0波形产生模式
BIT 5/4 COM01:COM00:OC0引脚比较匹配输出模式设定位。
比较匹配输出模式
BIT 2/0 CS02:CS00:T/C0时钟选择位,用于选择T/C0的时钟源或设定预分频比。
T/C0时钟选择
2、TCNT0寄存器。该寄存器是T/C0的数据寄存器,用于保存定时或计数数据,TCNT0寄存器可以随时读写。
数据寄存器
3、OCR0寄存器。该寄存器是T/C0的输出比较器,用于保存匹配值,当其值与TCNT0的计数值产生匹配时,将产生输出比较中断,并且可以改变OC0引脚的电平状态。
目标数据寄存器
4、TIMSK寄存器。该寄存器是T/C(定时/计数器)的中断屏蔽寄存器,该寄存器包含了多个中断控制位。
中断屏蔽寄存器
BIT 7-2 :不作介绍。
BIT 1 :OCIE0:T/C0输出比较匹配中断使用位。该位置1时,T/C0输出比较匹配OCF0中断使能。
BIT 0:TOIE0:T/C0溢出中断使用能。该位置1时,T/C0溢出TOV0中断使能。
5、TIFR寄存器。该寄存器是T/C(定时/计数)的中断标志寄存器,该寄存器包含了多个中断标志位。
中断标志寄存器
BIT 7-2:不作介绍。
BIT 1 OCF0:T/C0输出比较匹配标志位。当TCNT0与OCR0匹配时该位置1。当此中断服务程序被执行后,该位自动清0。另外软件对该位写1会清0此标志位。
BIT 0 TOV0:T/C0溢出标志位。T/C0溢出时该标志位置1,当此中断程序被执行后,该位自动清0。软件对该位写1会清0此标志位。
T/C0的预分频器:
预分频器结构图
1、SFIOR寄存器。该寄存器是特殊功能IO寄存器,包含了多个AD转换、模拟比较器等功能位。
BIT 7-1:与T/C0无关,暂不介绍。
BIT 0 PSR10:T/C0与T/C1的预分频器复位控制位。该位置1时T/C0和T/C1的预分频器复位,操作完成后该位硬件自动清0。
由于T/C0和T/C1共用一个分频器,因此当预分频器复位后,对这两个定时器都会有影响,这一特性也可以用于同步两个定时器的运行。
编程实例:
普通模式定时执行显示程序