【STM32 基础实验蜂鸣器发声】
文章目录
- 一、认识蜂鸣器
- (1)蜂鸣器
- (2)蜂鸣器分类
- 二、基于stm32f10c8t6 基础实验蜂鸣器发声
- (1)本实验蜂鸣器型号说明
- (2)蜂鸣器发声原理
- (3)代码部分
- (4)效果展示
- 三、总结与扩展
- 附上参考文献链接与视频链接出处
一、认识蜂鸣器
(1)蜂鸣器
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
(2)蜂鸣器分类
BUZZER蜂鸣器的分类:
1、按其驱动方式的原理分,可分为:有源蜂鸣器(内含驱动线路,也叫自激式蜂鸣器)和无源蜂鸣器(外部驱动,也叫他激式蜂鸣器);
2、按构造方式的不同,可分为:电磁式蜂鸣器和压电式蜂鸣器;
3、按封装的不同,可分为:DIP BUZZER(插针蜂鸣器)和SMD BUZZER(贴片式蜂鸣器);
4、按电流的不同,可分为:直流蜂鸣器和交流蜂鸣器,其中,以直流最为常见压电式蜂鸣器,用的是压电材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变。
电磁式蜂鸣器,主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜。
由于两种蜂鸣器发音原理不同,压电式结构简单耐用但音调单一,适用于报警器等设备。而电磁式由于音质好,所以多用于语音、音乐等设备。
二、基于stm32f10c8t6 基础实验蜂鸣器发声
(1)本实验蜂鸣器型号说明
笔者本次实验用到的是有源蜂鸣器与无源蜂鸣器,见下图所示:
有源蜂鸣器模块:
无源蜂鸣器模块:
(2)蜂鸣器发声原理
有源蜂鸣器模块低电平触发,通过配置I/O口,给它低电平即可发声。可见电路图如下:
有源蜂鸣器电路图:
无源蜂鸣器模块,通过配置方波,方波的话可以联想到PWM,使配置PWM占空比、频率即可驱动发声。可见电路图如下:
无源蜂鸣器电路图:
然后了解一下PWM
我们就以以STM32单片机为例,其IO口只能输出高电平和低电平。
假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。
电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。
比方说,占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V,如下图所示。
也就是说,在一定的频率下,通过不同的占空比即可得到不同大小的输出模拟电压,PWM就是通过这种原理实现数字模拟信号转换的。
PWM应用
以经常使用的呼吸灯举例。
LED呼吸灯本次实验也使用了一颗LED来实现呼吸灯,衬托无源蜂鸣器的实验现象,
一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是误以为是一个常亮的LED灯。
由于频率很高时看不到闪烁,占空比越大LED越亮,占空比越小LED越暗。所以,在频率一定时,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。
(3)代码部分
有源蜂鸣器部分代码:(用了一颗LED循环闪烁,表示正在跑程序)
beep.c
#include "sys.h"
#include "beep.h"void BEEP_Init(void){GPIO_InitTypeDef GPIO_InitStructure;//声明结构体——GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//时钟使能GPIOB//RCC APB2PeriphClockcmd(RCC APB2Periph GPIOB | RCC APB2Periph AFIO,ENABLE);//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//定义引脚pin_8GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//频率50MhzGPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_8);//低电平触发所以置位高电平}
main.c
#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"int main()
{BEEP_Init();delay_init(); LED_Init();while(1){shansuo();GPIO_SetBits(GPIOB,GPIO_Pin_8); delay_ms(500);GPIO_ResetBits(GPIOB,GPIO_Pin_8); delay_ms(500);}
}
// An highlighted block
var foo = 'bar';
无源蜂鸣器部分代码:(用了一颗LED循环呼吸灯,表示正在跑程序)
pwm.c
#include "stm32f10x.h"void PWM_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//输出比较的结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时钟使能GPIOARCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //复用时开启//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); //重映射//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //解除PA15调试功能GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_7;//定义引脚pin_0|Pin_15GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出模式,改变引脚控制权给片上外设GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//频率50MhzGPIO_Init(GPIOA,&GPIO_InitStructure);TIM_InternalClockConfig(TIM2);TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInitStructure.TIM_Period = 100-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到20为2ms //ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 720-1; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 //pscTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCStructInit(&TIM_OCInitStructure);//用StructInit赋初始值函数,可避免语法错误TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出比较的模式TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较的极性TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较的使能TIM_OCInitStructure.TIM_Pulse = 0;//输出比较配置CCR条件码寄存器 //占空比50% 占空比10% 占空比90%TIM_OC1Init(TIM2,&TIM_OCInitStructure);//查看引脚定义表知道,非重映射默认只有PA0输出TIM_OC2Init(TIM3,&TIM_OCInitStructure);/*公式:PWM频率:Freq = CK_PSC/(PSC+1)/(ARR+1)PWM占空比:Doty = CCR/(ARR+1)PWM分辨率:Reso = 1/(ARR+1) */TIM_Cmd(TIM2, ENABLE); //使能TIMx外设TIM_Cmd(TIM3, ENABLE); //使能TIMx外设}void PWM_SetCompare1(uint16_t Compare1)//单独更改通道1的值对应TIM_OC1Init ,从而改变CCR实现占空比变化
{TIM_SetCompare1(TIM2, Compare1);}void PWM_SetCompare2(uint16_t Compare2)//单独更改通道1的值对应TIM_OC2Init ,从而改变CCR实现占空比变化
{TIM_SetCompare2(TIM3, Compare2);}
main.c
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "pwm.h"uint8_t i;int main(void)
{ delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);PWM_Init();while(1){for(i=0;i<=100;i++){PWM_SetCompare1(i);PWM_SetCompare2(i);delay_ms(20);}for(i=0;i<=100;i++){PWM_SetCompare1(100-i);PWM_SetCompare2(100-i);delay_ms(20);}}
}
(4)效果展示
(声音可能刺耳,注意调节音量;声音已做过处理)
实验现象:有源蜂鸣器发声鸣叫
有源蜂鸣器
实验现象:无源蜂鸣器发声鸣叫
无源蜂鸣器
三、总结与扩展
总结:
根据以上内容,学习有源蜂鸣器,跟LED类似还是容易理解的,给电信号驱动发声。
无源蜂鸣器主要是应用PWM使能方波,驱动发声。
针对可能出现的问题,说明一下:
(1)蜂鸣器模块的触发的电平与代码对应
(2)蜂鸣器声音小,可能是额定电压或功率不够,可适当提高电压;还可能是硬件坏了的问题,或者铜暴露出来导致的短路。
所以要有信心一步步积累理论和实践经验,一起学习加油!
扩展:可通过有源蜂鸣器可以做警报、提醒,如声光报警、人体红外等实验。无源蜂鸣器可以做闹铃、音乐等实验。那么就分享到这,大胆尝试实践探索吧,欢迎讨论。
附上参考文献链接与视频链接出处
链接: 参考PWM知乎
链接: 参考PWM视频
链接: 有源蜂鸣器视频
链接: 无源蜂鸣器视频
链接: 源码例程
提取码:3232
【STM32 基础实验蜂鸣器发声】相关推荐
- NB-IOT实验练习2——STM32基础实验
STM32基础实验 上一节介绍了江苏学蠡信息科技有限公司的无线传感器网络实验平台关于NB-IOT实验所需要的各项硬件以及所需要的软件组成部分,这一章,主要是使用STM32F103单片机的基础实验进行介 ...
- stm32无源蜂鸣器定时器_使用STM32控制无源蜂鸣器发声播放音乐
[实例简介] 利用GPIO控制无源蜂鸣器发声,播放音乐.使用SysTick延时,使用位带操作寻址IO口引脚. [实例截图] [核心代码] pMusic ├── CMSIS │ ├── core_c ...
- 【Arduino基础】蜂鸣器发声实验
实验现象 使用arduino直接驱动蜂鸣器发出不同频率的声音. 理论学习 小型蜂鸣器因其体积小(直径只有 6mm).重量轻.价格低.结构牢靠,而广泛地应用在各种需要发声的电器设备.电子制作和单片机等电 ...
- STM32 使用STM32F103控制无源蜂鸣器发声播放音乐
使用STM32控制无源蜂鸣器发声播放音乐 [注:学习STM32总结做的笔记,大神勿喷.有不足之处还望不吝赐教. -----本篇大部分转载而来,有侵权请联系作者,谢谢.] 原博客地址: https:// ...
- Ardino基础教程 7_蜂鸣器发声实验
实验七:蜂鸣器发声 用Arduino 可以完成的互动作品有很多,最常见也最常用的就是声光展示了,前面一直都是在用LED 小灯在做实验,本个实验就让大家的电路发出声音,能够发出声音的最常见的元器件就是蜂 ...
- 【电子电路基础实验】无源蜂鸣器
文章目录 背景 一.硬件驱动器 二.软件驱动器 本文记录一段旅程–控制无源蜂鸣器嗡嗡作响. 背景 小时候,看科幻电影都是瞪大了眼睛,竖直了耳朵,生怕错过了精彩的情节.仙女座星系,宇宙飞船距某颗类地行星 ...
- STM32单片机开发之让蜂鸣器发声
本篇文章依旧是按照之前的stm32f10x系列单片机进行开发,但博主会教大家如何去看电路原理图以及如何去看开发手册,并且本系列文章不使用stm32提供的库函数,完全从0开始编写,这样能带大家更好的认识 ...
- stm32无源蜂鸣器定时器_stm32实现无源蜂鸣器发声
蜂鸣器是一种发声设备,被广泛用于计算机.打印机.复印机.报警器.电子玩具等.蜂鸣器分为有源蜂鸣器和无源蜂鸣器.那么什么是有源,什么是无源呢?这里的"源"指的是,振荡电路.也就是说, ...
- STM32学习之路——麒麟座V3.2开发板蜂鸣器发声问题
因为蜂鸣器使用了PB.3口,该口同时也用于JTAG调试.查询芯片手册知道默认PB3是用作JTDO,要用作普通IO需要开启端口重映射.所以开启重映射,关闭JTAG功能后即可正常操作IO口控制蜂鸣器发声. ...
- 单片机STC89C51入门学习笔记--基础实验例程(一)
文章目录 前言 1. 点亮第一个LED 1.1 代码 1.2 编译 1.3 程序下载 1.4 结果展示 1.5 常见问题及解决办法 2. LED灯闪烁 2.1 代码 2.2 编译 2.3 程序下载 2 ...
最新文章
- 波普艺术比较适合团队活动宣传海报设计风格,除了波普还有其他哪些艺术流派值得我们学习呢?
- _fseeki64在linux下的头文件,fseek能处理2GB以上的文件吗?
- C语言:关键字volatile详解!
- 第6章 数据存储全方案,详解持久化技术
- 洛谷 P1967货车运输 并查集+贪心 不需要用LCA!
- 全面介绍Windows内存管理机制及C++内存分配实例(三):虚拟内存
- java 运用poi读取Excel 文件代码 demo
- 支付宝手机网站支付(基于Java实现支付宝手机网站支付)
- EasyUI三级联动下拉框
- Android7.1编译SDK报错解决方法总结
- dubbo的基于java的路由_1 | Dubbo:探讨标签路由的实现
- L3_08——图中所有边都是相等的常数
- mysql常用命令添加外键主键约束存储过程索引
- 英国正在大举进军AI,看懂其三大投资走向
- win10系统架设魔兽服务器,win10系统局域网魔兽争霸无法联机的步骤
- 服务器日志显示system特殊登陆,事件查看器 安全 特殊登陆 什么意思??
- Ubuntu 常用命令
- 风雨二十载:OpenGL 4.3规范发布
- 日常工作笔记0807
- 【散分】庆祝自己的csdn博客突破100万访问量
热门文章
- multism中ui和uo应该怎么表示_Multisim中节点如何标记
- 计算机无法安装小丸工具箱,小丸工具箱
- 牛逼,70行代码开启微信分身术,让你无限开启多个微信
- 带头节点的链式存储栈基本操作(进栈、出栈、获取栈顶元素)
- 广和通工业级5G模组产品线一览到底
- Gartner首发中国数据库市场指南,巨杉数据库代表数据库领域厂商入选
- 幼儿抽象逻辑思维举例_幼儿园大班数学说课稿——7的分解组成
- 服务器自动关闭远程打印服务,服务器能远程链接远程打印机不
- 解决java.lang.NoClassDefFoundError: com.android.tools.fd.runtime.AppInfo
- NetBIOS、NETBEUI、IPX/SPX