本帖最后由 suoma 于 2010-3-12 21:17 编辑
我想用PWM输出红外编码的0,1.比如0是低电平800us高电平200us,1低电平为600us,高电平400us。在程序的中断中修改占空比,但是这样做后出现第一个波形就不是很准,周期短了100us,而修改后第一个周期波形明显不对。请熟悉的说下原因。
void OC1A_Port(void) //TCNT1
{
set_bit(DDRD,PD5);
//把OC1A设置为输出,在管脚设置为定时器功能时要设置管脚的方向
}
void OC1A_Init(void) //产生PWM,用于产生Start,0,1,End几种模式。有不同的初始化产生
{
TCCR1A = _BV(COM1A1); //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A将清零为低电平
//在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A将置位为高电平
TCCR1B = _BV(CS11) |_BV(WGM13);
//设置T1为相位与频率修正PWM模式8 TOP值为ICR1
ICR1 = 500; //ICR1控制分辨率 2-16
OCR1A = 100; //OCR1A控制占空比
TIMSK = _BV(OCIE1A) | _BV(TOIE1); //输出比较A匹配中断使能
}
int main(void)
{
cli(); //全局中断关
OC1A_Port(); //管脚初始化
OC1A_Init();
sei(); //全局中断开
while(1);
}
SIGNAL(TIMER1_COMPA_vect)
{
OCR1A = 400;
} |