CH573,Peripheral例程的任务中用开断PWM来控制蜂鸣器

//蜂鸣器调用函数,输入响哑的周期和响次数

void bz(uint16 peri, uint16 nums)

{

    st_bz.bzflag = 0;

    st_bz.bzperi = peri >> 1;//周期分响半周期和哑半周期

    st_bz.bznums = nums;

    tmos_set_event(UsrTaskID, BZ_EVENT);

}


//任务处理

if(events & BZ_EVENT) //BZ发生事件

{

        if(st_bz.bznums > 0) //判断响次数

        {

            if(st_bz.bzflag == 0) 

            {//响的周期

                st_bz.bzflag = 1;

                PWMX_ACTOUT( CH_PWM11, 255 / 4, Low_Level, ENABLE ); //2700HZ PWM开,默认低电平,高电平有效25%

            }

            else

            {//哑的周期

                st_bz.bzflag = 0;

                PWMX_ACTOUT( CH_PWM11, 255 / 4, Low_Level, DISABLE ); //2700HZ PWM关,默认低电平,高电平有效25%

                st_bz.bznums--; //一个周期后“响次数”减少一次

            }

            tmos_start_task(UsrTaskID, BZ_EVENT, st_bz.bzperi);

        }

        return events ^ BZ_EVENT;

}


//调用函数

bz(480, 1);  //300ms,150ms

调用该函数,应该响声为150ms,但实际相声远小于150ms,如果:

bz(480, 2);

第一响声很短,第二响声就正常150ms


这是怎么回事?


如果用下面进行测试,是正常的;

PWMX_ACTOUT( CH_PWM11, 255 / 4, Low_Level, ENABLE );

mDelaymS(150);

PWMX_ACTOUT( CH_PWM11, 255 / 4, Low_Level, DISABLE ); 



问题已解决!!


初始化PWM:

PWMX_CLKCfg(87);

PWMX_CycleCfg( PWMX_Cycle_255 );

PWMX_ACTOUT( BZ_PWM, 255 / 4, Low_Level, DISABLE );

即便是这样的初始化,在启动的时候,只有下面语句去打开是不可靠的

PWMX_ACTOUT( BZ_PWM, 255 / 4, Low_Level, ENABLE );


启动的正确做法是:

PWMX_CLKCfg(87);

PWMX_CycleCfg( PWMX_Cycle_255 );

PWMX_ACTOUT( BZ_PWM, 255 / 4, Low_Level, ENABLE );




只有登录才能回复,可以选择微信账号登录