AVR单片机比较匹配清零计数器模式的操作步骤及过程

控制/MCU

1878人已加入

描述

当计数器TCNT0的数值等于比较寄存器OCR0时计数器TCNT0自动清零。OCR0定义了计数器的最大(TOP)值,这个模式使得用户可以很容易地控制比较匹配输出的频率。T/C0的比较输出脚为OC0(PB3),PB口的第三脚,在此模式下可以在OC0上输出PWM控制外部设备。


 

例如:在OC0脚上输出20HZ的方波信号,方波的周期时间为T=1/20HZ=0.05秒=50ms,半个周期为25ms,系统采用8MHZ晶振,1024分频,时钟计数频率为8000000/1024=7812.5HZ,每个时钟脉冲时间为1/7812.5=0.128ms, 定时25ms的计数值为25ms/0.128ms=195,将195赋值为T/C0的比较寄存器OCR0,启动定时器后,TCNT0从0开始计数,当计数到195时,产生比较中断,在OC0脚上输出20HZ的占空比为50%的方波信号。

操作过程如下:

一、I/O管脚初始化:PB3(OC0)脚设为输出,DDRB|=(1《

二、使能全局中断:SREG=0X80;

三、T/C0比较中断允许:TIMSK|=(1《

四、TCCR0配置:分频系数为1024, TCCR0|=(1《

CTC模式设置, TCCR0|=(1《

比较匹配时OC0取反 TCCR0|=(1《

五、计数器付初值: TCNT0=0;

OCR0=195; //付初值后定时器开始工作

//函数功能:在PB3上输出20HZ的方波,并在PD7上产生周期2秒的周期信号。(代码来自轻松玩转avr单片机c语言cd)

#include

char Counter = 0; // 计数变量清零

void port_init()

{

DDRB|=(1《PORTB&=(0《DDRD|=(1《PORTD&=(0《}

void timer0_init()

{

SREG = 0x80; //使能全局中断

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

TCCR0=(1《// T/C0工作于CTC模式,1024分频,比较匹配时,触发OC0取反

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

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

}

void main()

{

port_init();

timer0_init();

while(1);

}

#pragma interrupt_handler timer0_COMP:20

void timer0_COMP(void)

{

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

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

if(++Counter 》= 40) //定时时间到1S吗?定时中断溢出40次为1S

{

PORTD^=(1《Counter = 0; //1S计时变量清零

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分