欢迎来到天天文库
浏览记录
ID:59095348
大小:31.17 KB
页数:2页
时间:2020-09-15
《AVR单片机定时器TC0相位修正PWM模式输出实例.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、相位修正PWM模式(WGM01:0=1)为用户提供了一个获得高精度相位修正PWM波形的方法。此模式基于双斜坡操作。计时器重复地从BOTTOM计到MAX,然后又从MAX倒退回到BOTTOM。在一般的比较输出模式下,当计时器往MAX计数时若发生了TCNT0与OCR0的匹配,OC0将清零为低电平;而在计时器往BOTTOM计数时若发生了TCNT0与OCR0的匹配,OC0将置位为高电平。工作于反向输出比较时则正好相反。与单斜坡操作相比,双斜坡操作可获得的最大频率要小。但由于其对称的特性,十分适合于电机控制。相位修正PWM模式的PWM精度固定为8比特。计时器不断地累加直到MAX,然后开始减计数
2、。在一个定时器时钟周期里TCNT0的值等于MAX。时序图可参见下图。图中TCNT0的数值用柱状图表示,以说明双斜坡操作。本图同时说明了普通PWM的输出和反向PWM的输出。TCNT0斜坡上的小横条表示OCR0与TCNT0的比较匹配。PWM产生过程:定时器启动后,从0开始计数到255,加1后由255减1到0,在正向加1过程中当TNCT0与OCR0相等时,OC0清0,在反向减1的过程中,当TNCT0等于OCR0,OC0置位,改变比较寄存器OCR0的数值就改变了输出PWM的占空比。//在PB3引脚上输出PWM控制发光二极管的渐亮,渐灭(代码来自轻松玩转avr单片机c语言cd)#includ
3、e #defineucharunsignedchar #defineuintunsignedintuintcount;/*********以下是延时函数*********/voidDelay_ms(uintxms){ inti,j; for(i=0;i4、=(1<5、) PORTB&=(0<6、********定时器0初始化********/voidtimer0_init(){ TCCR0=(0<7、(1<8、(1<9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
4、=(1<5、) PORTB&=(0<6、********定时器0初始化********/voidtimer0_init(){ TCCR0=(0<7、(1<8、(1<9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
5、) PORTB&=(0<6、********定时器0初始化********/voidtimer0_init(){ TCCR0=(0<7、(1<8、(1<9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
6、********定时器0初始化********/voidtimer0_init(){ TCCR0=(0<7、(1<8、(1<9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
7、(1<8、(1<9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
8、(1<9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
9、(1<10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
10、(1<11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
11、(0<12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
12、 SREG=0x80; //使能全局中断}/*********以下是主函数*********/voidmain(void) { port_init(); timer0_init(); while(1) { for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗 { OCR0=count; //比较匹配寄存器赋值 Delay_ms(20); //延时一段时间,以观察效果 }
13、 Delay_ms(3000); //LED最暗时,延时一段时间 for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮 { OCR0=count; Delay_ms(20); } Delay_ms(3000); //LED最亮时,延时一段时间 } }小企鹅diy科学探究学习网更多文章转到 文章分类单片机
此文档下载收益归作者所有