AVR单片机定时器TC0相位修正PWM模式输出实例.docxVIP

  • 2
  • 0
  • 约1.93千字
  • 约 2页
  • 2019-08-01 发布于浙江
  • 举报

AVR单片机定时器TC0相位修正PWM模式输出实例.docx

相位修正PWM 模式(WGM01:0 = 1) 为用户提供了一个获得高精度相位修正PWM 波形的方法。此模式基于双斜坡操作。计时器重复地从BOTTOM 计到MAX,然后又从MAX倒退回到BOTTOM。在一般的比较输出模式下,当计时器往MAX计数时若发生了TCNT0与OCR0的匹配,OC0将清零为低电平;而在计时器往BOTTOM计数时若发生了TCNT0与OCR0 的匹配, OC0 将置位为高电平。工作于反向输出比较时则正好相反。与单斜坡操作相比,双斜坡操作可获得的最大频率要小。但由于其对称的特性,十分适合于电机控制。相位修正PWM 模式的PWM 精度固定为8 比特。计时器不断地累加直到MAX,然后开始减计数。在一个定时器时钟周期里 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) #includeiom16v.h? #define uchar unsigned char? #define uint unsigned int uint count; /*********以下是延时函数*********/ void Delay_ms(uint xms) { ?? int i,j; ?? ? for(i=0;ixms;i++) ? { for(j=0;j1140;j++) ; } } /********以下是端口初始化函数********/ void port_init() { ?DDRB|=(1PB3);? ?//PB3配置为输出(为1时用或符号|) ?PORTB=(0PB3);??? ?//PB3输出0(为0时与符号) } /********定时器0初始化********/ void timer0_init() { ??TCCR0=(0WGM01)|(1WGM00)|(1COM01)|(1COM00)|(1CS00)|(0CS02); ???????????????????????????????? // T/C0工作于相位修正PWM模式,不分频 ????????????????????????????? //在升序计数时,发生比较匹配将置位CR0,降序计数时,发生比较匹配将清零OC0? ?OCR0=0;????????????????? ? //比较匹配寄存器初值,????????????????????????? ? ?SREG=0x80;?????????????????? //使能全局中断 } /*********以下是主函数*********/ void main(void)??????????? { ??port_init(); ?timer0_init();? ?while(1) ?{ ??for(count=0;count256;count++)??? //OCR=0时,LED最亮,然后逐渐变暗 ??{ ???OCR0=count;???????????????????? //比较匹配寄存器赋值 ???Delay_ms(20);?????????????????? //延时一段时间,以观察效果 ??}?? ??Delay_ms(3000);?????? ????// LED最暗时,延时一段时间 ??for(count=255;count0;count--)????? //OCR=255时,LED最暗,然后逐渐变亮 ??{ ???OCR0= count;?????????????????????? ???Delay_ms(20);?????????????????????? ??}?? ??Delay_ms(3000);???????? //LED最亮时,延时一段时间 ?}? } 小企鹅diy 科学探究学习网 更多文章转到 /wqb_lmkj/blog? 文章分类单片机

文档评论(0)

1亿VIP精品文档

相关文档