AVR单片机定时计数器1实验四.docx
《AVR单片机定时计数器1实验四.docx》由会员分享,可在线阅读,更多相关《AVR单片机定时计数器1实验四.docx(21页珍藏版)》请在冰豆网上搜索。
AVR单片机定时计数器1实验四
AVR学习笔记四、定时/记数器1实验
-------基于LT_Mini_M16
4.1定时/计数器1的计数实验
4.1.1实例功能
ATmega16的T/C1是一个16位的多功能定时计数器,其主要特点有:
●真正的16位设计,允许16位的PWM。
●2个独立的输出比较匹配单元。
●双缓冲输出比较寄存器。
●一个输入捕捉单元。
●输入捕捉躁声抑制。
●比较匹配时清零计数器(自动重装特性,AutoReload)。
●可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。
●周期可调的PWM波形输出。
●频率发生器。
●外部事件计数器。
●带10位的时钟预分频器。
●4个独立的中断源(TOV1、OCF1A、OCF1B、ICF1)。
在前面的实例中,我们已经学习了AVR单片机的定时/计数器0,本实例和下一个我们学习定时/计数器1,从上面的介绍我们可以看出,ATmega16单片机的定时/计数器1功能更为强大,值得我们深入学习。
定时/计数器的基本功能都是定时、计数等,掌握了一个定时/计数器的用法就能很容易的掌握其他定时/计数器的用法,所以我们不在学习定时/计数器1的定时、计数等基本功能。
在接下来的两个实例中,我们将学习定时/计数器1的增强功能。
在本实例中,我们利用ATmega16单片机的定时/计数器1的输入捕捉功能实现对按键时间的捕捉,并检测两次按键之间的时间间隔,然后通过LED指示实例运行效果。
本实例共有3个功能模块,分别描述如下:
●单片机系统:
使用定时/计数器1的输入捕捉功能检测按键的按下,并判断两次按键按下的时间间隔,然后通过LED灯的亮灭指示按键按下次数。
●外围电路:
按键检测电路以及显示运行结果的LED显示电路。
●软件程序:
熟悉掌握ATmega16单片机的定时/计数器1的输入捕捉中断程序的编写。
3.1.2、器件和原理
本实例首先介绍ATmega16单片机的定时/计数器1的输入捕捉功能,然后详细介绍如何利用定时/计数器1实现对外部事件进行输入捕捉。
最后通过一个程序来实现这一功能。
1、ATmega16单片机的定时/计数器1的增强功能介绍
与8位定时/计数器T/C0、T/C2相比,T/C1的功能增强主要表现在以下几个方面。
1.16位的计数器
由于T/C1是16位的计数器,因此它的计数宽度、计时长度大大增加,配合一个独立的10位预定比例分频器,计时精度也更加精确,这是其它的8位单片机所做不到的。
需要注意的是,AVR的内部有许多16位的寄存器,这些寄存器都是由两个8位的寄存器组成的。
如16位的寄存器TCNT1实际由2个8位寄存器TCNT1H、TCNT1L组成的。
在使用汇编语言对这些16位寄存器的读写操作时需要遵循特定的步骤。
●16位寄存器的读操作
同步读取16位寄存器中的数据,应先读取该寄存器的低位字节,再立即读取其高位字节。
●16位寄存器的写入操作
同步写16位寄存器时,应先写入该寄存器的高位字节,再立即写入它的低位字节。
此外,在对16位寄存器操作时,最好将中断响应屏蔽,防止在主程序读写16位寄存器的两条指令之间插入一个含有对该寄存器操作的中断服务。
如果这种情况发生,那么中断返回后,寄存器中的内容已经改变,会造成主程序中对16位寄存器的读写失误。
采用C等高级语言编写程序则可以直接对16位的寄存器进行操作,因为这些高级语言的编译系统会根据16位寄存器的操作步骤生成正确的执行代码。
因此我们学习的时候可以不必关心这些。
3.更加强大和完善的PWM功能
T/C1配备了2个比较匹配输出单元OC1A、OC1B和比较匹配寄存器OCR1A、OCR1B。
同时它的PWM模式,有多种不同的计数器上限(TOP)值可供选择,因此T/C1的PWM功能具备以下特点:
●可产生频率、相位均可调整的PWM波。
T/C1有15种工作模式,除了常规的计数、CTC模式外,还可以产生频率可调、相位可调、频率相位均可调的多种形式的PWM波。
其中频率可调的PWM波利用8位定时计数器是不能实现的。
T/C1的频率调整范围可以达到16位的精度,它是通过改变计数器的上限值实现的。
●可同时产生2路不同占空比的PWM波
由于T/C1配备了2个比较匹配输出单元OC1A、OC1B和比较匹配寄存器OCR1A、OCR1B,因此使用一个计数器就可以得到相同频率,不同占空比的2路PWM输出。
2路PWM波的占空比的确定和调整分别由寄存器OCR1A、OCR1B确定,分别在OC1A、OC1B上输出。
4.输入捕捉功能
T/C1的输入捕捉功能是AVR定时计数器的另一个非常有特点的功能。
T/C1的输入捕捉单元可应用于精确捕捉一个外部事件的发生,记录事件发生的时间印记(Time-stamp)。
捕捉外部事件发生的触发信号由引脚ICP1输入,或模拟比较器的AC0单元的输出信号也可作为外部事件捕获的触发信号。
当一个输入捕捉事件发生,如外部引脚ICP1上的逻辑电平变化时,或者模拟比较器输出电平变化(事件发生)时,此时T/C1的计数器TCNT1中的计数值被写入输入捕捉寄存器ICR1中,并置位输入捕获标志位ICF1,并产生中断申请。
输入捕捉功能可用于频率和周期的精确测量。
置位标志位ICNC将使能对输入捕捉触发信号的噪声抑制功能。
噪声抑制电路是一个数字滤波器,它对输入触发信号进行4次采样,当4次采样值相等才确认此触发信号。
因此使能输入捕捉触发信号的噪声抑制功能可以对输入的触发信号的噪声实现抑制,但确认触发信号比真实的触发信号延时了4个系统时钟周期。
噪声抑制功能是通过寄存器TCCR1B中的输入捕捉噪声抑制位(ICNC)来使能。
如果使能了输入噪声抑制功能,捕捉输入信号的变化到ICR1寄存器的更新延迟四个时钟周期。
噪声抑制功能使用的系统时钟,与预分频器无关。
输入捕捉信号触发方式的选择由寄存器TCCR1B中的第6位ICES1决定。
当ICES1设置为“0”时,输入信号的下降沿将触发输入捕捉动作;当ICES1为“1”时,输入信号的上升沿将触发输入捕捉动作。
一旦一个输入捕捉信号的逻辑电平变化触发了输入捕捉动作时,T/C1计数器TCNT1中的计数值被写入输入捕获寄存器ICR1中,并置位输入捕获标志位ICF1,申请中断处理。
寄存器ICR1由两个8位寄存器ICR1H、ICR1L组成,当T/C1工作在输入捕捉模式时,一旦外部引脚ICP1或模拟比较器有输入捕捉触发信号产生,计数器的TCNT1中的计数值写入寄存器ICR1中。
T/C1工作在其它模式时,如PWM模式,ICR1的设定值可作为计数器计数上限(TOP)值。
此时ICP1引脚与计数器脱离,将禁止输入捕获功能。
输入捕捉事件发生后产生的中断申请标志ICF1,以及相应的中断屏蔽控制位TICIE1可以在定时计数器中断标志寄存器TIFR和定时器中断屏蔽寄存器TIMSK中找到。
2、定时/计数器1的寄存器
定时/计数器1有这些寄存器:
●计数器寄存器TCNT1、输出比较寄存器OCR1A、OCR1B和输入捕捉寄存器ICR1,这几个寄存器都是16位的寄存器。
●定时计数器中断标志寄存器TIFR。
●定时器中断屏蔽寄存器TIMSK。
●T/C1控制寄存器TCCR1A、TCCR1B,为2个8位寄存器。
3、T/C1的输入捕捉功能描述
T/C1的输入捕捉功能可以应用于精确捕捉一个外部事件的发生,记录事件发生的时间印记(Time-stamp)。
当一个输入捕捉事件发生,如外部引脚ICP1上的逻辑电平变化时,T/C1计数器TCNT1中的计数值被实时的写入到输入捕捉寄存器ICR1中,并置位输入捕获标志位ICF1,产生中断申请。
因此,利用输入捕捉功能可以实现对周期的精确测量。
采用输入捕捉功能进行精确周期测量的基本原理比较简单,实际上就是将被测信号作为ICP1的输入,被测信号的上升(下降)沿作为输入捕捉的触发信号。
T/C1工作在常规计数器方式,对设定的已知系统时钟脉冲进行计数。
在计数器正常工作过程中,一旦ICP1上的输入信号由高变低(假定下降沿触发输入捕捉事件)时,TCNT1的计数值被同步复制到了寄存器ICR1中。
换句话将,当每一次ICP1输入信号由高变低时,TCNT1的计数值都会再次同步复制到ICR1中。
如果能及时的将两次连续的ICR1中数据记录下来,那么2次ICR1的差值乘上已知的计数器计数脉冲的周期就是输入信号一个周期的时间。
由于在整个过程中,计数器的计数工作没有受到任何影响,捕捉事件发生的时间印记也是由硬件自动同步复制到ICR1中的,因此所得到的周期值是非常精确的。
4、T/C1实现输入捕捉功能的寄存器设置
T/C1的寄存器在不同工作方式下的设置是不同的,将不同设置放在一起介绍会很复杂,同时也容易引起混乱,在这里我们将这些设置分开来,在某一特定功能中,只介绍与本功能有关的寄存器以及相应设置,另外在用C语言进行单片机内部寄存器设置时,一般可以不考虑寄存器的地址,所以在这里我们把有关寄存器内容的介绍简化。
(1)T/C1计数寄存器—TCNT1
位
7
6
5
4
3
2
1
0
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
TCNT1是T/C1的计数值寄存器,该寄存器可以直接被MCU读写访问。
写TCNT1寄存器将在下一个定时器时钟周期中阻塞比较匹配。
因此,在计数器运行期间修改TCNT1的内容,有可能将丢失一次TCNT1与OCR1的匹配比较操作。
(2)定时计数器中断屏蔽寄存器—TIMSK
位
7
6
5
4
3
2
1
0
TICIE1
读/写
R/W
初始化值
0
0
0
0
0
0
0
0
●Bit5–TICIE1:
T/C1输入捕捉中断使能
当该位被设为"1”,且状态寄存器中的I位被设为"1”时,T/C1的输入捕捉中断使能。
一旦TIFR的ICF1置位,CPU即开始执行T/C1输入捕捉中断服务程序
(3)定时计数器中断标志寄存器—TIFR
位
7
6
5
4
3
2
1
0
ICF1
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
●Bit5–ICF1:
T/C1输入捕捉标志位
外部引脚ICP1出现捕捉事件时ICF1置位。
此外,当ICR1作为计数器的TOP值时,一旦计数器值达到TOP,ICF1也置位。
执行输入捕捉中断服务程序时ICF1自动清零。
也可以对其写入逻辑"1”来清除该标志位。
(4)T/C1控制寄存器—TCCR1B
位
7
6
5
4
3
2
1
0
$33($0053)
ICNC1
ICES1
WGM13
WGM12
CS12
CS11
CS10
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
8位寄存器TCCR1B是T/C1的控制寄存器,它用于选择计数器的计数源,工作模式和比较输出的方式等。
●Bit7–ICNC1:
入捕捉噪声抑制器
置位ICNC1将使能输入捕捉噪声抑制功能。
此时外部引脚ICP1的输入被滤波。
其作用
是从ICP1引脚连续进行4次采样。
如果4个采样值都相等,那么信号送入边沿检测器。
因此使能该功能使得输入捕捉被延迟了4个时钟周期。
●Bit6–ICES1:
输入捕捉触发沿选择
该位选择使用ICP1上的哪个边沿触发捕获事件。
ICES为"0”选择的是下降沿触发输入捕捉;ICES1为"1”选择的是逻辑电平的上升沿触发输入捕捉。
按照ICES1的设置捕获到一个事件后,计数器的数值被复制到ICR1寄存器。
捕获事件还
会置为ICF1。
如果此时中断使能,输入捕捉事件即被触发。
当ICR1用作TOP值(见TCCR1A与TCCR1B寄存器中WGM13:
0位的描述)时,ICP1与输入捕捉功能脱开,从而输入捕捉功能被禁用。
•Bit4:
3–WGM13:
2:
波形发生模式
见TCCR1A寄存器中的描述。
•Bit2:
0–CS12:
0:
时钟选择
这3位用于选择T/C的时钟源,见表4.1.1。
在本实例中我们使用预分频器1024分频,即CS0[2:
0]=5.
表3.1.2T/C0的时钟源选择
CS02
CS01
CS00
说明
0
0
0
无时钟源(停止T/C0)
0
0
1
clkT0S(不经过分频器)
0
1
0
clkT0S/8(来自预分频器)
0
1
1
clkT0S/64(来自预分频器)
1
0
0
clkT0S/256(来自预分频器)
1
0
1
clkT0S/1024(来自预分频器)
1
1
0
外部T0脚,下降沿驱动
1
1
1
外部T0脚,上升沿驱动
(5)T/C1控制寄存器—TCCR1A
位
7
6
5
4
3
2
1
0
$33($0053)
COM1A1
COM1A0
COM1B1
COM1B0
FOC1A
FOC1B
WGM11
WGM10
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
8位寄存器TCCR1AB是T/C1的控制寄存器,它用于选择计数器的比较输出模式,工作模式等,在本实例中暂时用不到,可以不必理会。
3.1.3、电路
本实例的电路包含按键检测电路和LED亮灭控制电路。
按键检测电路和LED亮灭控制电路在前面的实例中已经做过介绍,在此不再给出电路图,请参阅前面相关实例。
1、电路原理
在本实例中利用按键K3产生外部输入捕捉信号,单片机根据按键状态控制PB0口上连接的LED的亮灭,并通过控制PB7口上连接的LED的亮灭指示两次按键按下的间隔时间。
2、电路连接
按键K3连接单片机的PD6口,PD6口正是定时/计数器1的输入捕捉端口,从而我们就可以正常捕捉外部输入事件。
单片机的PB0、PB7口连接两个LED。
3.1.4、程序设计
1、程序功能
程序的功能是使用定时/计数器1的输入捕捉功能检测外部按键的按下,并计算两次按键按下的时间间隔。
当按键按下后,记录一次外部输入事件,并控制PB0口连接的LED的亮灭翻转一次,当按键再次按下后,计算两次按键按下的时间间隔,如果间隔大于2S,则控制PB7口连接的LED的亮灭翻转一次。
●单片机定时计数器1输入捕捉中断的编程
在本例中,使用单片机的定时/计数器1的外部事件输入捕捉端口PD6(ICP1)检测外部输入事件,每出现一次电平的下降沿变化,定时计数器1(TCNT1)的计数值加1,并送到输入捕捉寄存器ICR1。
所以在程序中需要对相应的寄存器进行设置,并且编写中断服务程序。
关于中断函数的编写,可以参考WINAVR(GCC)的库函数手册里面的中断库函数介绍里面找到使用例子。
本实例用到的是定时/计数器1的输入捕捉中断,对应中断向量名称为:
TIMER1_CAPT_vect,
则中断服务函数应写为:
ISR(TIMER1_CAPT_vect)
{
…
}
●控制LED的显示
在中断服务程序中,当按键K3按下一次,LED1的状态翻转一次(由亮到灭或由灭到亮),如果两次按键按下的时间间隔大于2S,则LED1的状态翻转一次(由亮到灭或由灭到亮)。
2、主要变量和函数说明
本例中需要编写中断函数,函数的功能是:
当有外部发生一次下降沿信号时,定时计数器1(TCNT1)的计数值加1,并送到输入捕捉寄存器ICR1,LED1的状态翻转一次。
然后判断两次按键按下的时间间隔是否大于2S,如果大于2S,则LED7的状态翻转一次(由亮到灭或由灭到亮)。
3、使用WINAVR开发环境,makefile文件同前面的例子,直接复制到本实例程序的文件夹中即可。
4、程序代码
#include
#include
#include//中断函数头文件
intmain(void)
{
PORTB=0X00;//
DDRB=0Xff;//LED灯接口,设为输出
PORTD=0X40;//使能PD6的内部上拉电阻,平时该口为高电平
DDRD=0Xbf;//PD6(ICP1)口为定时/计数器1的输入捕捉口,设为输入口
TCCR1B|=(1<//时钟1024分频,下降沿捕捉
TIMSK|=(1<sei();//使能全局中断
while
(1)
{
}
}
//定时/计数器1的输入捕捉中断服务程序,输入捕捉端口有下降沿电平,则触发中断
ISR(TIMER1_CAPT_vect)
{
TCNT1=0;//清零计数寄存器,下一次仍从0开始计数
PORTB^=(1<if(ICR1>2000)//判断两次按键间隔时间大于2S吗
{
ICR1=0;//如果大于2S,清零输入捕捉寄存器
PORTB^=(1<}
}
3.2定时/计数器1的快速PWM实验
3.2.1、实例功能
在上一个实例中,我们已经了解了定时/计数器1的主要功能。
并且学习了其中的一个增强功能:
外部事件输入捕捉功能。
在本实例中,我们讲学习定时/计数器1的另一个增强功能:
双通道比较匹配功能。
在快速PWM模式下,利用双通道比较匹配功能在PD4(OC1A),PD5(OC1B)两个端口上同时实现两个LED的渐明渐暗效果。
本实例共有3个功能模块,分别描述如下:
●单片机系统:
使用定时/计数器的8位快速PWM模式,实现两路LED的渐明渐暗变化。
●外围电路:
LED显示控制电路。
●软件程序:
熟悉掌握ATmega16单片机的定时/计数器1的8位快速PWM功能程序的编写。
3.2.2、器件和原理
本实例首先介绍ATmega16单片机的定时/计数器1的双通道输出比较匹配功能,然后详细介绍如何利用定时/计数器1的8位快速PWM功能在两个端口上获得不同占空比的脉冲。
最后通过一个程序来实现这一功能。
1、ATmega16单片机的定时/计数器1的双通道比较匹配功能介绍
T/C1配备了2个比较匹配输出单元OC1A、OC1B和比较匹配寄存器OCR1A、OCR1B。
同时
它的PWM模式,有多种不同的计数器上限(TOP)值可供选择,
由于T/C1配备了2个比较匹配输出单元OC1A、OC1B和比较匹配寄存器OCR1A、OCR1B,因此使用一个计数器就可以得到相同频率,不同占空比的2路PWM输出。
2路PWM波的占空比的确定和调整分别由寄存器OCR1A、OCR1B确定,分别在OC1A、OC1B上输出。
2、T/C1实现输入捕捉功能的寄存器设置
T/C1的寄存器在不同工作方式下的设置是不同的,将不同设置放在一起介绍会很复杂,同时也容易引起混乱,在这里我们将这些设置分开来,在某一特定功能中,只介绍与本功能有关的寄存器以及相应设置,另外在用C语言进行单片机内部寄存器设置时,一般可以不考虑寄存器的地址,所以在这里我们把有关寄存器内容的介绍简化。
(1)T/C1计数寄存器—TCNT1
位
7
6
5
4
3
2
1
0
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
TCNT1是T/C1的计数值寄存器,该寄存器可以直接被MCU读写访问。
写TCNT1寄存器将在下一个定时器时钟周期中阻塞比较匹配。
因此,在计数器运行期间修改TCNT1的内容,有可能将丢失一次TCNT1与OCR1的匹配比较操作。
(2)定时计数器中断屏蔽寄存器—TIMSK
位
7
6
5
4
3
2
1
0
TICIE1
OCIE1A
OCIE1B
TOIE1
读/写
R/W
初始化值
0
0
0
0
0
0
0
0
●Bit5–TICIE1:
T/C1输入捕捉中断使能
当该位被设为"1”,且状态寄存器中的I位被设为"1”时,T/C1的输入捕捉中断使能。
一旦TIFR的ICF1置位,CPU即开始执行T/C1输入捕捉中断服务程序,在本例中我们可以不必设置输入捕捉中断使能。
●Bit4–OCIE1A:
输出比较A匹配中断使能
当该位被设为"1”,且状态寄存器中的I位被设为"1”时,T/C1的输出比较A匹配中断使能。
一旦TIFR上的OCF1A置位,CPU即开始执行T/C1输出比较A匹配中断服务程序。
●Bit3–OCIE1B:
T/C1输出比较B匹配中断使能
当该位被设为"1”,且状态寄存器中的I位被设为"1”时,使能T/C1的输出比较B匹配中断使能。
一旦TIFR上的OCF1B置位,CPU即开始执行T/C1输出比较B匹配中断服务程序。
●Bit2–TOIE1:
T/C1溢出中断使能
当该位被设为"1”,且状态寄存器中的I位被设为”1”时,T/C1的溢出中断使能。
一旦TIFR上的TOV1置位,CPU即开始执行T/C1溢出中断服务程序。
在本例中我们没有使用任何中断,所以该寄存器可以不必进行设置。
(3)定时计数器中断标志寄存器—TIFR
位
7
6
5
4
3
2
1
0
ICF1
OCF1A
OCF1B
TOV1
读/写
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
初始化值
0
0
0
0
0
0
0
0
该寄存器用于保存相应中断产生时的中断标志位,如果使用中断服务程序,则在进入中断服务程序后,硬件将会自动将相应中断标志位清零。
如果使用软件查询的方法代替中断服务程序,则需要在软件中将相应标志位清零
(4)T/C1控制寄存器—TCCR1B
位
7
6
5
4
3
2
1
0
$33($0053)
WGM13
WGM12
CS12
CS11
CS10
读/写
R/W
R/W
R