本帖最后由 qq0901001 于 2014-7-1 10:04 编辑
各位大大,我在用Mega8做一个台灯项目,唤醒模式有这样一个要求
唤醒时间到达后,触发开机动作
我把开机过程分解为以下几个步骤:
【1】前30s,PWM从0开始,每3s增加100,同时蜂鸣器响一下(我用的是T1输出PWM——范围:0~1023,蜂鸣器是通过CPU延时来做)
【2】30~60s,PWM不再增加(此时PWM应该已经到了1000),但是蜂鸣器逐渐加快DI声速度:DI...DI...DIDI...DIDI...DIDIDIDID....
【3】60s过后,停止DI声
【4】要求:自动唤醒的过程中,如果有按键按下,就停止蜂鸣器提示,并停留在当前PWM下,完成开机
//蜂鸣器函数
void DI()
{
uchar a;
for(a=0;a<100;a++)
{
BEEP(); _delay_ms(1);
}
}
//T1——工作于PWM模式,初始化配置
void Init_PWM()
{
TCCR1A=0xa3;
TCCR1B=0x02;//10位相位修正PWM
}
在处理这一过程的时候,我是这样
if(wakeup_flag == 1) //唤醒标志位置位
{
if(t<=30) //前30s动作
{
if( t%3 == 0 ) //每3s动作一次
{
PWM_SET(OCR1A,OCR1A+100,OCR1B,OCR1B+100); //PWM渐变函数,两路同时输出
DI(); // 蜂鸣器发生
}
}
else if(t>30 && t<=60) DI();
else;
}
这样出来的结果是,蜂鸣器不能够正常发生,而是“刺啦刺啦”的伴随着PWM的增加,不是一声清脆的DI声
我试着注释掉 PWM输出这一行,就没问题,请问下大大们,是因为T1的PWM输出影响了这个蜂鸣器么
我开始以为是PWM输出频率太高,拖慢了CPU的速度,导致蜂鸣器用延时方法做会出现这种情况
我把蜂鸣器单独放到定时器0里 也是如此 百思不得其解 请大大们不吝赐教 感激不尽 谢过!
|