本質區別就是OC1A,OC1B是用定時器1模擬的PWM輸出而OC2對應的是定時器2他本身可以配置成PWM輸出,妳可以看看數據手冊。
快速PWM 的產生就是先設定壹個TOP值再設定壹個比較值,然後,計數器開始計數,比如保持輸出1,計數到設定的比較值時,電平變為0,並維持,然後繼續計數到TOP
電平再變為1,如此重復循環.
1.T/C1可以產生2路(OC1A即PB1 OC1B即PB2).T/C2產生壹路(OC2即PB3).
2.需要設定T/C1的寄存器有四個 TCCR1A TCCR1B(這兩個寄存器壹起決定了兩路PWM信號的產生方式,頻率和TOP值) OCR1A(此值/TOP就是占空比) OCR1B(設定第二路PWM的占空比)
2.需要設定T/C2的寄存器有2個 TCCR2(同理,這個寄存器決定了第三路PWM信號的產生方式,頻率和TOP值 ) OCR2(這個寄存器決定占空比)
上面所述只能產生幾個固定頻率的PWM信號(占空比可以隨便調),並且前兩路的頻率是壹樣的.如果想產生自己想要頻率的PWM,需要用OCR1A 設定OCR1B的TOP值,由OCR1B產生PWM,此時OCR1A只能產生占空比50%的PWM.
下面是我用ATmega8產生三路頻率31.25K,占空比分別為1/3 1/2 2/3 PWM 的程序. 8M
#include <avr/io.h>
void main(void)
{
PORTB=0x00;
DDRB=0x0E;
// T/C1 初始化
TCCR1A=0xA1;
TCCR1B=0x09; //匹配時清零,TOP:255,頻率:8M/256=31.25K
OCR1A=85; //占空比:1/3
OCR1B=128; //占空比:1/2
// T/C2 初始化
TCCR2=0x69; //匹配時清零,TOP:255,頻率:31.25K
OCR2=170; //占空比:2/3
while (1);
}
本程序參考ouravr論壇!