3. avr定時(shí)器/計(jì)數(shù)器0 --TC0 --相位修正PWM模式
相位修正PWM 模式(WGM01:0 = 1) 為用戶提供了一個(gè)獲得高精度相位修正PWM 波形的方法。此模式基于雙斜坡操作。計(jì)時(shí)器重復(fù)地從BOTTOM 計(jì)到MAX,然后又從MAX倒退回到BOTTOM。在一般的比較輸出模式下,當(dāng)計(jì)時(shí)器往MAX計(jì)數(shù)時(shí)若發(fā)生了TCNT0與OCR0的匹配,OC0將清零為低電平;而在計(jì)時(shí)器往BOTTOM計(jì)數(shù)時(shí)若發(fā)生了TCNT0與OCR0 的匹配, OC0 將置位為高電平。工作于反向輸出比較時(shí)則正好相反。與單斜坡操作相比,雙斜坡操作可獲得的最大頻率要小。但由于其對(duì)稱的特性,十分適合于電機(jī)控制。相位修正PWM 模式的PWM 精度固定為8 比特。計(jì)時(shí)器不斷地累加直到MAX,然后開始減計(jì)數(shù)。在一個(gè)定時(shí)器時(shí)鐘周期里 TCNT0 的值等于MAX。時(shí)序圖可參見下圖。圖中 TCNT0 的數(shù)值用柱狀圖表示,以說明雙斜坡操作。本圖同時(shí)說明了普通PWM 的輸出和反向PWM 的輸出。TCNT0 斜坡上的小橫條表示OCR0 與TCNT0 的比較匹配。
PWM產(chǎn)生過程:定時(shí)器啟動(dòng)后,從0開始計(jì)數(shù)到255,加1后由255減1到0,在正向加1過程中當(dāng)TNCT0與OCR0相等時(shí),OC0清0,在反向減1的過程中,當(dāng)TNCT0等于OCR0,OC0置位,改變比較寄存器OCR0的數(shù)值就改變了輸出PWM的占空比。
//在PB3引腳上輸出PWM控制發(fā)光二極管的漸亮,漸滅(代碼來自輕松玩轉(zhuǎn)avr單片機(jī)c語言cd)
#include
#define uchar unsigned char
#define uint unsigned int
uint count;
/*********以下是延時(shí)函數(shù)*********/
void Delay_ms(uint xms)
{
int i,j;
for(i=0;i
}
/********以下是端口初始化函數(shù)********/
void port_init()
{
DDRB|=(1<
/********定時(shí)器0初始化********/
void timer0_init()
{
TCCR0=(0<
//在升序計(jì)數(shù)時(shí),發(fā)生比較匹配將置位CR0,降序計(jì)數(shù)時(shí),發(fā)生比較匹配將清零OC0
OCR0=0; //比較匹配寄存器初值,
SREG=0x80; //使能全局中斷
}
/*********以下是主函數(shù)*********/
void main(void)
{
port_init();
timer0_init();
while(1)
{
for(count=0;count<256;count++) //OCR=0時(shí),LED最亮,然后逐漸變暗
{
OCR0=count; //比較匹配寄存器賦值
Delay_ms(20); //延時(shí)一段時(shí)間,以觀察效果
}
Delay_ms(3000); // LED最暗時(shí),延時(shí)一段時(shí)間
for(count=255;count>0;count--) //OCR=255時(shí),LED最暗,然后逐漸變亮
{
OCR0= count;
Delay_ms(20);
}
Delay_ms(3000); //LED最亮?xí)r,延時(shí)一段時(shí)間
}
}