您的位置:首页 > 其它

3. avr定时器/计数器0 --TC0 --相位修正PWM模式 (比较输出--相位修正PWM 模式)

2012-04-03 01:40 302 查看
相位修正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)

#include<iom16v.h>

#define uchar unsigned char

#define uint unsigned int

uint count;

/*********以下是延时函数*********/

void Delay_ms(uint xms)

{

int i,j;

for(i=0;i<xms;i++)

{ for(j=0;j<1140;j++) ; }

}

/********以下是端口初始化函数********/

void port_init()

{

DDRB|=(1<<PB3); //PB3配置为输出(为1时用或符号|)

PORTB&=(0<<PB3); //PB3输出0(为0时与符号&)

}

/********定时器0初始化********/

void timer0_init()

{

TCCR0=(0<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS00)|(0<<CS02);

// T/C0工作于相位修正PWM模式,不分频

//在升序计数时,发生比较匹配将置位CR0,降序计数时,发生比较匹配将清零OC0

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

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

}

/*********以下是主函数*********/

void main(void)

{

port_init();

timer0_init();

while(1)

{

for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗

{

OCR0=count; //比较匹配寄存器赋值

Delay_ms(20); //延时一段时间,以观察效果

}

Delay_ms(3000); // LED最暗时,延时一段时间

for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮

{

OCR0= count;

Delay_ms(20);

}

Delay_ms(3000); //LED最亮时,延时一段时间

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: