- 2
- 0
- 约1.93千字
- 约 2页
- 2019-08-01 发布于浙江
- 举报
相位修正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 intuint 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)