AVR单片机定时器计数器一
AVR单片机定时器TC0定时操作过程
定时器T/C0定时功能实现过程一、中断总使能:SREG=0X80;二、使能定时器溢出中断,TIMSK的TOIE0置1三、选择定时器时钟分频系数,由TCCR0的CS01,CS01,CS00决定。
四、定时器计数器付初始值,TCNT0=61,TCNT0位8位寄存器,计数范围为0-255,付初始值61后,从61开始计数到255时产生溢出中断付初值后定时就开始工作。
定时时间计算:每个计数时钟脉冲的时间T=1/f,f=晶振频率/分频系数,如晶振为8MHZ ,分频系数为1024,则定时器器时钟频率为f=8000000HZ/1024 =7812.5HZ,单个时钟脉冲时间:T=1/f=1/7812.5=0.128ms (毫秒),T/C0最大的计数值为256,最大计时时间为256*0.128ms=32.768ms 。
定时器初值计算公式:定时器初值=256- 定时时间/单个时钟脉冲时间:如定时25ms,初值=256- 25ms/0.128ms=256-195=61注:1MHZ=1000KHZ=1000000HZ,1s(秒)=1000ms(毫秒)/***************************************************************************************函数功能:定时器T/C0实现1秒钟定时,控制发光二极管周期性亮灭,晶振8MHZ***************************************************************************************/#include <iom16v.h>char Counter = 0; // 1S计数变量清零,变量声明/********端口初始化********/void port_init() //端口初始化子函数{PORTA=0xFF; //PA口配置为输出DDRA=0xFF; //PA口初始值为"1"}/********定时器0初始化********/void timer0_init() //因为定时时间太短,看不到灯的变化{SREG = 0x80; //使能全局中断TIMSK|=(1<<TOIE0); //使能T0溢出中断TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00); // T/C0工作于普通模式,1024分频,//定时器频率= 8M/1024 =7812.5HzTCNT0 = 61; //定时初值设置,定时时间=(256-61)/7812.5=25ms}/********主函数********/void main(){port_init();timer0_init();while(1);}/********定时器0中断服务函数********/#pragma interrupt_handler timer0_ovf:10void timer0_ovf(void){TCNT0 =61; //重装计数初值if(++Counter >= 40) //定时时间到1S吗?定时中断溢出40次为1S,25ms*40=1000ms=1s(秒) {PORTA^=BIT(0); //,将PA口的第0位取反操作。
AVR§9.4(定时计数器1与2)11年
out spl,r16
ldi r16,high(ramend) out sph,r16
18主Βιβλιοθήκη 序堆栈的初始化定义PC0为输出
允许T1比较匹配中断 TCNT1=0 OCR1A=$7A12 256分频T/C1,CTC1=1 CPU开中断 等待中断
ldi r16,$01 ;PC0口定义 out ddrc,r16;为输出口 ldi r16,$10 ;允许T1比较 out timsk,r16;匹配A中断 clr r16 ;置TCNT1初值为0 out tcnt1l,r16 out tcnt1h,r16 ldi r16,$7a ;ocr1a置$7a12, out ocr1ah,r16;即1秒中断一次 ldi r16,$12 out ocr1al,r16 ldi r16,$0c ;T/C1对主 out tccr1b,r16;频256分频定时 sei here: rjmp here
• 可读可写 ; 初值=00。
9
T/C1数据类I/O寄存器的读写
1、数据类寄存器都是16位,每一个都由两个I/O寄存器组 成,要保证其读/写的同步性。 2、正确的读写次序(高8位有暂存器) 写时:先高后低; 读时:先低后高。 例1:将$1234 TCNT1 •ldi r16, $34 •ldi r17, $12 •Out TCNT1H, r17 •Out TCNT1L, r16 例2、 输入捕获寄存器 ICR1 R19:R18
2
§9.4.2 T/C1的特殊功能
一、输出比较匹配; 二、输入捕获; 三、PWM等特殊功能。
3
一、 T/C1的输出比较匹配
含义:T/C1在计数的过程中,其计数值与输出比较寄存器的 值相等时发生比较匹配。 TCNT1 T/C1时钟源 相等吗 OCR1A = 触发输出比较匹 配事件A
输入捕捉
/********以下是延时函数********/
void Delay_ms(uint xms)
{
int i,j;
for(i=0;i<xms;i++)
{ for(j=0;j<1140;j++) ; }
}
/********以下是端口初始化函数********/
void port_init()
6. avr定时器/计数器1 --TC1 --输入捕捉模式(捕获外部事件模式)
T/C的输入捕捉单元可用来捕获外部事件,并为其赋予时间标记以说明此时间的发生时刻。外部事件发生的触发信号由引脚ICP1 (PD6)输入,也可通过模拟比较器单元来实现。时间标记可用来计算频率、占空比及信号的其它特征,以及为事件创建日志。当引脚ICP1上的逻辑电平(事件)发生了变化,或模拟比较器输出ACO电平发生了变化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发:16位的TCNT1数据被拷贝到输入捕捉寄存器ICR1,同时输入捕捉标志位ICF1置位。如果此时ICIE1 = 1,输入捕捉标志将产生输入捕捉中断。中断执行时ICF1自动清零,或者也可通过软件在其对应的I/O位置写入逻辑"1”清零。读取ICR1时要先读低字节ICR1L,然后再读高字节ICR1H。读低字节时,高字节被复制到高字节临时寄存器TEMP。CPU读取ICR1H时将访问TEMP寄存器。
操作步骤:
一、捕获输入端口初始化:捕获输入端ICP1(PD6)设为输入,DDRD&=(0<<PD6);
并使能PD6口的内部上拉电阻,PORTD|=(1<<PD6);
二、设置定时器的工作模式:TCCR1A=0X00 //普通模式,计数最大值为65535
AVR单片机定时器计数器一
单片机的定时器/计数器实质就是一个加1计数器,通过软件对其控制寄存器的操作,来实现定时,计数功能及转换。
当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。
当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,当电平变化时,计数器加1.定时器/计数器使用灵活,用途广泛,如延时,物理信号的测量,信号的周期,频率,脉宽测量,产生定时脉冲信号,捕捉输入,还可以实现PWM输出,用于D/A ,电动机的无极调速等。
ATmega16 三个定时器/计数器T/C0,T/C1,T/C2,其中T/C0,T/C2为8位定时器/计数器,T/C1是16位定时器/计数器。
定时器/计数器相关寄存器:TIMSK:定时计数中断屏蔽寄存器,TIFR:定时计数器中断标志寄存器,ASSR:异步状态寄存器,SFIOR:特殊功能寄存器T/C0相关寄存器:TCCR0 :控制寄存器,TCNT0:计数寄存器,OCR0:输出比较寄存器T/C1相关寄存器: TCCR1A,TCCR1B:控制寄存器,TCNT1(TCNT1H,TCNT1L)计数寄存器,OCR1A,OCR1B:输出比较寄存器,ICR1:输入捕捉寄存器T/C2相关寄存器:TCCR2:控制寄存器, TCNT2:计数寄存器,OCR2:输出比较寄存器,溢出中断:以定时器/计数器T/C0为例,T/C0为8位定时器,计数范围为十六进制0x00-0xFF,对应的十进制为0-255,由0开始计数,当计数值超过255时就产生一个中断,中断标准寄存器TIFR的TOV0(T/C0的溢出标准位)置1。
比较中断:当T/C0的计数寄存器TCNT0的数值,和预置的OCR0的数值一致时,将产生一个比较中断,中断标志寄存器TIFR的OCF0(T/C0的比较中断标志位)置1。
T/C0溢出中断使能过程:1、中断总使能:SREG=0x80;2、T/C0的溢出中断使能:将中断使能寄存器的T/C0溢出中断使能位TOIE0置1,c语言:TIMSK|=0x01;当产生溢出中断时,硬件自动将中断标志寄存器TIFR的TOVO(T/C0溢出中断标志)位置1,用于软件查询判断,执行完中断处理程序后,由硬件自动清0。
AVR128定时器计数器1详细解读,附详细程序注释,初学者一看就懂的程序哦
1:如何设置A VR单片机的时钟?答:可以通过设置熔丝位来确定A VR单片机工作时的时钟是来自外部晶振还是来自内部的振荡器。
熔丝位设置:芯片有如下几种通过熔丝位选择的时钟源。
时钟输入到AVR 时钟发生器,并通往其他合适的模块。
Table 6.时钟源选择芯片时钟选项CKSEL3..0(1)外部晶体/ 陶瓷振荡器1111 - 1010外部低频晶体1001外部RC 振荡器1000 - 0101标定的内部RC 振荡器0100 - 0001外部时钟0000 2.如何操作定时器计数器1,让其工作在定时状态?答:(1)通过设置寄存器TCCR1A,和寄存器TCCR1B中的相应位来给定时器选择分频系数。
(2)向数据寄存器TCNT1H,TCNT1L装初值。
(3)设置定时器/ 计数器中断屏蔽寄存器TIMSK中的第二位TOIE1=1;(4)打开总中断,置SREG中的第4位为‘1’,打开总中断,这里只需使SREG|=0X80即可;(5)在中断函数中重装初值。
3.中断函数格式:#pragma interrupt_handler函数名():中断向量序号void 函数名(){重装初值;其它程序代码.}4.如何计算计数初始值?答:举例说明:若我们设置定时器工作的分频为M分频,时钟频率为fclk,则单片机产生一次中断的时间为t=fclk/m.则若设置定时T则要记的数N为:N=T/t;定时器1 (16位定时器)寄存器TCCR1B = 0x04 设定256预分频要利用定时器定时1秒1,4000000 / 256 = 15625 说明定时器每当1/15625 秒就会触发一次中断2,65535 - 15625 = 49910 //1s/(产生一次中断的时间)计算出要累加多少次才能在1秒后出发定时器1的溢出中断3,49910 <==> C2 F6 将计算后的值换算成16进制4,TCNT1H = 0xC2 ; 对寄存器赋初值TCNT1L = 0xF6 ;。
AVR学习笔记四、定时计数器1实验
A VR学习笔记四、定时/记数器1实验-------基于LT_Mini_M164.1 定时/计数器1的计数实验4.1.1 实例功能ATmega16的T/C1是一个16位的多功能定时计数器,其主要特点有:●真正的16位设计,允许16位的PWM。
● 2个独立的输出比较匹配单元。
●双缓冲输出比较寄存器。
●一个输入捕捉单元。
●输入捕捉躁声抑制。
●比较匹配时清零计数器(自动重装特性,Auto Reload)。
●可产生无输出抖动(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实现对外部事件进行输入捕捉。
第七讲AVR定时器计数器
捕获标10志ICF
S3
中断请求2
溢出标志TF
S2
中断请求1
计数器的工作原 理与前述相同
2.ATmega16定时/计数器资源
T/C的预分频器 8位定时/计数器T/C0、T/C2 T/C2的异步操作 PWM模式下的T/C0、T/C2(下节课
内容) 16位定时/计数器T/C1 PWM模式下的T/C1(下节课内容)
内部时钟源
S0用于选择内 部/外部时钟源
计数器 初值
S2
溢出标志TF
中断请求
定时器的工作原理与计数器相同,只 是要求用于计数的脉冲,其频率恒定。
单片机的定时器用户是可以控制(可 编程)的。
事件捕获原理
捕获事件 S0
捕获0x寄8存8 器
闸门电路
S1
计数时钟源
计0x数8器0123456789ABCEF
0xFF
输出引脚OC0(PB3)的行为方式。这是I/O的第二功能, 1
0
0 1 1 1 PW1M,相0 位可调 比clk较I/O匹/6配4(0发x来F生F自时分清频零器O)C0 0xFF
0x00
相应的方向控制位要置“1”,以便将其配置为输出。 2
1
1 0 01
0CTC1模式 c比lk较I/O匹/25配6O(发C来生R0自时分置频位器OC)0 立即
T/C0控制寄存器 —— TCCR0
76 5 4 3 2 1 0
FOC0 WGM00 COM01 COM00 WGM01 M位被置为非PWM模 式下有效。
位6、位3:计C数S02器CC计SO0M1 数01CS模C00O式M00,用T(/TC非于/0C比P0W时较控M钟输模选制出式择模)T式/C0的计数和工
AVR单片机技术 定时器计数器中断应用教案
定时器/计数器中断应用
教案
教学目标知识目标:定时器/计数器中断应用;
能力目标:掌握AVR单片机定时器/计数器中断编程方法。
教学内容AVR单片机定时器/计数器中断应用
重点、难点定时器/计数器中断设置步骤;
定时器定时计算方法;
计数器计数值设定方法;
主程序和中断服务程序之间的关系;
教学方法趣味案例激励法;课堂讨论;归纳总结
教学组织案例引入:如果我们要设计一个时钟,如何实现?
问题引导:采用延时函数可以实现计时功能么?为什么?
知识展开:采用延时函数可以实现计时功能么?有什么问题?
课堂练习:如何利用定时器实现计时功能?
分析总结:定时器实现计时功能和利用延时函数实现计时功能有何利弊?尽量详细分析。
问题讨论AVRmega16有几个定时器?有什么不同?课后任务资料检索:计数器可以用来完成什么功能?教师备忘。
AVR单片机16位定时器TC1实例
8MHZ/1024=8000000HZ/1024=7812.5HZ,每个计数脉冲的周期时间为1/7812.5=0.128ms,计时200ms的计数器值为:65635-200ms/0.128ms=63972=0xF9E4,则TCNT1H付初值为0xF9,TCNT1L付初值为0xE4.//函数功能:实现PA口的led亮0.1S,灭0.9S
#include
#define uchar unsigned char
/********以下是端口初始化函数********/
void port_init()
{
DDRA= 0xFF;//PA设置为输出口
PORTA = 0xFF;//PA输出高电平
}
/********定时器1初始化********/
TCNT1H = 0xCF;//计数器置初值
TCNT1L = 0x2C;
TCCR1A |= 0x00;//普通端口模式
AVR单片机16位定时器TC1实例
第一篇:AVR单片机16位定时器TC1实例
T/C1是16位定时器/计数器,它的计数器由两个8位寄存器TCNT1H,TCNT1L构成,TCNT1H是高8位寄存器,TCNT1L是低8位寄存器。最大计算值为2的16次幂,十六进制是0xFFFF=65535.例如:定时200ms,晶振8MHZ,分频系数1024,计数时钟频率为
AVR单片机定时计数器TC0图解教程
Output Compare Flag 输出比较匹配中断标志,转向中断向量执行中断服 务时硬件自动清零
输出比较寄存器 0 Output Compare Register OCR0
00 PB3 不与 OC0 相连, 作普通 IO 用 TCNT0=OCR0 TCNT0=TOP 01 保留 10 OC0/PB3 11 TCNT0=OCR0 TCNT0=TOP
=
输出比较寄存器 0 Output Compare Register OCR0
00 PB3 不与 OC0 相连, 作普通 IO 用 TCNT0=OCR0 TCNT0=TOP 01 保留 10 OC0/PB3 11 TCNT0=OCR0 TCNT0=TOP
SREG(Status Register) 状态寄存器 初 R/W TCCR0(T/C0 Control Register) T/C0 控制寄存器 初值 R/W Bit 0 RW FOC0 0 RW WGM01 0 RW COM01 0 RW COM00 0 RW WGM00 0 RW CS02 0 RW CS01 0 RW CS00 初值 R/W Bit TIMSK(Timer Interrupt Mask Register) 定时计数器中断屏蔽寄存器 0 RW OCIE2 0 RW TOIE2 0 RW TICIE1 0 RW OCIE1A 0 RW OCIE1B 0 RW TOIE1 0 RW OCIE0 0 RW TOIE0 Bit I T H S V N Z C 0 0 0 0 0 0 0 0
Output Compare Flag 输出比较匹配中断标志,转向中断向量执行中断服 务时硬件自动清零
定时/计数器 Timer0/Counter0 Register TCNT0
AVR单片机定时器使用总结TC0
A VR单片机定时器使用总结T0一、普通模式:普通模式(WGM01:0 = 0) 为最简单的工作模式。
在此模式下计数器不停地累加。
计到8比特的最大值后(TOP = 0xFF),由于数值溢出计数器简单地返回到最小值0x00 重新开始。
在TCNT0 为零的同一个定时器时钟里T/C 溢出标志TOV0 置位。
此时TOV0 有点象第9 位,只是只能置位,不会清零。
但由于定时器中断服务程序能够自动清零TOV0,因此可以通过软件提高定时器的分辨率。
在普通模式下没有什么需要特殊考虑的,用户可以随时写入新的计数器数值。
输出比较单元可以用来产生中断。
但是不推荐在普通模式下利用输出比较来产生波形,因为这会占用太多的CPU 时间。
TCCR0:`该模式一般用来定时中断。
使用步骤:1、计算确定TCNT0初值;2、设工作方式,置初值;3、开中断;二、CTC( 比较匹配时清零定时器)模式在CTC 模式(WGM01:0 = 2) 下OCR0 寄存器用于调节计数器的分辨率。
当计数器的数值TCNT0等于OCR0时计数器清零。
OCR0定义了计数TOP值,亦即计数器的分辨率。
这个模式使得用户可以很容易地控制比较匹配输出的频率,也简化了外部事件计数的操作。
CTC模式的时序图为Figure 31。
计数器数值TCNT0一直累加到TCNT0与OCR0匹配,然后TCNT0 清零。
利用OCF0 标志可以在计数器数值达到TOP 时产生中断。
在中断服务程序里可以更新TOP的数值。
由于CTC模式没有双缓冲功能,在计数器以无预分频器或很低的预分频器工作的时候将TOP 更改为接近BOTTOM 的数值时要小心。
如果写入的OCR0 数值小于当前TCNT0 的数值,计数器将丢失一次比较匹配。
在下一次比较匹配发生之前,计数器不得不先计数到最大值0xFF,然后再从0x00 开始计数到OCF0。
为了在CTC 模式下得到波形输出,可以设置OC0 在每次比较匹配发生时改变逻辑电平。
AVR单片机定时计数器的结构与应用探素
位0——TOV0(Overflow) T/C0溢出中断标志。当T/C0 产 生溢出时,该位自动置1,向CPU提出溢出中断请求,该中 断得以处理后,该位硬件自动清0,用户也可对其写1清0
位1——OCF0 T/C0 输出比较匹配中断标志。当T/C0比 较匹配成功,OCF0置1,向CPU提出比较匹配中断请求, 该中断得以处理后,该位硬件自动清0,用户也可对其写1 清0
引入
• 先回顾学习51单片机时,定时器的中断 如何产生的?
第8章 定时/计数器实例解析
• 本章重点: • 1.了解AVR定时/计数器的特点 • 2.学会对定时/计数器的相关寄存器进行配置 • 3. 掌握AVR定时/计数器的工作模式 • 本章难点: • 掌握定时/计数器的PWM模式,T/C1的输入
捕捉功能
PORTB|=(1<<PB0); // PB0配置为 ,PB0 上拉电阻
}
/********定时器0初始化函数********/
void timer0_init()
{
SREG = 0x80; //使能全局中断
TIMSK|=(1<<TOIE0); //使能T0溢出中断
TCCR0|=
; //T/C0工作于普通模式,上升沿触发
实例解析1—T/C0计数实验
使用T/C0进行计数,T0(PB0)为外部计数输入端,每计一 次,PA口所接的八个LED灯状态改变一次。
设计思路:设置TCNT1的初值为0XFF,当有外部计数信 号输入时,计数值加1,产生溢出中断,进入T/C0溢出中断函 数,在溢出中断函数中,使PA口取反,LED灯状态改变一次。
定时计数器的应用
avr单片机实现日历时间差计算
avr单片机实现日历时间差计算要实现日历时间差的计算,您可以使用avr单片机的定时器功能来记录起始时间和结束时间,然后通过计算得出时间差。
以下是一个简单的示例代码,可以在avr单片机上实现日历时间差的计算:```c#include <avr/io.h>#include <avr/interrupt.h>volatile uint32_t start_time, end_time;// 定时器初始化函数void timer_init() {// 使用CTC模式,计数器清零时产生比较中断TCCR1B |= (1 << WGM12);// 设置预分频系数为256TCCR1B |= (1 << CS12);// 设置比较值为62500,产生1秒的定时中断OCR1A = 62500;// 开启比较A中断TIMSK1 |= (1 << OCIE1A);// 开启全局中断sei();}// 比较A中断服务函数ISR(TIMER1_COMPA_vect) {// 递增时间戳start_time++;}// 获取当前时间戳uint32_t get_current_time() {uint32_t current_time;// 关闭定时器中断cli();// 获取当前时间戳current_time = start_time;// 开启定时器中断sei();return current_time;}int main() {// 初始化定时器timer_init();// 设置起始时间start_time = 0;// 假设延时一段时间后,获取结束时间_delay_ms(5000);end_time = get_current_time();// 计算时间差uint32_t time_diff = end_time - start_time;// 将时间差转换为日、时、分、秒等形式uint32_t days = time_diff / 86400;uint32_t hours = (time_diff % 86400) / 3600;uint32_t minutes = (time_diff % 3600) / 60;uint32_t seconds = time_diff % 60;// 输出时间差// TODO: 根据实际情况选择输出方式,如串口、LCD等while (1) {// 程序主循环}return 0;}```上述代码中,使用avr单片机的定时器1来计时,每1秒产生一次比较中断。
AVR定时计数器1的控制寄存器说明
AVR定时计数器1的控制寄存器说明16位的T/C 可以实现精确的程序定时( 事件管理) 、波形产生和信号测量。
其主要特点如下●真正的16位设计( 即允许16位的PWM)● 2 个独立的输出比较单元●双缓冲的输出比较寄存器●一个输入捕捉单元●输入捕捉噪声抑制器●比较匹配发生时清除寄存器( 自动重载)●无干扰脉冲,相位正确的PWM●可变的PWM 周期●频率发生器●外部事件计数器● 4 个独立的中断源(TOV1 、OCF1A 、OCF1B与ICF1)1.T/C1 控制寄存器-TCCR1A、TCCR1BBit 7:6 –COM1A1:0: 通道A 的比较输出模式Bit 5:4 –COM1B1:0: 通道B 的比较输出模式COM1A1:0 与COM1B1:0 分别控制OC1A 与OC1B 状态。
如果COM1A1:0 (COM1B1:0 )的一位或两位被写入"1”,OC1A( OC1B) 输出功能将取代I/O 端口功能。
此时OC1A(OC1B)相应的输出引脚数据方向控制必须置位以使能输出驱动器。
OC1A(OC1B) 与物理引脚相连时,COM1x1:0 的功能由WGM13:0的设置决定。
下表给出当WGM13:0设置为普通模式与CTC模式( 非PWM) 时COM1x1:0 的功能定义。
比较输出模式,非PWMWGM13:0设置为快速PWM 模式时COM1x1:0 的功能定义。
比较输出模式,快速PWM比较输出模式,相位修正及相频修正PWM 模式Bit 3 –FOC1A: 通道A 强制输出比较Bit 2 –FOC1B: 通道B 强制输出比较FOC1A/FOC1B 只有当WGM13:0指定为非PWM模式时被激活。
为与未来器件兼容,工作在PWM 模式下对TCCR1A写入时,这两位必须清零。
当FOC1A/FOC1B 位置1 ,立即强制波形产生单元进行比较匹配。
COM1x1:0 的设置改变OC1A/OC1B 的输出。
AVR单片机定时-计数器的PWM功能设计
AVR单⽚机定时-计数器的PWM功能设计#includevoid main(void){TCCR0A=0b10000001; //升序⽐较匹配时OC0A=0,降序时⽐较匹配时置OC0A=1,TOP固定等于255TCCR0B=0b00000101; //时钟=1024分频,⼀旦设定时钟,TCNT0就开始不断的计数OCR0A =123; //⽐较设定值,数字越⼤,PD6输出1的占空⽐越⼤DDRD.6=1; //端⼝⽅向设置为输出才有效while (1);}#includevoid main(void){TCCR0A=0b10000011; //⽐较匹配时OC0A=0,计数到⽐较值时OC0A=1,TOP固定等于255TCCR0B=0b00000101; //时钟=1024分频OCR0A =123; //⽐较设定值,数字越⼤,PD6输出1的占空⽐越⼤DDRD.6=1; //端⼝⽅向设置为输出才有效while (1);}名词解释:TOP计数器(TCNT0)由0开始不断的作+1计数,计数到最⼤值时,计数器⼜返回到0开始作+1计数(单斜率),如此循环;计数器(TCNT0)由0开始不断的作+1计数,计数到最⼤值时就开始作-1计数,计数到0时⼜开始不断的作+1计数(双斜率),如此循环;这个最⼤值就是TOP(TOP可以为固定值255,也可以是OCR0A的值)由于TCNT0 是⼀个计数器,⼀旦时钟设定,它就会不断的计数(倒数),这样TCNT0 和OCR0A(OCR0B)就会有相等的时候,相等时就是⽐较匹配。
上⾯的2个例⼦中,由于TOP是固定的255,所以要调节PWM频率只能通过调节时钟分频来实现。
可以看出来,如果上⾯的2个例⼦中TOP相同、时钟相同,那么快速PWM的频率⽐相位修正PWM的频率⾼⼀倍,⽽占空⽐的分辩率却刚好相反。
下⾯的例⼦是⼀个“真正的快速PWM”,它除了改变T/C时钟可以改变PWM的频率以外,还可以改变TOP的值(OCR0A)的值来改变PWM的频率,但是它只能是由OC0B输出,不能由OC0A输出,因为这时寄存器OCR0A的值就是TOP的值(计数最⾼值)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机的定时器/计数器实质就是一个加1计数器,通过软件对其控制寄存器的操作,来实现定时,计数功能及转换。
当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。
当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,当电平变化时,计数器加1.定时器/计数器使用灵活,用途广泛,如延时,物理信号的测量,信号的周期,频率,脉宽测量,产生定时脉冲信号,捕捉输入,还可以实现PWM输出,用于D/A ,电动机的无极调速等。
ATmega16 三个定时器/计数器T/C0,T/C1,T/C2,其中T/C0,T/C2为8位定时器/计数器,T/C1是16位定时器/计数器。
定时器/计数器相关寄存器:TIMSK:定时计数中断屏蔽寄存器,TIFR:定时计数器中断标志寄存器,ASSR:异步状态寄存器,
SFIOR:特殊功能寄存器
T/C0相关寄存器:TCCR0 :控制寄存器,TCNT0:计数寄存器,OCR0:输出比较寄存器
T/C1相关寄存器: TCCR1A,TCCR1B:控制寄存器,TCNT1(TCNT1H,TCNT1L)计数寄存器,
OCR1A,OCR1B:输出比较寄存器,
ICR1:输入捕捉寄存器
T/C2相关寄存器:TCCR2:控制寄存器, TCNT2:计数寄存器,OCR2:输出比较寄存器,
溢出中断:以定时器/计数器T/C0为例,T/C0为8位定时器,计数范围为十六进制0x00-0xFF,对应的十进制为0-255,由0开始计数,
当计数值超过255时就产生一个中断,中断标准寄存器TIFR的TOV0(T/C0的溢出标准位)置1。
比较中断:当T/C0的计数寄存器TCNT0的数值,和预置的OCR0的数值一致时,将产生一个比较中断,中断标志寄存器TIFR的
OCF0(T/C0的比较中断标志位)置1。
T/C0溢出中断使能过程:
1、中断总使能:SREG=0x80;
2、T/C0的溢出中断使能:将中断使能寄存器的T/C0溢出中断使能位TOIE0置1,c语言:TIMSK|=0x01;当产生溢出中断时,硬件自动将中断标志寄存器TIFR的TOVO(T/C0溢出中断标志)位置1,用于软件查询判断,执行完中断处理程序后,由硬件自动清0。
普通模式:普通模式(WGM01:0 = 0) 为最简单的工作模式。
在此模式下计数器不停地累加。
计到8 比特的最大值后(TOP = 0xFF),
由于数值溢出,计数器简单地返回到最小值0x00 重新开始
CTC(比较匹配时清0定时器):在CTC 模式(WGM01:0 = 2) 下OCR0 寄存器用于调节计数器的分辨率。
当计数器的数值TCNT0等于
OCR0时计数器清零。
OCR0定义了计数器的TOP值,亦即计数器的分辨率。
快速PWM :快速PWM 模式(WGM01:0 = 3) 可用来产生高频的PWM 波形。
快速PWM 模式与其他PWM模式的不同之处是其单斜坡
工作方式。
计数器从BOTTOM计到MAX,然后立即回到BOTTOM重新开始
相位修正PWM :相位修正PWM 模式(WGM01:0 = 1) 为用户提供了一个获得高精度相位修正PWM 波形的方法。
此模式基于双斜坡
操作。
计时器重复地从BOTTOM 计到MAX,然后又从MAX倒退回到BOTTOM。
定时器/计数器的工作必须指定时钟源,无时钟源定时器不能工作。
时钟源有内部时钟源和外部时钟源,由CS02,CS01,CS00位选择。
外部时钟源由T0引脚输入。
OC0为T/C0的输出引脚,即设置当TNCT0和OCR0数值相等时,外部输出引脚OC0上的电平变化。
TCNT0-计数寄存器:通过它寄存器可以直接对计数器的8 位数据进行读写访问。
OCR0-输出比较寄存器 :包含一个8 位的数据,不间断地与计数器数值TCNT0 进行比较。
匹配事件可以用来产生输出比较中断,
或者用来在OC0 引脚上产生波形。
小企鹅diy科学探究学习网
更多相关文章转到: /wqb_lmkj/blog 文章分类下的单片机。