|
/*AVR相位修正PWM定時器0發(fā)生模式*/
/*PWM波的產(chǎn)生機理是定時器0的TCNT0由0到255,在由255到0,不斷地計數(shù),當(dāng)在0-255計數(shù)時TCNT0=OCR0時在OC0引腳上出現(xiàn)低電平,*/
/*當(dāng)在255-0計數(shù)時TCNT0=OCR0時在OC0引腳上出現(xiàn)高電平,當(dāng)由0加到255,再由255減到0時,產(chǎn)生溢出中斷,可以再終端服務(wù)中修改OCR0的值,以改變占空比,比用引腳模擬要準確*/
/*另外值得說的是相位修正PWM很適合用在電機控制的場合,他比快速PWM慢,因此它的最大頻率要比快速PWM低的多*/
/* 相位修正PWM實驗 20110416 天津第四項目部宿舍 王均偉 */
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b) a|=(1<<b)
#define clr_bit(a,b) a&=~(1<<b)
#define get_bit(a,b) a&(1<<b)
uchar i;
#pragma interrupt_handler time0fistpwm_isr:10
void time0fistpwm_isr()//定時計數(shù)器0溢出中斷
{
if(OCR0==255)
{OCR0=0;}//加這個語句是為了在OC0引腳上表現(xiàn)出電壓越來越高,燈越來越亮的效果,
OCR0++; //OCR0越小則OC0引腳電壓越低越,換句話說低電平時間越長。
}
void int_time0fistpwm()//定時器0用在相位修正PWM設(shè)置初始化
{
SREG=0x80;//開啟全局中斷
TCNT0=0;//
OCR0=0;;//
TCCR0=0x65; //工作在相位修正PWM模式,當(dāng)TCNT0由0-TOP時,OCR0=TCNT0時,OC0腳拉低,當(dāng)TCNT0由TOP-0時,OCR0=TCNT0時,OC0腳拉高,此時計時器繼續(xù)計數(shù),當(dāng)TCNTO=0時溢出時,并產(chǎn)生中斷,可以在中斷里設(shè)置下一次的低電平時間,OCR0越小低電平時間越長 OC0引腳(就是4腳),時鐘1024分頻,開啟定時器
TIMSK=0x01;//開啟定時器溢出中斷
}
void main()
{
DDRC=0xff;
PORTC=0x00;
DDRB|=(1<<3);
PORTB|=(1<<3);
int_time0fistpwm();
while(1);
}
|
|