第8章 定时计数器的结构与应用.docx
《第8章 定时计数器的结构与应用.docx》由会员分享,可在线阅读,更多相关《第8章 定时计数器的结构与应用.docx(47页珍藏版)》请在冰豆网上搜索。
第8章定时计数器的结构与应用
第8章定时计数器的结构与应用
定时计数器(Timer/Counter)是单片机中最基本的接口之一,它的用途非常广泛,常用于计数、延时、测量周期、频率、脉宽、提供定时脉冲信号等。
在实际应用中,对于转速,位移、速度、流量等物理量的测量,通常也是由传感器转换成脉冲电信号,通过使用定时计数器来测量其周期或频率,再经过计算处理获得。
相对于一般8位单片机而言,AVR不仅配备了更多的定时计数器接口,而且还是增强型的,如通过定时计数器与比较匹配寄存器相互配合,生成占空比可变的方波信号,即脉冲宽度调制输出PWM信号,用于D/A、马达无级调速控制、变频控制等,功能非常强大。
ATmega16一共配置了2个8位和1个16位,共3个定时计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时计数器T/C1。
本章将着重对AVR的8位定时计数器的结构、功能和应用进行讲解,并介绍基本的使用设计方法。
8.1定时计数器的结构
在单片机内部,一般都会集成由专门硬件电路构成的可编程定时计数器。
定时计数器最基本的功能就是对脉冲信号“自动”进行计数。
这里所谓的“自动”,指计数的过程是由硬件完成的,不需要MCU的干预。
但MCU可以通过指令设置定时计数器的工作方式,以及根据定时计数器的计数值或工作状态做必要的处理和响应。
学习和使用定时计数器时,必须注意以下的基本要素:
✓定时计数器的长度。
定时计数器的长度是指计数单元的位长度,一般为8位(一个字节)或16位(2个字节)。
✓脉冲信号源。
脉冲信号源是指输入到定时计数器的计数脉冲信号。
通常用于定时计数器计数的脉冲信号可以由外部输入引脚提供,也可以由单片机内部提供。
✓计数器类型。
计数器类型是指计数器的计数运行方式,可分为加一(减一)计数器,单程计数或双向计数等。
✓计数器的上下限。
计数器的上下限指计数单元的最小值和最大值。
一般情况下,计数器的下限值为零,上限值为计数单元的最大计数值,即255(8位)或65535(16位)。
需要注意的是,当计数器工作在不同模式下时,计数器的上限值并不都是计数单元的最大计数值255或65535,它将取决于用户的配置和设定。
✓计数器的事件。
计数器的事件指计数器处于某种状态时的输出信号,该信号通常可以向MCU申请中断。
如当计数器计数到达计数上限值255时,产生“溢出”信号,向MCU申请中断。
8.1.18位定时计数器T/C0的结构
ATmega16中有两个8位的定时计数器:
T/C0、T/C2,它们都是通用的多功能定时计数器,其主要特点是:
✓单通道计数器。
✓比较匹配时清零计数器(自动重装特性,AutoReload)。
✓可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。
✓频率发生器。
✓外部事件计数器(仅T/C0)。
✓带10位的时钟预分频器。
✓溢出和比较匹配中断源(TOV0、OCF0和TOV2、OCF2)。
✓允许使用外部引脚的32kHz手表晶振作为独立的计数时钟源(仅T/C2)。
T/C0、T/C2的主要结构和大部分的功能是相同或类似的,因此,我们先介绍T/C0的结构和应用。
1.T/C0的组成结构
图8-1为8位T/C0的硬件结构框图。
图中给出了MCU可以操作的寄存器以及相关的标志位。
在T/C0中,有两个8位的寄存器:
计数寄存器TCNT0和输出比较寄存器OCR0。
其它相关的寄存器还有T/C0的控制寄存器TCCR0,中断标志寄存器TIFR和定时器中断屏蔽寄存器TIMSK。
T/C0的计数器事件输出信号有两个,计数器计数溢出TOV0和比较匹配相等OCF0。
这两个事件的输出信号都可以申请中断,中断请求信号TOV0、OCF0可以在定时器中断标志寄存器TIFR中找到,同时在定时器中断屏蔽寄存器TIMSK中,可以找到与TOV0、OCF0对应的两个相互独立的中断屏蔽控制位TOIE0、OCIE0。
图8-18位T/C0的结构框图
(1)T/C0的时钟源
T/C0的计数时钟源可由来自外部引脚T0的信号提供,也可来自芯片的内部。
图8-2为T/C0时钟源部分的内部功能图。
●T/C0计数时钟源的选择
T/C0的时钟源的选择由T/C0的控制寄存器TCCR0中的3个标志位CS0[2:
0]确定,共有8种选择。
其中包括无时钟源(停止计数),外部引脚T0的上升沿或下降沿,以及内部系统时钟经过一个10位预定比例分频器分频的5种频率的时钟信号(1/1、1/8、1/64、1/256、1/1024)。
T/C0与T/C1共享一个预定比例分频器,但它们时钟源的选择是独立的。
●使用系统内部时钟源
当定时计数器使用系统内部时钟作为计数源时,通常作为定时器和波形发生器使用。
因为系统时钟的频率是已知的,这样通过计数器的计数值就可以知道时间值。
AVR在定时计数器和内部系统时钟之间增加了一个预定比例分频器,分频器对系统时钟信号进行不同比例的分频,分频后的时钟信号提供定时计数器使用。
利用预定比例分频器,定时计数器可以从内部系统时钟获得几种不同频率的计数脉冲信号,使用非常灵活。
图8-2T/C0的时钟源与10位预定比例分频器
●使用外部时钟源
当定时计数器使用外部时钟作为计数源时,通常作为计数器使用,用于记录外部脉冲的个数。
图8-3为外部时钟源的检测采样逻辑功能图。
图8-3T/C0外部时钟检测采样逻辑功能图
外部引脚T0(PB0)上的脉冲信号可以作为C/T0的计数时钟源。
PB0引脚内部有一个同步采样电路(Synchronization),它在每个系统时钟周期都对T0引脚上的电平进行同步采样,然后将同步采样信号送到边沿检测器(EdgeDetector)中。
同步采样电路在系统时钟的上升沿将引脚信号电平打入寄存器,因此当系统的时钟频率大大高于外部引脚上电平变化的频率时,同步采样寄存器可以看作是透明的。
边沿检测电路对同步采样的输出信号进行边沿检测,当检测到一个正跳变(CS0[2:
0]=7)或负跳变(CS0[2:
0]=8)时产生一个计数脉冲CLKT0。
由于引脚内部的同步采样和边沿检测电路的存在,引脚电平的变化需要经过2.5~3.5个系统时钟后才能在边沿检测的输出端上反映出来。
因此,要使外部时钟源能正确的被引脚的检测采样,外部时钟源的最高频率不能大于 fclk_I/O/2.5,脉冲宽度也要大于一个系统时钟周期。
另外,外部时钟源是不进入预定比例分频器进行分频的。
(2)T/C0的计数单元
T/C0的计数单元是一个可编程的8位双向计数器,图8-4是它的逻辑功能图,图中符号所代表的意义如下:
●计数(count)TCNT0加1或减1。
●方向(direction)加或减的控制。
●清除(clear)清零TCNT0。
●计数时钟(clkT0)C/T0时钟源
●顶部值(TOP)表示TCNT0计数值到达上边界。
●底部值(BOTTOM)表示TCNT0计数值到达下边界(零)。
图8-4T/C0计数单元逻辑功能图
T/C0根据计数器的工作模式,在每一个clkT0时钟到来时,计数器进行加1、减1或清零操作。
clkT0的来源由标志位CS0[2:
0]设定。
当CS0[2:
0]=0时,计数器停止计数(无计数时钟源)。
T/C0的计数值保存在8位的寄存器TCNT0中,MCU可以在任何时间访问(读/写)TCNT0。
MCU写入TCNT0的值将立即覆盖其中原有的内容,同时也会影响到计数器的运行。
计数器的计数序列取决于寄存器TCCR0中标志位WGM0[1:
0]的设置。
WGM0[1:
0]的设置直接影响到计数器的计数方式和OC0的输出,同时也影响和涉及T/C0的溢出标志位TOV0的置位。
标志位TOV0可以用于产生中断申请。
(3)比较匹配单元
图8-5T/C0比较匹配单元逻辑功能图
图8-5为T/C0的比较匹配单元逻辑功能图。
在T/C0运行期间,比较匹配单元一直将寄存器TCNT0的计数值同寄存器OCR0的内容进行比较(硬件进行自动比较处理)。
一旦两者相等,在下一个计数时钟脉冲到达时置位OCF0标志位。
标志位OCF0也可以用于产生中断申请。
根据WGM0[1:
0]和COM0[1:
0]的不同设置,可以控制比较匹配单元产生和输出不同类型的脉冲波形。
寄存器OCR0实际上配置有一个辅助缓存器。
当T/C0工作在非PWM模式下时,该辅助缓存器处于被禁止使用状态,此时MCU直接访问和操作寄存器OCR0。
当T/C0工作在PWM模式时,该辅助缓存器投入使用,这时MCU对OCR0的访问操作,实际上是对OCR0的辅助缓存器操作。
一旦计数器TCNT0的计数值达到设定的最大值(TOP)或最小值(BOTTOM)时,辅助缓存器中的内容将同步更新比较寄存器OCR0的值。
这将有效防止产生奇边非对称的PWM脉冲信号,使输出的PWM波中没有杂散脉冲。
●强制输出比较
在非PWM波形发生模式下,写1到强制输出比较位(FOC0)时,将强制比较器产生一个比较匹配输出信号。
强制比较输出信号不会置OCF0标志位或重新装载/清零计数器,但是会像真的发生了比较匹配事件一样更新OC0输出引脚输出。
●通过写TCNT0寄存器屏蔽比较匹配事件
任何MCU对TCNT0寄存器的写操作都会屏蔽在下一个定时器时钟周期中的发生的比较匹配事件,即使在定时器暂停时。
这一特性使OCR0可以被初始化为与TCNT0相同的值,而不会在定时计数器被使能时触发中断。
●使用输出比较单元
由于在任何工作模式下,写TCNT0寄存器都会使得输出比较匹配事件被屏蔽一个定时器时钟周期,因此可能会影响比较匹配输出的正确性。
例如,写入一个与OCR0相同的值到TCNT0时,将丢失一次比较匹配事件,从而引起发生不正确的波形。
同样,当定时器是向下计数时,不要将下边界的值写入TCNT0。
外部引脚OC0的设置必须在设置该端口引脚(PB3)为输出之前。
设置OC0的值最简单的方法是在通常模式下使用FOC0来设置,这是因为在改变工作模式时,OC0寄存器将保持其原来的值。
需要注意的是,COM0[1:
0]是无缓冲的,改变COM0[1:
0]位的设置,会立即影响T/C0的工作方式。
(4)比较匹配输出单元
标志位COM0[1:
0]有两个作用:
定义OC0的输出状态,以及控制外部引脚OC0是否输出OC0寄存器的值。
图8-6为比较匹配输出单元的逻辑图。
图8-6T/C0比较匹配输出单元逻辑图
当标志位COM0[1:
0]中任何一位为“1”时,波形发生器的输出OC0取代引脚PB3原来的I/O功能,但引脚的方向寄存器DDRB3仍然控制OC0引脚的输入/输出方向。
如果要在外部引脚PB3上输出OC0的逻辑电平,应设定DDRB3定义该引脚为输出脚。
采用这种结构,用户可以先初始化OC0的状态,然后再允许其由引脚PB3输出。
(5)比较输出模式和波形发生器
T/C0有四种工作模式,根据COM0[1:
0]的不同设定,波形发生器将产生各种不同的脉冲波形,如PWM波形的产生和输出。
但只要COM0[1:
0]=0,波形发生器对OC0寄存器没有任何作用。
2.与8位T/C0相关的寄存器
(1)T/C0计数寄存器—TCNT0
位
7
6
5
4
3
2
1
0
$32($0052)
TCNT0
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
TCNT0是T/C0的计数值寄存器,该寄存器可以直接被MCU读写访问。
写TCNT0寄存器将在下一个定时器时钟周期中阻塞比较匹配。
因此,在计数器运行期间修改TCNT0的内容,有可能将丢失一次TCNT0与OCR0的匹配比较操作。
(2)输出比较