/** 函數(shù)庫(kù)說(shuō)明:ATMEGE8 T1定時(shí)器 快速PWM* 版本: v1.0 * 修改: 龐輝 * 修改日期: 2011年08月11日 * * 說(shuō)明: OC1A 20khz 50%占空比* OC1B 10khz 33%占空比* 且在溢出中斷中頻率不斷改變 * * 版本更新: * *注意:快速PWM模式 WGM1=5,6,7,14,15 * 單斜波計(jì)數(shù),用于輸出高頻率的PWM信號(hào)(比雙斜波的高一倍頻率) * 都有TOV1溢出中斷,發(fā)生于TOP時(shí) * 比較匹配后可以產(chǎn)生OCF1x比較匹配中斷. * WGM1=5時(shí), 最大值為0x00FF, 8位分辨率 * WGM1=6時(shí), 最大值為0x01FF, 9位分辨率 * WGM1=7時(shí), 最大值為0x03FF,10位分辨率 * WGM1=14時(shí),最大值由ICF1設(shè)定, TOP時(shí)產(chǎn)生ICF1輸入捕捉中斷 (單緩沖) * WGM1=15時(shí),最大值由OCR1A設(shè)定,TOP時(shí)產(chǎn)生OCF1A比較匹配中斷(雙緩沖,但OC1A將沒(méi)有PWM能力,最多只能輸出方波) * 改變TOP值時(shí)必須保證新的TOP值不小于所有比較寄存器的數(shù)值 * 注意,即使OCR1A/B設(shè)為0x0000,也會(huì)輸出一個(gè)定時(shí)器時(shí)鐘周期的窄脈沖,而不是一直為低電平 * 計(jì)算公式:fPWM=fclk_IO/(N*(1+TOP))/#include <avr/io.h>#include interrupt.h>int main(void){//PB1 PB2 設(shè)置為輸出模式DDRB |= (1 << DDB1) | (1 << DDB2);//PWM周期計(jì)數(shù)器ICR1 = 300;//PB1占空比計(jì)數(shù)器,占空比50%OCR1A = 150;//PB2占空比計(jì)數(shù)器,占空比50%OCR1B = 100;//OC1A OC1B起始高電平電平TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);//使能溢出中斷//TIMSK |= (1 << TOIE1);//開(kāi)總中斷//sei();//OC1A OC1B 快速PWM,TOP值為ICR1,不分頻,PWM啟動(dòng)TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10);while(1);return 0;}volatile unsigned int i = 0;//定時(shí)器1溢出中斷SIGNAL(SIG_OVERFLOW1){i++;//3秒if(i == 60000){i = 0;ICR1 += 50;}if(ICR1 == 500){ICR1 = 300;}}
評(píng)論