本帖最后由 feiyinglala 于 2014-1-8 18:43 编辑
用的是Atmel mega16A 编译器是 ICCAVR v7.22 晶振是7.3728M
想把OCR1A直接赋值为0x04B0;
可是定时器这么初始化后,示波器看到的不符合这个结果。倒是OCR1AL的B0对着,OCR1AH却依然为0
初始代码如下:
static void Timer1_INIT(void)
{
uchar temp;
TCCR1B = 0x00; //停止定时器
TCCR1A = 0xc2; //A通道工作模式11,相位修正PWM,OC1A引脚在上升匹配时,置高电平
//PWM计数器峰值及波的频率
ICR1H = 0x07; //设定了定时器1比较的峰值,同时也确定了PWM的周期
ICR1L = 0xff;
//输出占空比,与OCR1大小成反比
OCR1AH = 0x04; //???为何此句不奏效
OCR1AL = 0xB0;
TCNT1H = 0x00; //计数器置0
TCNT1L = 0x00;
TIMSK &= ~0x3c; //不使能定时器1的A通道比较匹配,否则电路跑得太慢
TCCR1B = 0x11; //启动定时器1,时钟不分频
}
按照4楼所建议的方法,参照范例程序赋值顺序就正常了。正常工作的代码如下
static void Timer1_INIT(void)
{
TCCR1B = 0x00; //停止定时器
TIMSK &= ~0x3c; //不使能定时器1的A通道比较匹配,否则电路跑得太慢
TCNT1H = 0x00; //计数器置0
TCNT1L = 0x00;
//输出占空比,与OCR1大小成反比
OCR1AH = 0x04; //???为何此句不奏效
OCR1AL = 0xB0;
//PWM计数器峰值及波的频率
ICR1H = 0x07; //设定了定时器1比较的峰值,同时也确定了PWM的周期
ICR1L = 0xff;
TCCR1A = 0xc2; //A通道工作模式11,相位修正PWM,OC1A引脚在上升匹配时,置高电平
TCCR1B = 0x11; //启动定时器1,时钟不分频
}
|