蜂鸣器是一个比较常见的电子器件,主要作用是哟关于报警,提醒。
蜂鸣器有两中类型,一种是无源蜂鸣器,没有驱动源,需要使用PWM控制蜂鸣器响,可以通过修改PWM的占空比或者频率来达到调整蜂鸣器声音音调的目的;还有一种是有源蜂鸣器,有驱动源,上电接高电平就会响。
本文就将以AB32VG1作为主控,RT-thread作为操作系统来操作无源蜂鸣器。
一、创建工程
使用RT-Thread Studio来创建工程。
1. 新增加两个文件app_beep.c和app_beep.h
2. 打开RT-Thread Settings,使能PWM2
二、电路连接
蜂鸣器驱动引脚连接:PE0 → Beep驱动引脚
三、无源蜂鸣器操作原理
无源蜂鸣器需要自己提供驱动源,也就是PWM信号,通过控制PWM驱动频率可以控制蜂鸣器输出音符。
本程序通过period来控制PWM频率,频率为1MHz/period KHz
人耳能够听到的声音频率为20Hz~20KHz,所以操作20KHz频率是听不见的。
驱动程序控制PWM循环输出1KHz~20KHz,当声音越接近20KHz,我们能听到的声音越小,占空比为50%,相对而言声音最大。占空比大小可以自己调节输出声音的大小。
四、操作代码
1. 创建Beep线程
static int Pwm_Thread_Init(void)
{
rt_thread_t beep_thread;
beep_thread = rt_thread_create("Beep_thread",
PWM_Thread_Entry,
RT_NULL,
512,
10,
10);
rt_thread_startup(beep_thread);
return 0;
}
2. 初始化PWM,初始化函数在main中while循环之前调用
#define PWM_DEV_NAME "lpwm2" /* PWM 设备名称 */
#define PWM_DEV_CHANNEL 1 /* PWM 通道 */
#define PWM_PERIOD (1000000u) // 1000000u
struct rt_device_pwm *pwm_dev; /* PWM 设备句柄 */
rt_uint32_t period, pulse;
void Pwm_Init(void)
{
period = PWM_PERIOD; /* 周期 = 1M/period kHz */
pulse = 0; /* PWM 脉冲宽度值(0 - period) */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
RT_ASSERT(pwm_dev != RT_NULL);
/* 设置 PWM 周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 0);
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
Pwm_Thread_Init();
}
3. PWM Beep驱动函数
static void PWM_Thread_Entry(void *para)
{
uint8_t i = 1;
while(1)
{
period = (uint32_t)(1000000/i);
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, period-1);
i++;
if(i > 20)
i = 1;
rt_thread_mdelay(1000);
}
}
全部0条评论
快来发表一下你的评论吧 !