介绍
基于 RT-Thread 的 Pin 和 PWM 驱动的蜂鸣器控制软件包,可以容易地驱动有源蜂鸣器或无源蜂鸣器,产生各种间隔长短的鸣叫声。
对于使用无源蜂鸣器,还支持PM(电源管理)组件,能设置使得MCU运行频率发生变化时,有正确的发声频率;也可以设置在发声期间,阻止MCU进入STOP模式,维持正常的发声。
驱动原理
有源蜂鸣器:
直接驱动 GPIO 引脚产生各种间隔长短的电平信号。
无源蜂鸣器:
硬件上必须连接到 STM32 定时器的 PWM 输出通道,利用RT-Thread的 PWM 驱动,产生相应频率的方波脉冲,驱动无源蜂鸣器。
发声时 PM 组件省电原理,比如原来PM申请进入STOP模式,如果不处理,则进入STOP时,时钟被关断,发声自然也停止了,此软件包可以在发声时阻止MCU进入STOP模式。如发2声脉冲宽度500ms,周期1000ms,频率2500Hz,默认PM_SLEEP_MODE_IDLE
。则在发声时请求SLEEP模式,以维持声音不断,在不发声的间隙释放SLEEP模式,MCU 进入 STOP 模式,以节省电流:
1时间点 0ms 500ms 1000ms 1500ms 2000ms
2 _____________ _____________
3脉冲 ____| |____________| |____________
4
5载波 | 2500Hz | 无输出 | 2500Hz | 无输出 |
6
7MCU PM模式 | SLEEP MODE | STOP MODE | SLEEP MODE | STOP MODE |
获取软件包
先升级本地的软件包信息,在ENV中:
1pkgs --upgrade
使用 beep 软件包需要在 RT-Thread 的包管理中选中它,ENV 运行 menuconfig 后具体路径如下:
1RT-Thread online packages
2 peripheral libraries and drivers --->
3 [*] beep: Control the buzzer to make beeps at different intervals. --->
4 (X) Active buzzer
5 ( ) Passive buzzer
6
选中 beep 软件包后先选择有源蜂鸣器或无源蜂鸣器。
有源蜂鸣器设置界面:
1--- beep: Control the buzzer to make beeps at different intervals.
2 Buzzer type (Active buzzer) --->
3[*] Use heap with the beep thread stack created.
4 Version (latest) --->
5
若选中“Use heap with the beep thread stack created.”
(只有在内核中选中“ Using memory heap object”
选项才会出现),则从动态堆内存中分配一个beep线程句柄以及按照参数中指定的栈大小从动态堆内存中分配相应的空间,否则,初始化的是静态线程。
具体的线程栈大小及优先级设置,请查看 beep.h 头文件。
无源蜂鸣器设置界面:
1--- beep: Control the buzzer to make beeps at different intervals.
2 Buzzer type (Passive buzzer) --->
3(pwm1) Setting current PWM device name.
4(4) Setting current PWM device channel.
5(2700) Setting the best frequency(Hz) for buzzer.
6[*] Block the MCU power enter to stop mode on beeping.
7[*] Beep with the original frequency at MCU run frequency changed.
8[*] Use heap with the beep thread stack created.
9 Version (latest) --->
10
Setting current PWM device name:
对应使用的TIM号,TIM1为 pwm1,TIM2为pwm2,如此类推,同时,在ENV菜单的片上外设中要开启相应的TIM。
Setting current PWM device channel:
实际使用的TIM通道号,同时,在ENV菜单的片上外设中要开启相应的TIM通道号码。
Setting the best frequency(Hz) for buzzer:
输入无源蜂鸣器的最佳发声频率,单位Hz,也是蜂鸣器的共振频率。
Block the MCU power enter to stop mode on beeping:
此项能在使用PM组件时,在发“哔”声时,阻止MCU进入STOP模式,以防止正发声时因关断时钟而发声中断。
默认是 pm_request 了PM_SLEEP_MODE_IDLE
模式,若要修改,进 beep.h 修改PKG_BEEP_REQUEST_PM_MODE
宏。
Beep with the original frequency at MCU run frequency changed:
此项能在使用PM组件时,当MCU运行频率发生改变时,维持原来的最佳发声频率,不使发声频率随运行频率而改变。
API 简介
1void beep_init(rt_base_t pin, rt_base_t reset_level)
2
beep的初始化函数,必须的。
pin:为蜂鸣器驱动引脚号,可查看 drv_gpio.c
,或使用 GET_PIN()
宏得到。
reset_level:为蜂鸣器关断时引脚电平,PIN_LOW
或 PIN_HIGH
。
对无源蜂鸣器来说,这2个参数在初始化函数内部都没有使用到。
1void beep(rt_uint32_t nums, rt_uint32_t period, rt_uint32_t percent, rt_uint32_t freq)
2
nums:闪鸣次数。
period:蜂鸣器闪鸣的周期,以毫秒为单位,[10-100000],鸣叫和间歇即一个完整的周期。
percent:鸣叫的占空比,鸣叫的时间和周期的百分比,[1-100]。
freq:蜂鸣器鸣叫的发声频率,单位Hz,[0, 500-10000](0:维持上次的发声频率),此参数对有源蜂鸣器无作用。
1void beep_stop(void)
2
主动停止蜂鸣器.
1void beep_deinit(void)
2
一般用不到。
使用示例
1#include <beep.h>
2 ...
3/* 比如可以在main.c中使用,此为无源蜂鸣器使用,有源的一样,就发声频率不能控制 */
4int main(void)
5{
6 ...
7 /* 先初始化 beep */
8 /* 第一个参数为蜂鸣器驱动引脚号,可查看drv_gpio.c,或使用GET_PIN()宏得到,如下面为PA11脚 */
9 /* 第二个参数为蜂鸣器关断时引脚电平,PIN_LOW或PIN_HIGH */
10 /* 对无源蜂鸣器来说,这2个参数在初始化函数内部都没有使用到 */
11 beep_init(GET_PIN(A, 11), PIN_LOW);
12
13 /* 鸣叫3声,周期1000ms,鸣叫占空比50%,默认发声频率 */
14 beep(3, 1000, 50, 0);
15
16 rt_thread_mdelay(8000);
17
18 /* 鸣叫3声,周期1000ms,鸣叫占空比70%,2500Hz */
19 beep(3, 1000, 70, 2500);
20
21 rt_thread_mdelay(8000);
22
23 /* 鸣叫1声,周期800ms,鸣叫占空比100%,上一次的发声频率,即2500Hz */
24 beep(1, 800, 100, 0);
25
26 rt_thread_mdelay(5000);
27
28 /* 鸣叫20声,周期1000ms,鸣叫占空比50%,2000Hz */
29 beep(20, 1000, 50, 2000);
30
31 rt_thread_mdelay(5000);
32
33 /* 中途打断,停止鸣叫 */
34 beep_stop();
35
36 while(1)
37 rt_thread_mdelay(10000);
38}
在 Msh 控制台,可以使用 beep 命令发声:
1beep <nums> <period> [prcent] [freq]
前2个参数必选,后2个可以省略,可以输入 2、3、或 4 个参数,prcent默认50%,频率默认 0 。
RT-Thread 近期活动
现在报名即享三重福利,1、报名即可以领取往期能力认证培训资料大礼包 2、参与新能力认证考前培训 3、学生优惠价168元
扫码报名
企业人才服务:
在这个特殊时期,针对人才服务RT-Thread将开放更多的资源,如果你的企业在招聘嵌入式相关人才,可提交职位信息说明,RT-Thread将会通过微信公众号免费发布相关职位信息(要求RT-Thread技能的职位优先发布)
请详细登记您的职位信息,我们将尽快联系你确认岗位描述信息,安排发布
扫码即可提交需求
你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
长按二维码,关注我们
点击阅读原文,进入RT-Thread GitHub
你点的每个“在看”,我都认真当成了喜欢