AVR单片机定时计数器的结构与应用探素_第1页
AVR单片机定时计数器的结构与应用探素_第2页
AVR单片机定时计数器的结构与应用探素_第3页
AVR单片机定时计数器的结构与应用探素_第4页
AVR单片机定时计数器的结构与应用探素_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1AVR单片机定时计数器的结构与应用探素第8章定时/计数器实例解析本章重点:1.了解AVR定时/计数器的特点2.学会对定时/计数器的相关寄存器进行配置3.掌握AVR定时/计数器的工作模式本章难点:掌握定时/计数器的PWM模式,T/C1的输入捕捉功能第1页/共55页定时计数器的应用

定时计数器(Timer/Counter)常用于计数、延时、测量周期、频率、脉宽、波特率发生器、生成占空比可调的PWM波等。

回顾:51单片机定时器/计数器的功能?第2页/共55页使用定时计数器时,必须注意以下的基本要素素:1.定时计数器的长度。定时计数器的长度是指计数单元的位长度,一般为8位(255)或16位(65535)。2.脉冲信号源。脉冲信号源是指输入到定时计数器的计数脉冲信号。通常用于定时计数器计数的脉冲信号可以由外部输入引脚提供(计数方式),也可以由单片机内部提供(定时方式)。

第3页/共55页

ATmega16一共配置了2个8位和1个16位,共3个定时计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时计数器T/C1。第4页/共55页跟定时器相关的引脚:1.计数脉冲输入端T0,T12.比较匹配信号输出端

OC0,OC1B,OC1A,OC23,捕捉信号输入端ICP1第5页/共55页主要工作模式(以T0为例)1.普通模式时钟源来自芯片内部:定时方式。当计数器从设定的初值开始计到255,产生计数溢出中断(TOV0=1),不能自动重装。时钟源来自外部引脚T0(PB0):计数方式,当计数器从设定的初值开始计到255,产生计数溢出中断(TOV0=1)。第6页/共55页2.CTC模式(自动重载)当计数器TCNT0的数值累加到等于OCR0中的数值时(匹配),OC0引脚置位或复位或取反,并产生比较匹配中断(OCF0=1)该模式常用于得到波形输出(比如方波)T/C0的主要工作模式第7页/共55页3.快速PWM模式当计数器TCNT0的数值累加到等于OCR0中的数值时,OC0引脚置位(或复位),计数到255时,OC0复位(或置位),并产生比较溢出中断(TOV0=1)。该模式常用于产生高频的PWM波形,通过0CR0的值来控制占空比。T/C0的主要工作模式第8页/共55页4.相位修正PWM模式(双向计数器)当计数器升序计数时,若与OCR0匹配,OC0引脚置1;而在计数器降序计数时,若与OCR0匹配,OC0引脚清0。或者正好相反。T/C0的主要工作模式第9页/共55页4.相位修正PWM模式(双向计数器)当定时计数器计数到0x00时,计数溢出标志TOV0置位,即TOV0=1,此时可申请溢出中断。该模式常用于产生高精度相位修正PWM波形,通过0CR0的值来控制占空比。T/C0的主要工作模式第10页/共55页两个8位的定时计数器:T/C0、T/C2主要特点是:1.单通道计数器。2.比较匹配时清零计数器(自动重装特性,AutoReload)。3.可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。4.频率发生器。5.外部事件计数器(T/C2无)。6.带10位的时钟预分频器。7.溢出和比较匹配中断源(TOV0、OCF0和TOV2、OCF2)。允许使用外部引脚的32kHz手表晶振作为独立的计数时钟源(仅T/C2)想一想:AVR单片机与51单片机定时器有何异同?扩充了哪些功能?第11页/共55页1.T/C0的组成结构第12页/共55页T/C0相关寄存器1.T/C0的控制寄存器TCCR0(ControlRegister)2.计数寄存器TCNT0(Counter)3.输出比较寄存器OCR0(OutputCompareRegister)4.中断标志寄存器TIFR(Interruptflagregister)5.定时器中断屏蔽寄存器TIMSK(Timerinterruptmaskregister)

第13页/共55页T/C0控制寄存器(ControlRegister)

——TCCR0位2~0:T/C0的时钟选择位,用于定义T/C0的时钟源(CLOCKSELECT)。FOC0WGM01COM01COM00WGM00CS02CS01CS00CS02CS01CS00T/C0时钟选择000无时钟源,T/C0停止001clkI/O(不经过分频器)010clkI/O/8(来自分频器)011clkI/O/64(来自分频器)100clkI/O/256(来自分频器)101clkI/O/1024(来自分频器)110外部T0引脚,下降沿驱动(用于计数)111外部T0引脚,上升沿驱动(用于计数)第14页/共55页位3,6——WGM00,WGM01计数器计数模式,用于控制T/C0的计数和工作方式。FOC0WGM01COM01COM00WGM00CS02CS01CS00模式WGM01WGM00T/C0工作模式计数上限值OCR0更新TOV0置位000一般模式0xFF立即0xFF101PWM,相位可调0xFF0xFF0x00210CTC模式OCR0立即0xFF311快速PWM0xFF0xFF0xFFT/C0控制寄存器(ControlRegister)

——TCCR0第15页/共55页位5,4——COM01,COM00比较匹配输出模式,决定T/C0比较匹配发生时,输出引脚OC0(PB3)的行为方式。这是I/O的第二功能,相应的方向控制位要置“1”,以便将其配置为输出。FOC0WGM01COM01COM00WGM00CS02CS01CS00COM01COM00T/C0比较输出模式(CTC模式)00PB3为通用I/O引脚01比较匹配发生时OC0取反10比较匹配发生时清零OC011比较匹配发生时置位OC0T/C0控制寄存器(ControlRegister)

——TCCR0第16页/共55页位7——FOC0强制输出比较,该位只在WGM位被置为CTC模式下有效,对其写1后,波形发生器立即进行比较操作。FOC0WGM01COM01COM00WGM00CS02CS01CS00T/C0控制寄存器(ControlRegister)

——TCCR0第17页/共55页T/C0计数寄存器(Counter)

——TCNT076543210

LSB

MSB

只要有效脉冲输入,TCNT0就会在写入值(初值)的基础上开始计数。一旦TCNT达到0xFF,下一个计数脉冲到来时便回到0x00,并继续向上开始计数。在TCNT0回“0”的同时,溢出标志TOV0置“1”。TOV0标志置“1”可以用于申请中断,也可以作为计数器的第“9”位使用。第18页/共55页T/C0中断屏蔽寄存器——TIMSK(Timerinterruptmaskregister)

位0——TOIE0(Timeroverflowinterruptenable)T/C0溢出中断允许标志。当TOIE0设为1,且SREG中的I位被设为1,将使能T/C0溢出中断OCIE2TOIE2TICIE1OCIE1AOCIE1BTOIE1OCIE0TOIE0位1——OCIE0(OutputCompareInterruptEnable)T/C0输出比较匹配中断允许标志。当OCIE0设为1,且SREG中的I位被设为1,将使能T/C0输出比较匹配。第19页/共55页T/C0中断标志寄存器(Timerinterruptflagregister)—TIFR位0——TOV0(Overflow)T/C0溢出中断标志。当T/C0产生溢出时,该位自动置1,向CPU提出溢出中断请求,该中断得以处理后,该位硬件自动清0,用户也可对其写1清0OCF2TOV2ICF1OCF1AOCF1BTOV1OCF0TOV0位1——OCF0T/C0输出比较匹配中断标志。当T/C0比较匹配成功,OCF0置1,向CPU提出比较匹配中断请求,该中断得以处理后,该位硬件自动清0,用户也可对其写1清0第20页/共55页实例解析1—T/C0计数实验

使用T/C0进行计数,T0(PB0)为外部计数输入端,每计一次,PA口所接的八个LED灯状态改变一次。

设计思路:设置TCNT1的初值为0XFF,当有外部计数信号输入时,计数值加1,产生溢出中断,进入T/C0溢出中断函数,在溢出中断函数中,使PA口取反,LED灯状态改变一次。

注意:在T/C0溢出中断函数中,一定要重装初值。第21页/共55页实例解析1—T/C0计数实验#include<iom16v.h>/********端口初始化函数********/voidport_init(){PORTA=0xFF;

DDRA=0xFF;//PA口配置为

,PA口初始值为“”

DDRB&=(0<<PB0);

PORTB|=(1<<PB0); //PB0配置为

,PB0

上拉电阻}/********定时器0初始化函数********/voidtimer0_init(){SREG=0x80;//使能全局中断

TIMSK|=(1<<TOIE0);//使能T0溢出中断

TCCR0|=;//T/C0工作于普通模式,上升沿触发TCNT0=

; }第22页/共55页/********定时器0中断服务函数********/#pragmainterrupt_handlertimer0_ovf:10voidtimer0_ovf(void){

TCNT0=;PORTA^=(1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7);//PA输出取反,发光二极管D00~D07实现亮灭变化}/********以下是主函数********/voidmain(){port_init();timer0_init();while(1); //等待}第23页/共55页实例解析2—T/C0定时实验实现功能:使用T/C0进行1S的定时,每到1S,PA口外接的LED灯状态改变一次。设计思路:T/C0作为定时器,每到25ms中断一次,当中断次数到达40次时,控制PA口LED灯取反。本设计采用8MHZ时钟,1024分频,所以计数脉冲频率是8MHZ/1024=7812.5HZ,定时时间T=25ms

定时器初值=2n-(时钟频率/1024)*T

这里可算出定时器初值=28-(8000000/1024)*0.025=61第24页/共55页#include<iom16v.h>charCounter=0;//1S计数变量清零/********端口初始化********/voidport_init(){PORTA=0xFF;//PA口配置为输出

DDRA=0xFF;//PA口初始值为"1"}/********定时器0初始化********/voidtimer0_init()//因为定时时间太短,看不到灯的变化{SREG=0x80;//使能全局中断

TIMSK|=(1<<TOIE0);//使能T0溢出中断

TCCR0|=;

//T0工作于普通模式,1024分频

TCNT0=;}第25页/共55页/********主函数********/voidmain(){port_init();timer0_init();while(1);}/********定时器0中断服务函数********/#pragmainterrupt_handlertimer0_ovf:10voidtimer0_ovf(void){TCNT0=61;//重装计数初值Counter++

if(

)//定时中断溢出40次为1S { PORTA=~PORTA; Counter=0;//1S计时变量清零

}}第26页/共55页实例解析3—T/C0的CTC模式实验实现功能:使用T/C0进行比较匹配时清零模式(CTC),在单片机的比较匹配输出口PB3(OC0)上输出一个频率为20HZ占空比为50%的方波脉冲。同时控制PD7口的蜂鸣器每隔1S鸣叫1次。第27页/共55页设计思路:要求输出一个20HZ占空比为50%的方波,可让OC0每隔0.025s取反一次,当前晶振为8MHZ,1024分频后计数脉冲为7812.5HZ,即计数时钟为0.128ms,当计数195次,满足T=0.025s。可设OCR0=195,当比较匹配后,0C0取反一次,此时OC0可输出20HZ占空比为50%的方波。每比较匹配一次,计数变量Counter加1,当Counter为40时,定时1s到,PD7取反,蜂鸣器每隔1S鸣叫1次。实例解析3—T/C0的CTC模式实验第28页/共55页实例解析3—T/C0的CTC模式实验#include<iom16v.h>charCounter=0;//计数变量清零/********端口初始化********/voidport_init(){DDRB|=(1<<PB3); //PB3(OC0)配置为输出(为1时用或符号|)

PORTB&=(0<<PB3); //PB3输出0(为0时与符号&)DDRD|=(1<<PD7); //PD7配置为输出(为1时用或符号|)

PORTD&=(0<<PD7); //PD7输出0(为0时与符号&)}/********定时器0初始化********/voidtimer0_init(){SREG=0x80; //使能全局中断

TIMSK=(1<<OCIE0); //T/C0比较匹配中断允许

TCCR0=(1<<COM00)|(0<<COM01)|(0<<WGM00)|(1<<WGM01)|(1<<CS02)|(0<<CS01)|(1<<CS00);//T/C0工作于CTC模式,1024分频,比较匹配时,触发OC0取反

TCNT0=0;//定时初值设置,

OCR0=195;//比较匹配寄存器初值}第29页/共55页/********主函数********/voidmain(){port_init();timer0_init();while(1);}/********定时器0比较匹配中断服务函数********/#pragmainterrupt_handlertimer0_COMP:20voidtimer0_COMP(void){TCNT0=0;//定时初值设置,

OCR0=195;//比较匹配寄存器初值

if(++Counter>=40)//定时时间到1S吗?定时中断溢出40次为1S { PORTD^=(1<<PD7);//驱动蜂鸣器发声

Counter=0;//1S计时变量清零

}}

引入仿真第30页/共55页实例解析4—T/C0快速PWM实验实现功能:利用PWM模式实现LED灯的渐明渐暗。具体方法是在PB3(0C0)上外接一只LED灯,开机后LED灯最亮,然后逐渐变暗,再逐渐变亮。

第31页/共55页实例解析4—T/C0快速PWM实验利用T/C0的快速PWM模式,具体思路是:T/C0在计数过程中,内部硬件电路会将计数值TCNT0与比较寄存器0CR0中的值进行比较,当两个值匹配相等时,会使得OC0引脚置0(或置1),当计数值达到255时,OC0引脚置1(或置0),这样通过改变OCR0的值,便可以在OC0上输出不同占空比的PWM波,从而使LED显示出渐明渐暗的效果第32页/共55页实例解析4—T/C0快速PWM实验#include<iom16v.h> #defineucharunsignedchar #defineuintunsignedintunsignedintcount;/*********以下是延时函数*********/voidDelay_ms(uintxms){ inti,j; for(i=0;i<xms;i++) {for(j=0;j<1140;j++);}}第33页/共55页/********以下是端口初始化函数********/voidport_init(){DDRB|=(1<<PB3); //PB3配置为输出(为1时用或符号|)

PORTB&=(0<<PB3); //PB3输出0(为0时与符号&)}/********定时器0初始化********/voidtimer0_init(){ TCCR0=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS00)|(0<<CS01))|(0<<CS02);//T/C0工作于快速PWM模式,不分频

//比较匹配时,OC0置位,记数到0XFF时,清零OC0 OCR0=0; //比较匹配寄存器初值,

SREG=0x80;//使能全局中断}第34页/共55页/*********以下是主函数*********/voidmain(void){ port_init(); timer0_init(); while(1) {for(count=0;count<256;count++)//OCR=0时,LED最亮,然后逐渐变暗

{ OCR0=count;//比较匹配寄存器赋值

Delay_ms(20);//延时一段时间,以观察效果

} Delay_ms(3000);//LED最暗时,延时一段时间

for(count=255;count>0;count--)//OCR=255时,LED最暗,然后逐渐变亮

{ OCR0=count; Delay_ms(20); } Delay_ms(3000);//LED最亮时,延时一段时间

} }引入仿真第35页/共55页作业:设计一个125KHZ方波发生器。第36页/共55页16位定时/计数器T/C1

如同8位的定时/计数器,ATmega16的16位定时/计数器T/C1用户也是可以控制的:TCCR1A——T/C1控制寄存器A(ControlRegister)TCCR1B——T/C1控制寄存器BTCNT1——T/C1计数寄存器(16位)OCR1A——T/C1输出比较寄存器A

(OutputCompareRegister)OCR1B——T/C1输出比较寄存器B(16位)ICR1——T/C1输入捕获寄存器Inputcaptureregister

(16位)第37页/共55页T/C1的特点真正的16位设计,允许16位的PWM2个独立的输出比较匹配单元(OC1A,OC1B)双缓冲输出比较寄存器(OCR1A,OCR1B)一个输入捕捉单元(ICP1)输入捕捉噪声抑制(对输入信号进行滤波)比较匹配时清零计数器(CTC模式)可产生无输出抖动的,相位可调的PWM信号输出周期可调的PWM波形输出(计数上限可设)频率发生器外部事件计数器(T1)带10位的时钟预分频器4个独立的中断源(TOV1,OCF1A,OCF1B,ICF1)第38页/共55页跟定时器相关的引脚:1.计数脉冲输入端T0,T12.比较匹配信号输出端

OC0,OC1B,OC1A,OC23,捕捉信号输入端ICP1第39页/共55页T/C1的功能16位计数器,读操作:先读低,后读高;写操作:先写高,后写低。更加完善的PWM功能(1)产生频率可调,相位可调,频率相位均可调的PWM波(2)可同时产生2路,相同频率、不同占空比的PWM波(3)具有输入捕捉功能。第40页/共55页T/C1控制寄存器A——TCCR1A76543210

COM1B1

COM1B0

FOC1A

FOC1B

WGM11

WGM10

COM1A1

COM1A0

位7~6:T/C1比较匹配A输出模式。这两位决定了T/C1比较匹配发生时输出引脚OC1A的输出行为。位5~4:T/C1比较匹配B输出模式。这两位决定了T/C1比较匹配发生时输出引脚OC1B的输出行为。位3:强制输出比较A。位2:强制输出比较B。位1~0:波形发生模式。该两位与WGM13、WGM12(位于TCCR1B)相组合,用于控制T/C1的计数和工作方式。第41页/共55页模式WGM13WGM12WGM11WGM10T/C1工作模式计数上限值OCR1A/OCR1B更新TOV1置位00000一般模式0xFFFF立即0xFFFF100018位PWM,相位可调0x00FFTOP0x0000200109位PWM,相位可调0x01FFTOP0x00003001110位PWM,相位可调0x03FFTOP0x000040100CTCOCR1A立即0xFFFF501018位快速PWM0x00FFTOPTOP601109位快速PWM0x01FFTOPTOP7011110位快速PWM0x03FFTOPTOP81000PWM,相位、频率可调ICR10x00000x000091001PWM,相位、频率可调OCR1A0x00000x0000101010PWM,相位可调ICR1TOP0x0000111011PWM,相位可调OCR1ATOP0x0000121100CTCICR1立即0xFFFF131101保留——————141110快速PWMICR1TOPTOP151111快速PWMOCR1ATOPTOPT/C1控制寄存器B——TCCR1B76543210

——

WGM13

WGM12

CS12

CS11

CS10

ICNC1

ICES1

位7:输入捕获噪声抑制。当该位置“1”时,捕获信号要进行连续4次的采样,只有4次采样值都有效时,输入捕获标志才置位。位6:输入捕获触发方式选择。当该位置“0”时,捕获信号下降沿有效;当该位置“1”时,捕获信号上升沿有效。位4~3:波形发生模式。该两位与WGM11、WGM10(位于TCCR1A)相组合,用于控制T/C1的计数和工作方式。位2~0:T/C1时钟源选择。CS12CS11CS10T/C1时钟选择000无时钟源,T/C1停止001clkI/O(不经过分频器)010clkI/O/8(来自分频器)011clkI/O/64(来自分频器)100clkI/O/256(来自分频器)101clkI/O/1024(来自分频器)110外部T1引脚,下降沿驱动111外部T1引脚,上升沿驱动位5:保留。第42页/共55页T/C1计数寄存器——TCNT1H和TCNT1L15141312111098

MSB

LSB

76543210TCNT1H和TCNT1L组成T/C1的16位计数寄存器TCNT1,它是向上计数的计数器(加法计数器)或上/下计数的计数器(在PWM模式下)。若T/C1被置初值,则T/C1将在预置初值的基础上计数。第43页/共55页T/C1输出比较寄存器A——OCR1AH和OCR1AL15141312111098

MSB

LSB

76543210T/C1输出比较寄存器B——OCR1BH和OCR1BLOCR1AH和OCR1AL(OCR1BH和OCR1BL)组成16位输出比较寄存器OCR1A(OCR1B)。该寄存器中的16位数据用于同TCNT1寄存器中的计数值进行连续的匹配比较。一旦TCNT1的计数值与OCR1A(OCR1B)的数据匹配相等,则比较匹配发生。用软件的写操作将TCNT1与OCR1A、OCR1B设置为相等,不会引发比较匹配。比较匹配发生后,将置位相应的中断请求标志OCF1A和OCF1B。第44页/共55页T/C1输入捕获寄存器——ICR1H和ICR1L15141312111098

MSB

LSB

76543210ICR1H和ICR1L组成16位的输入捕获寄存器ICR1。按照ICES1的设定,外部输入捕获引脚ICP发生上跳变或下跳变时,计数器TCNT1中的值写入寄存器ICR1中,同时输入捕获中断标志ICF1将置“1”。第45页/共55页实例解析7—T/C1定时实验实现功能:使用T/C1的定时模式对LED灯进行亮灭控制,即控制PA口的LED灯亮0.1S,灭0.9S设计思路:定时时间为0.1S,计数初值的计算方法定时器初值=216-(8M/64)*0.1=53036=0XCF2CTCNT1H=0XCFTCNT1L=0X2C第46页/共55页#include<iom16.h>#defineucharunsignedchar /********以下是端口初始化函数********/voidport_init(){DDRA=0xFF; //PA设置为输出口

PORTA=0xFF; //PA输出高电平}/********定时器1初始化********/voidtimer1_init(){TCNT1H=0xCF;//计数器置初值

TCNT1L=0x2C;TCCR1A|=0x00; //普通端口模式

TCCR1B|=(1<<CS11)|(1<<CS10); //64分频

TIMSK&=(0<<TOIE1); //禁止T1溢出中断,本例采用查询方式,不采用中断方式}第47页/共55页/********以下是主函数********/voidmain(void){ucharcount,T1_OVR; port_init(); timer1_init(); while(1) { T1_OVR=TIFR&0x04; //读取T/C1溢出标志位

if(T1_OVR!=0x04){T1_OVR=TIFR&0x04;} //如果T/C1溢出标志不为1,说明没有溢出,则继续读取

else //否则说明有溢出

{ TIFR=0x04; //写1清除标志位第48页/共55页

TCNT1H=0xCF; //置计数初值

TCNT1L=0x2C; count++; //计数变量加1 if(count==9)PORTA=0X00; //控制PA口LED灯点亮0.1s if(count>=10){count=0;PORTA=0XFF;} //控制PA口LED灯熄灭0.9s }} } 第49页/共55页实例解析8—T/C1输入捕捉实验实现功能:使用T/C1的输入捕捉功能检测按键的按下,并判断两次按下的时间间隔,如果时间间隔超过3S,则PA口LED灯状态反转,否则,如果没有按键,则蜂鸣器每8.39S响一声,表示T/C1计数溢出。设计思路:T/C1设置为普通模式,定时器启动后开始计数,TCNT1从0开始计到溢出,如果没有捕捉输入,每隔8.39S蜂鸣器响一声(晶振为8MHZ,1024分频,则计数周期为0.128ms)。

若有捕捉输入时,即ICP1(PD6)有输入捕捉出发信号产生,则计数器TCNT1清0,当再次有捕捉输入时,若捕捉时间间隔为3S,则计数的个数为(8MHZ/1024)*3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论