Atmega16定时器


知识回顾与新课引入
在日常生产和生活中需要严格控制时间 和个数的场合有哪些? 测量频率和周期的方法有? 数字电子技术中学到的计数器的工作原 理是?

定时器/计数器原理及应用
定时与计数原理

ATmega16的定时器/计数器资源 定时器/计数器2应用举例 T/C1的应用举例 看门狗定时器

定时与计数原理
计数原理 定时原理 事件捕获原理 PWM输出原理与方法

6.1.1 定时计数器概述 在工业生产及各种 控制系统中,常常需 要实现定时报警或延 时控制、定时中断、 定时检测、定时扫描 等等,也往往需要用 计数器对外部事件进 行计数。

6.1.1 定时计数器概述
实现定时或计数主要有3种方式:
硬件定时:用RC电路或逻辑部件定时如555电路, 该方式除额外增加硬件资源外,使用起来灵活性也较 差; 软件定时:即软件自延时,即让CPU执行一个程序 段,这个程序段本身没有具体的执行目的,但由于执 行每条指令都需要时间,则重复执行一个程序段就需 要一个固定的时间。该方式简单但却占用了CPU宝贵 的时间资源,降低了CPU的利用率,例CV_AVR编译软 件中的delay_ms(X)等语句。

6.1.1 定时计数器概述
采用单片机定时/计数器定时:为了使用方便, 解决上述两种方式的弊端并增加单片机的控制功 能,把定时计数逻辑电路集成在单片机芯片中, 称之为定时计数器。

ATmegal6内部有3个通用定时器/计数器:2个 8位的定时器/计数器:T/CO、T/C2,1个16位的 定时器/计数:T/C1。3个通用定时器/计数器除 了能够实现通常的定时计数功能外,还具有捕获, 比较、脉宽调制输出(PWM)实时时钟等超强功能; 我们这一节主要介绍定时计数的基本原理及应用。

6.1.2 计数原理
所谓计数是指对外部事件进行统计。外部事件 的发生以输入有效脉冲来表示。因此计数功能的 实质,就是对外部有效脉冲进行统计。 计数器原理框图如图6-1所示。
S1 S2

计数器

溢出标志TF

初值寄存器
6-1 计数器原理图

6.1.2 计数原理
当外部发送来一个有效脉冲时,在S1 闭合的情况下,计数器会加1,即表示计 数器记录了一次外部事件。当外部脉冲 为连续的脉冲时,计数器将不断地加1, 直到计数器溢出(如8位计数器从00到FFH 就溢出)。计数器溢出时计数器自动回 “0”,同时向溢出标志TF进位,计数器 又从“0”开始继续计数。

6.1.2 计数器原理
启动计数 器工作的 开关
当S1合上,若检测 到有有效脉冲输入 时,计数器加1 中断请求 开放与禁 止开关

S1

计数器 初值寄存器

S2 溢出标志TF
当S2合上并 且TF=1时, 可向CPU请 求中断

当计数器加到 256时,溢出标 志由0变成1

默认初值为0, 可根据需要 设置初值

6.1.2 计数原理
溢出标志TF的作用有两个:一是向CPU申 请中断,二是当中断屏蔽时供CPU查询。一个 8位的计数器从0开始到发出溢出中断请求, 要记录256个脉冲。当它从初值156开始到发 出溢出中断请求,则要记录100个脉冲。所以 可在初值寄存器中设定不同的计数器初值, 来确定每中断一次记录的脉冲数。

对计数器赋初值、禁止或允许计数器工作、 屏蔽或允许计数器溢出中断等工作可以通过 编程来实现。

6.1.2 计数原理
其中的“初值寄存器”、“S1”、“S2‘’就是 为编程应用而设置的。 初值寄存器的值是每次溢出后由此值开始计数, 例如初值寄存器的值设为156,则每次溢出后都从 156开始计数,所以每计100数后就到256,产生一次 溢出。 S1闭合启动计数器工作,否则禁止计数器工作。 S2闭合允许计数器溢出中断,否则禁止溢出中 断。 在对计数器编程时,这些寄存器、相应控制位等 必须根据需要进行设置,以便计数器按预定要求正 常工作。

6.1.3 定时原理
定时功能实质上也是通过计数器的计数 来实现的。当计数器的输入脉冲频率恒定时, 计数器所记录的数值就代表了时间的概念。 频率恒定的脉冲可以来自外部晶振,也可以 来自内部RC电路。

定时器原理框图如图6—2所示。

外部 时钟 源 S0

6.1.3 定时原理
S1 S2

计数器
初值寄存器

溢出标志TF
中断请求

内部时 钟源

图6—2 定时器原理框图 当计数频率恒定为1MHz,即其周期为l μ s,此时 表明每1微秒计数器加1。当计数器的值从1增加到10 时,计数器所记录的时间为10 μ s,即实现了定时功 能,定时时间为10微秒。

6.1.3 定时原理
可见,当计数器的计数频率恒定时( l μ s ), 可以根据计数器的“计数值”计算出定时时间。反 过来也可按定时时间要求计算出计数器的预置初值。 若要定时100微秒,则要记录100个数,计数器的预 置值应该设置为156,即9CH。 单片机的定时时钟源通常有两种:内部定时时 钟源和外部定时时钟源,且这种选择用户是可编 程的。如同计数器一样,定时器的初值、定时器 的工作状态和定时器溢出中断等,用户都是可以 进行控制(可编程)的。

6.1.4 M16定时计数器的系统组成
外引脚、内部RC振荡器、熔丝配置位、分频器、计数器、中 断系统、控制寄存器等组成。
外部振荡

熔丝配置
(定时) CLKI0

内部RC振荡器

(1-8MHz)

(8/16位)

外引脚
(计数)

T0/T1

分频器
(0-1024)

计数器

中断系统

控制寄存器

中断屏蔽寄存器

TCCRn

T0/T2和T1定时/计数器
TCNT0/T2(8位)
0 0 0 0 0 0 0 0

TIFR_TOVO
0

0X00-0XFF (0-255)
TCNT1H 0 0 0 0 0 0 0 0 0 TCNT1(16位)

中断系统

TIFR_TOV1

0 0 0 0 0 0 0 0 TCNT1L

0X0000-0XFFFF(0-65535)

比较匹 配输出 使能位

比较匹配 输出模式

时钟选 择位

默 认 值



1 熔丝选择位的内部RC振荡设置(0001-0100) √ 0
√ 0
CKLEL3
CKLEL3

√ 0
√ 0

CKLEL2



√ 0

CKLEL1

CKLEL0

1
CKLEL1

→1M
CKLEL0

CKLEL2

√ 0

1
CKLEL2 CKLEL1

→2M
CKLEL0

√ 0
√ 0

CKLEL3

√ 0

1
CKLEL2

1
CKLEL1

→4M
CKLEL0

CKLEL3

1

√ 0

√ 0

→8M

2 熔丝选择位的外部晶振设置(1100-1111)
CKLEL3 CKLEL2

1

1

...
CKLEL2

√ 0

CKLEL1

√ 0

CKLEL0

CKLEL3

CKLEL1

CKLEL0

1

1

1

1

→8M

注:设置外部晶振需慎重,必须保证外部晶振电路正确,否 则芯片无振荡源, 程序写不进去会被锁死。

熔丝选择位设置方法: 熔丝设置步骤

3 定时计数器的预分频器 ATmegal6的T/CO和T/C1由一个10位的预定 比例分频器提供时钟源。该预分频器将系统时钟 按设定的比例进行分频,以产生不同周期的时钟 clkT0、clkTl,分别作为时钟源提供给T/CO和T /C1使用。图6—7为T/CO、T/C1的预定比例分 频器示意图。T/CO和T/C1的时钟源可来自芯片 内部,也可来自外部引脚T0(PB0)和T1(PBl)。当 选择外部引脚的输入信号为时钟源时,预分频器 不对外部引脚的输入信号进行预分频。当选择芯 片内部时钟时,通过设置预分频器可选择4种不同 的分频比例,它们是8、64、256、1024分频。

T0/T2控制寄存器TCCR0/TCCR2:

-

-

-

-

(T/C1)

CSn2

CSn1

CSn0

返回例1

返回例2

返回例3

M16的中断控制系统
中断标志寄存器TIFR 0 1 0 0 0 1 0 1 状态寄存器SREG|=0X80 1 0 0 0 0 0 0 0

T2
1 T1 T0
中断总开关

中断 处理

1
1

0 1 0 0 0 1 0 1 中断屏蔽寄存器 TIMSK
中断分开关
返回组成 返回例2

6.1.5 定时计数器应用举例
电路图 例1:用T1计数,上电后,8发光管不亮,每按动 一次键发光管亮一个二进制数,即用发光管显示计 数的值。程序1

例2:用T0计数,上电后,8发光管不亮, 当按键按动5次后使T0计数器溢出让8发光管全 亮。程序2 例3:用T0查询法定时,上电后,8发光管 间隔300毫秒闪亮。程序分析3 例4:用T2中断法定时,上电后,8发光 管间隔1秒闪亮。程序分析4

//例1程序清单:
#include <mega16.h> //器件文件头 void main(void) //主程序 { //端口初始化 DDRD = 0xff; //设定PD口为输出。 TCCR1B=6; //用下降沿计数 TCNT1=0; //计数器初值; while (1) { PORTD=~TCNT1;//将计数结果取反后送D口显示。 } } 结果显示1 返回

//例2程序清单:
#include <mega16.h> //器件文件头 void main(void) //主程序 { //端口初始化 DDRD = 0xff; //设定PD口为输出。 TCCR0=6; //用下降沿计数 TCNT0=251; //计数器初值; while (1) { if(TIFR&1==1) PORTD=0;// 当计数器溢出后灯亮。解释TIFR else PORTD=0XFF;//灯灭 } }

结果显示2

返回

例3分析:初值计算:设晶振频率 为8MHz,采用8分频时,每计1个脉冲 为1μs(8M/8=1M),若初值为0;则定 时计数器从0开始计数到计满256后溢 出所用时间为256μs。若初值为156; 则定时计数器从156开始计数到计满 256后溢出所用时间为100μs (0.1ms)。定时计数器溢出中断 3000次为300ms。如图所示。

(8MHz) 外部 振荡

(1MHz) 8分频器

TCNT0=156
1 0 0 1 1 1 0 0 1

T0V2

T0V1

- - - - - 0 1 0

- 0 - - - 0 - 1
T0V0

TCCR0=2

TIFR

//例3程序清单:
#include <mega16.h> //器件文件头 void main(void) { int i; //定义变量 DDRD = 0xff; //设定PD口为输出控灯。 TCCR0=2; //T0定时且8分频 TCNT0=156; //计数器预置值; while (1) { PORTD =~PORTD ; //D口取反 for(i=0;i<3000;i++) //300ms {while ((TIFR&0x01)==0); //查询是否溢出(0.1ms) TIFR|=0x01; //时间到,清溢出位 TCNT0=156; //重新置数 }} 返回 } 结果显示

例4分析:
T2定时的时钟源可以采用系统时钟源,也可以采 用外部32768Hz晶振作为时钟源,若采用外部时钟源, 必须将ASSR寄存器设置为0X80; 由于32768/256=128,8位的T2计数器从0计到溢 出正好256个脉冲,由此可知要想得到1秒的时基,可 将分频系数设为128。

//例4程序清单: #include <mega16.h> interrupt [TIM2_OVF] void timer2_ovf_isr(void) { PORTD=~PORTD; }//1秒中断函数 void main(void) { DDRD=0XFF; //设定PD口为输出控灯。 ASSR=0x08; //使用外部32768晶振(占PC.6/7口) TCCR2=0x05; //128分频 TCNT2=0x00; //256计数 TIMSK=0x40; //合上T2中断分开关 #asm("sei"); //合上中断总开关 while (1); //循环程序(空) } 返回 结果显示

定时计数器应用例图

例1录像

例2录像

例3录像

例4录像

事件捕获原理
捕获原理框图如下图所示: 当外部捕获事件发生时,立即打开闸门电路将定 时器/计数器的当前值装入捕获寄存器。一旦定时 器/计数器的当前值被装入捕获寄存器,捕获标志 位ICF立即置1并同时产生输入捕获中断请求2。

事件捕获原理
捕获寄存器 溢出标志ICF S2 中断请求 捕获事件 S0 闸门电路

时钟源

S1

计数器

溢出标志TF

S2 中断请求

PWM输出原理与方法

PWM为脉冲宽度调制。PWM输出的一般形式为一系列 的脉冲波形,如图6-4所示。 在图6-4中,设脉冲的周期为?,高电平持续时间为t,则 t与?之比定义为PWM的“占空比”,用D表示,即D=t/?。
t

τ

PWM输出原理与方法
PWM输出的最大特点是波形的频率恒定,波 形的占空比D却可以改变。占空比的改变很具 有实际意义,例如小功率直流电机的驱动与调 速,其方法就是控制电机电枢电压接通和断开 的比值来驱动电机和改变电机的转速,这种方 法称为脉宽调速法。

PWM原理框图如下图所示:

时钟源

S1

定时器计数器

溢出标志TF

S2 中断请求

比较器

PWM输出

比较寄存器

定时器/计数器以一定的频率上、下计数,即计数器从 00H~FFH(假设定时器/计数器为8位)进行计数,然 后计数器反向从FFH~00H进行计数,如此反复。当计 数器中的数值与比较寄存器中的数值相等时,比较器 的输出按PWM预定的规律输出一系列的脉冲波,如图 6-6所示。
比较值改变 计数器值 比较值

PWM输出

ATmega16的定时器/计数器资 源
ATmega16内部有3个定时器/计数器:2个8位的定时器/ 计数器――T/C0、T/C2;1个16位的定时器/计数器 ――T/C1。
T/C的预分频器 8位定时/计数器T/C0、T/C2 T/C2的异步操作 PWM模式下的T/C0、T/C2 16位定时器/计数器T/C1 PWM模式下的T/C1

T/C的预分频器
ATmega16单片机的定时/计数器可以选择不同频率的 计数源,这些计数源由分频器对主时钟的不同分频构 成。 定时/计数器0和定时/计数器1共用一个分频器,可选 的时钟频率为0、CK/8、CK/64、 CK/256、CK/1024或 外部时钟。

定时/计数器2拥有自己独立的分频器,当异步 状态寄存器(ASSR)的AS2位被清0时,分频 器和单片机的主时钟相连;当该位置为1时, 则分频器同外部异步时钟源相连。定时/计数器 2可选的时钟频率为0、CK/8、CK/64、 CK/256、 CK/1024或外部时钟。

8位定时/计数器T/C0、T/C2
● 定时/计数器0的寄控制寄存器(TCCR0) 定时/计数器0的寄控制寄存器用于控制定时/计数器0的工作 参数。 ● 定时/计数器2的寄控制寄存器(TCCR2) 定时/计数器2的寄控制寄存器用于控制定时/计数器2的工作 参数。 ● 定时/计数器中断屏蔽寄存器(TIMSK) 定时/计数器0的寄控制寄存器用于存储当前的计数值。 ● 定时/计数器中断标志寄存器(TIFR) 定时/计数器0的寄控制寄存器用于存储当前的计数值。

● 定时/计数器0计数寄存器(TCNT0) 定时/计数器0的寄控制寄存器用于存储当前的计数值。 ● 定时/计数器2计数寄存器(TCNT2) 定时/计数器2的寄控制寄存器用于存储当前的计数值。 ● 定时/计数器2的输出比较寄存器(OCR2) 定时/计数器2的输出比较寄存器存储与定时/计数器2相比较 的数据。 ● 异步状态寄存器(ASSR) 异步状态寄存器用于标识定时/计数器2在异步计数方式下 的工作状态。

T/C2的异步操作
当T/C2采用异步工作方式时,计数时钟直接来自外部引 脚TOCS1,因此计数时钟与系统时钟是不同步的,所以 在使用异步方式时必须注意以下几个方面:

当在同步和异步方式之间切换时,寄存器 TCNT2、OCR2和TCCR2的内容会受到存坏。

T/C2的异步操作
芯片已经对32.768KHZ的手表晶振进行了优化。 加一个其他频率的外部时钟到TOCS1引脚可能 会导致T/C2不正常工作。CPU的主时钟频率必 须大于外部时钟频率的4倍。 当写入TCNT2、OCR2和TCCR2寄存器中的一 个时,其值先写入到临时缓冲寄存器中,在 TOCS1上的时钟两个上升沿后,临时缓冲寄存 器中的值被锁存到寄存器中。在临时缓冲寄存 器中的值未锁存到其目标寄存器前,不能写一 个新值到临时缓冲寄存器。

PWM模式下的T/C0、T/C2
当选择相位可调的PWM模式后,T/C0、T/C2以及 输出比较寄存器OCR0、OCR2分别组成8位无奇边非 对称,相位可调的脉宽调制PWM,输出引脚分别为 PB3(OCR0)和PD7(OCR2)。T/C0和T/C2作为上 /下计数器,从现在00H~FFH,然后反向计数回到 00H。当计数器中的数值与OCR0、OCR2的数值一 致时,PB3(OCR0)和PD7(OCR2)引脚按照 COM00、COM01和COM20、COM21的设置动作, 见表6-5所示。

表6-5 T/C0、T/C2比较输出模式、相位可调PWM模式

COMn1

COMn0

OCn引脚

0
0 1 1

0
1 0 1

OCn不占用PB3或PD7引脚
保留 加1计数匹配时,清除; 减1计数时,置位。 加1计数匹配时,置位; 减1计数时,清除。

16位定时器/计数器T/C1

定时/计数器1的寄控制寄存器A(TCCR1A) 定时/计数器1的寄控制寄存器B(TCCR1B)
定时/计数器1计数寄存器(TCNT1H和TCNT1L) 定时/计数器1的输入捕获寄存器(ICR1H和ICR1L)

定时/计数器1的寄控制寄存器 A(TCCR1A)
定时/计数器1的寄控制寄存器A用于控制定时/计数器1的输出比较去和脉 冲输出参数。

定时/计数器1的寄控制寄存器 B(TCCR1B)
定时/计数器1的寄控制寄存器B用于设置比较输入比较器参数并选定定时/ 计数器1的工作时钟。

定时/计数器1计数寄存器(TCNT1H和 TCNT1L)
定时/计数器1的寄控制寄存器用于存储当前的计数值。 定时/计数器1输出比较寄存器A、B (OCR1AH和OCR1AL、 OCR1BH和OCR1BL) 定时/计数器1输出比较寄存器A和B存储定时/计数器1相比较的 两个16位数据,由于OCR1A和OCR1B也都是16位的寄存器, 因此单片机对它们的读写操作也需要像操作定时/计数器1的计 数寄存器TCNT1一样遵循同样的读写顺序,

定时/计数器1的输入捕获寄存器(ICR1H和 ICR1L)
当输入捕获事件发生时,定时/计数器的输入捕获寄存器用于存储定时/计数 器1的计数值,读写顺序同TCNT1、OCR1A和OCR1B相同。

PWM模式下的T/C1

定时/计数器1 在不同PWM 分辨率下的 计数量大值 和频率如下 表9.27所示。
定时/计数 器1的PWM 输出控制 方式如表 9.28所示。

PWM分辨率
8 9

定时/计数器的最大计数值
255 511

频率
fTCK1/510 fTCK1/1023

10

1023

fTCK1/2046

COM1A1(COM1B1) COM1A0(COM1B0) 0 0

OC1A(OC1B)上的作用 断开

0
1 1

1
0 1

断开
加1计数匹配时,清除; 减1计数时, 置位。 加1计数匹配时,置位; 减1计数时, 清除。

定时器/计数器2应用举例
定时/计数器2具有通用定时、输出比较和脉宽调制3种工作方式,它们的 设置和操作同定时/计数器1类似。
T/C2用作实时时钟 T/C0作定时器

T/C2用作实时时钟
T/C2的时钟源来自PC6(TOSC1)、PC7(TOSC2)的32768Hz的手表 晶振,若对32768Hz的手表晶振进行128分频,分频后的晶振频率为 256Hz,晶振周期为1/256s,所以记录256个脉冲时,所需时间正好 为1秒;若对32768Hz的手表晶振进行256分频,分频后的晶振频率 为128Hz,其周期为1/128s,则记录128个脉冲所需时间也正好为1 秒。这就是为什么将32768Hz称为“手表晶振”或“实时时钟晶 振”, T/C2为什么可用作“实时时钟RTC”的原因。
应用课题1

应用课题1:用定时器T/C2时钟晶振,产生1s中断,并在PD7 输出1Hz的方波。 #include “mega16.h” #interrup [TIM2_COMP] void timer2_comp_isr (void ) { } void main( ) { PORTD=0x00 ; DDRD=0xff ; ASSR=0x08 ; TCCR2=0x1E ; TCNT2=0x00; OCR2=0x80; TIMSK=0x80; SREG|=0x80; while(1) {}; }

引脚

T/C0作定时器
T/C0作定时器,4MHz晶振,256分频,64us计一个脉冲,当TCNT0初值设 为6,每计250个脉冲(16ms),T/C0溢出一次,若T/C0溢出中断服务子程序 使PD0改变极性,则在PD0引脚产生周期为32ms的对称方波。 表6-12 与TIMER0有关的几个寄存器
类型
定时器寄存器 定时/计数器寄存器 中断标志寄存器 中断寄存器 中断屏蔽寄存器 状态寄存器 TCNT0 TIFR TIMSK SREG

名称
定时/计数器控制寄存器

寄存器变量名
TCCR0

#include “mega16.h” #interrup [TIM0_OVF] void timer0_ovf_isr (void ) { TCNT0=0x06; PORTD.0!= PORTD.0 ; 改变分频系数或在中断服务子程序中改变 } T/C0的初值均可变更中断时间间隔。 void main( ) 定时器0可以对外部脉冲序列进行计数的 { 功能,也可以实现相位校正的脉冲宽度 PORTD=0x00 ; 调制、输出比较等功能。 DDRD=0xFF ; TCCR0=0x04 ; TCNT0=0x06; OCR0=0x00; TIMSK=0x01; SREG|=0x80; while(1) {}; }

T/C1的应用举例
表6-13 与TIMER1有关的几个寄存器

定时/计数器1的工作方式
定时/计数器1的工作方式包括定时/计数方式、输出比较方式、输入捕获方 式和脉宽调制器(PWM)方式。 定时/计数器1可设为一个双8位、9位或10位的脉宽调制器(PWM),此时, 定时/计数器1从0000H加1计数到顶,然后再减1计数到0000H,如此反复循 环,并且在OC1A和OC1B上输出相应信号。 定时/计数器1除了通用的定时和计数功能之外,还可以实现输出比较、输 入捕获和脉宽调制器(PWM)功能。
外部计数举例-高频脉冲测量 输入捕获中断应用举例-测低频信号方波周期 PWM输出作D/A转换器

外部计数举例

TIMER1对外部脉冲计数的电路如下图所示。TIMER1对外部脉冲信号进行计 数。计数值满1000,单片机的PA0口反相一次,从而使电动机反转。

源程序为: #include “mega16.h” void main( ) { DDRA=0xff ; PORTA=0xff ; TCCR1A=0x00 ; TCCR1B=0x06 ; TCNT1=64536 ; while(1) { if(TIFR&0x04!=0) {PORTA^=0x01; TIFR=0x04;} }}

输入捕获中断应用举例

设TIMER0输出方波信号,其输出方波的频率为低频,欲测量其波形的频 率,可按如下方法:设置TIMER1为计数方式,计数脉冲来自内部时钟, 将TIMER0输出的方波作为TIMER1的输入捕获信号,触发TIMER1的输入 捕获功能。显然,TIMER1的两次捕获值之差为TIMER0发出的方波之间 的时间间隔即周期。 设TIMER1两次捕获值之差为N, TIMER1的计数频率为fT1,则TIMER0发 出的方波波形的周期T为: TIMER0发出的方波波形的频率:f=1/T=fT1/N

??
T0

T/C1的计数值

T/C0输出的方波

源程序为: #include “mega16.h” #include “lcd.h” #include “delay.h” Unsigned int x(2),i,f; Interrupt [TIM1_CAPT] void timer1_capt(void) /*T1的输入捕获中断服务程序*/ { X(i)=ICR1H*256+ICR1L; i++; }

主程序 void main( ) { i=0 ; DDRB=0x08 ; TCCR0=0x1B ; OCR0=0x80; TCNT0=0x00 ; TCCR1A=0x00; TCCR1B=0xC3; TCCN1H=0x00; TCCN1L=0x00; TIMSK=0x20; While(1) { if(x(1)>x(0)) f=x(1)-x(0)} ; f=65536-x(0)+x(1); f=6000000/f }

PWM输出作D/A转换器 定时/计数器1可设为一个双8位、9位或10位的脉宽调制器(PWM),此 时,定时/计数器1从0000H加1计数到顶,然后再减1计数到0000H,如此 反复循环,并且在OC1A和OC1B上输出相应信号。 定时/计数器1的PWM输出可以用来控制电机,也可以经滤波电路构成一 个简单的数模转换器。以下为定时/计数器1作为PWM使用举例。 PB3(OC0)、 PD5(OC1A)、 PD4(OC1B)、 PD7(OC2)可以产生 PWM脉宽调制波,输出的PWM的精度、周期、相位和占空比都是可以 改变的。下面以OC1B为例产生10位的PWM方波,经滤波输出模拟电压。 电路如图6-10所示。
反相器4069 PD4 (OC1B)

ATmega16

正向PWM方波的占空比为(OCR1BH:OCR1BL)/1023,经两级CMOS反 相器4096限幅其“0”状态为0V,“1”状态为VCC,经滤波可产生模拟电压 输出。为减少输出阻抗,可加电压跟随器。改变占空比的大小就成比例地 改变了电压的输出: VOUT=VCC( OCR1BH:OCR1BL )/1023 若使输出与主机隔离可采用图6-11所示的电路用一个光电耦合器即可实现 与主机隔离,但光耦三极管后面的电路必须另用一组隔离的电源供电,若 输出4~20mA的电流,则把跟随器改为V/I转换电路即可。
Vcc1 Vcc2 反相器4069 U/I 4-20mA PD4 (OC1B) ATmega16

源程序为: #include “mega16 .h” //主程序 void main( ) { DDRD=0x10 ; TCCR1A=0x23 ; TCCR1B=0x01 ; OCR1BH=2; OCR1BL=0; while(1); }


相关文档

更多相关文档

Atmega16定时器
ATmega16定时器中断
ATmega16的中断系统与定时器/计数器的使用
AVR ATmega16 16 位定时器 计数器 CTC 模式《我和你》音乐源码
Atmega16的定时器time0
电脑版