Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Devices
为蜂鸣器写了个驱动软件包,实现各种间隔长短的发声
发布于 2020-03-19 21:33:59 浏览:1473
订阅该版
* 本帖最后由 sunwan 于 2020-3-19 21:35 编辑 * 项目地址: [github](https://github.com/Sunwancn/rtt-pkgs-beep.git) [gitee](https://gitee.com/sunwancn/rtt-pkgs-beep.git) 介绍 基于 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 模式,以节省电流: ```时间点 0ms 500ms 1000ms 1500ms 2000ms _____________ _____________ 脉冲 ____| |____________| |____________ 载波 | 2500Hz | 无输出 | 2500Hz | 无输出 | MCU PM模式 | SLEEP MODE | STOP MODE | SLEEP MODE | STOP MODE |``` 获取软件包 先升级本地的软件包信息,在ENV中: ```pkgs --upgrade``` 使用 beep 软件包需要在 RT-Thread 的包管理中选中它,ENV 运行 menuconfig 后具体路径如下: ```RT-Thread online packages peripheral libraries and drivers ---> (*) beep: Control the buzzer to make beeps at different intervals. ---> (X) Active buzzer ( ) Passive buzzer``` 选中 beep 软件包后先选择有源蜂鸣器或无源蜂鸣器。 有源蜂鸣器设置界面: ```--- beep: Control the buzzer to make beeps at different intervals. Buzzer type (Active buzzer) ---> (*) Use heap with the beep thread stack created. Version (latest) --->``` 若选中“Use heap with the beep thread stack created.”(只有在内核中选中“ Using memory heap object” 选项才会出现),则从动态堆内存中分配一个beep线程句柄以及按照参数中指定的栈大小从动态堆内存中分配相应的空间,否则,初始化的是静态线程。 具体的线程栈大小及优先级设置,请查看 beep.h 头文件。 无源蜂鸣器设置界面: ```--- beep: Control the buzzer to make beeps at different intervals. Buzzer type (Passive buzzer) ---> (pwm1) Setting current PWM device name. (4) Setting current PWM device channel. (2700) Setting the best frequency(Hz) for buzzer. (*) Block the MCU power enter to stop mode on beeping. (*) Beep with the original frequency at MCU run frequency changed. (*) Use heap with the beep thread stack created. Version (latest) --->``` 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 简介 ```void beep_init(rt_base_t pin, rt_base_t reset_level)``` beep的初始化函数,必须的。 pin: 为蜂鸣器驱动引脚号,可查看 drv_gpio.c,或使用 GET_PIN() 宏得到。 reset_level: 为蜂鸣器关断时引脚电平,PIN_LOW 或 PIN_HIGH。 对无源蜂鸣器来说,这2个参数在初始化函数内部都没有使用到。 ```void beep(rt_uint32_t nums, rt_uint32_t period, rt_uint32_t percent, rt_uint32_t freq)``` nums: 闪鸣次数。 period: 蜂鸣器闪鸣的周期,以毫秒为单位,[10-100000],鸣叫和间歇即一个完整的周期。 percent: 鸣叫的占空比,鸣叫的时间和周期的百分比,[1-100]。 freq: 蜂鸣器鸣叫的发声频率,单位Hz,[0, 500-10000](0:维持上次的发声频率),此参数对有源蜂鸣器无作用。 ```void beep_stop(void)``` 主动停止蜂鸣器。 ```void beep_deinit(void)``` 几乎没什么用。 使用示例 ```#include
... /* 比如可以在main.c中使用,此为无源蜂鸣器使用,有源的一样,就发声频率不能控制 */ int main(void) { ... /* 先初始化 beep */ /* 第一个参数为蜂鸣器驱动引脚号,可查看drv_gpio.c,或使用GET_PIN()宏得到,如下面为PA11脚 */ /* 第二个参数为蜂鸣器关断时引脚电平,PIN_LOW或PIN_HIGH */ /* 对无源蜂鸣器来说,这2个参数在初始化函数内部都没有使用到 */ beep_init(GET_PIN(A, 11), PIN_LOW); /* 鸣叫3声,周期1000ms,鸣叫占空比50%,默认发声频率 */ beep(3, 1000, 50, 0); rt_thread_mdelay(8000); /* 鸣叫3声,周期1000ms,鸣叫占空比70%,2500Hz */ beep(3, 1000, 70, 2500); rt_thread_mdelay(8000); /* 鸣叫1声,周期800ms,鸣叫占空比100%,上一次的发声频率,即2500Hz */ beep(1, 800, 100, 0); rt_thread_mdelay(5000); /* 鸣叫20声,周期1000ms,鸣叫占空比50%,2000Hz */ beep(20, 1000, 50, 2000); rt_thread_mdelay(5000); /* 中途打断,停止鸣叫 */ beep_stop(); while(1) rt_thread_mdelay(10000); }``` 在 Msh 控制台,可以使用 beep 命令发声: ```beep
[prcent] [freq]``` 前2个参数必选,后2个可以省略,可以输入 2、3、或 4 个参数,prcent默认50%,频率默认 0 。
查看更多
3
个回答
默认排序
按发布时间排序
zmmfly
2020-03-19
这家伙很懒,什么也没写!
楼主厉害,希望频率后面能扩到1-20khz,用蜂鸣器编千本樱 :lol
passion
2020-03-19
这家伙很懒,什么也没写!
66666 收藏
sunwan
2020-03-20
这家伙很懒,什么也没写!
>楼主厉害,希望频率后面能扩到1-20khz,用蜂鸣器编千本樱 --- 蜂鸣器太低和太高频率的音量下降很大的,不过你可以修改beep.h的PKG_BEEP_FREQ_MIN和PKG_BEEP_FREQ_MAX宏的值。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
sunwan
这家伙很懒,什么也没写!
提问
10
回答
91
被采纳
0
关注TA
发私信
相关问题
1
问个问题,ili9320驱动里面rt_hw_lcd_draw_blit_line 这个函数是干什么用的
2
LCD双缓冲有什么好的办法实现
3
LCD NT35510 驱动代码
4
io设备驱动的疑惑与建议
5
液晶屏驱动 U8g2 移植
6
求助:在模板上添加LCD模块出现L6406E错误
7
hwtimer硬件定时器驱动和使用经验
8
硬件定时器超时时间计算问题
9
请教spi驱动lcd显示屏问题
10
rtt-master(3.1.1)bsp—armfly中drv_lcd.c中是不是错了啊?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
5
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部