前言:将CC2640R2F中一个管脚设置成PWM模式,然后接一个有源蜂鸣器,这样能产生滴滴的声音,通过改变PWM的占空比或者频率能产生不同的滴滴声。接下来看我们如何实现。
初始化:我们用的是DIO5作为PWM脚
void HwPWMInit(void)
{
PWM_init();
PWM_Params_init(&PWMparams);
//Buzzer
PWMparams.idleLevel = PWM_IDLE_LOW;
PWMparams.periodUnits = PWM_PERIOD_HZ;
PWMparams.periodValue = 100;
PWMparams.dutyUnits = PWM_DUTY_FRACTION;
PWMparams.dutyValue = PWM_DUTY_FRACTION_MAX/2;
PWMHandleBuzzer = PWM_open(CC2640R2DK_5XD_PWM0, &PWMparams);
}
有人可能有点纳闷,我们不是把IDO5作为PWM管脚,怎么没有具体看到怎么定义的,其实CC2640R2DK_5XD_PWM0是一个索引
typedef enum CC2640R2DK_5XD_PWMName {
CC2640R2DK_5XD_PWM0 = 0,
CC2640R2DK_5XD_PWM1,
CC2640R2DK_5XD_PWM2,
CC2640R2DK_5XD_PWM3,
CC2640R2DK_5XD_PWM4,
CC2640R2DK_5XD_PWM5,
CC2640R2DK_5XD_PWM6,
CC2640R2DK_5XD_PWM7,
CC2640R2DK_5XD_PWMCOUNT
} CC2640R2DK_5XD_PWMName;
我们可以根据自己的需求定义多个PWM管脚,这里我们只定义一个。
PWMTimerCC26XX_Object pwmtimerCC26xxObjects[CC2640R2DK_5XD_PWMCOUNT];
const PWMTimerCC26XX_HwAttrs pwmtimerCC26xxHWAttrs[CC2640R2DK_5XD_PWMCOUNT] = {
{ .pwmPin = DIO5, .gpTimerUnit = CC2640R2DK_5XD_GPTIMER2A }, //管脚定义
};
const PWM_Config PWM_config[CC2640R2DK_5XD_PWMCOUNT] = {
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[CC2640R2DK_5XD_PWM0], &pwmtimerCC26xxHWAttrs[CC2640R2DK_5XD_PWM0] },
};
const uint_least8_t PWM_count = CC2640R2DK_5XD_PWMCOUNT;
这样我们就完成了PWM的初始化。
改变频率:PWM_setPeriod(PWMHandleBuzzer, 450);
//周期越大,频率越小,蜂鸣器越低沉
//周期越小,频率越大,蜂鸣器越高昂
改变占空比:int_fast16_t PWM_setDuty(PWM_Handle handle, uint32_t duty);
打开PWM: PWM_start(PWMHandleBuzzer);
关闭PWM: PWM_stop(PWMHandleBuzzer);