蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“ZZG”、“LB”、“JD”等)表示。
本文就其简要区分方法和驱动电路作简要总结
有源蜂鸣器和无源蜂鸣器
区分:
有源蜂鸣器和无源蜂鸣器.jpg-
有源蜂鸣器a,高度为9mm,而无源蜂鸣器b的高度为8mm
-
还可以用万用表电阻档Rxl档测试,黑表笔接蜂鸣器 "-"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器;有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声
“源”是什么?
这里的“源”不是指电源,而是指震荡源,
也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫;
而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它
有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。
各有所长
无源蜂鸣器的优点是:
- 便宜
- 声音频率可控,可以做出“多来米发索拉西”的效果
- 在一些特例中,可以和LED复用一个控制口
有源蜂鸣器的优点是:程序控制方便
驱动电路
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的*(但AVR可以驱动小功率蜂鸣器),所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了
蜂鸣器驱动电路一般都包含以下几个部分:一个三极管、一个蜂鸣器、一个续流二极管和一个电源滤波电容。
1.蜂鸣器
发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,其主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波)等。这些都可以根据需要来选择。
2.续流二极管
蜂鸣器本质上是一个感性元件,其电流不能瞬变,因此必须有一个续流二极管提供续流。否则,在蜂鸣器两端会产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其它部分。
3.滤波电容
滤波电容C1的作用是滤波,滤除蜂鸣器电流对其它部分的影响,也可改善电源的交流阻抗,如果可能,最好是再并联一个220uF的电解电容。
4.三极管
三极管起开关作用,其基极的高电平使三极管饱和导通,使蜂鸣器发声;而基极低电平则使三极管关闭,蜂鸣器停止发声。
驱动方式
单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动
PWM 输出口直接驱动是利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统寄存器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些寄存器产生符合蜂鸣器要求的频率的波形之后,只要打开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。比如频率为2000Hz 的蜂鸣器的驱动,可以知道周期为500μs,这样只需要把PWM 的周期设置为500μs,占空比电平设置为250μs,就能产生一个频率为2000Hz 的方波,通过这个方波再利用三极管就可以去驱动这个蜂鸣器了
而利用I/O 定时翻转电平来产生驱动波形的方式会比较麻烦一点,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为2500Hz 的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O 口每200μs 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。
基于STM32F103ZET6的蜂鸣器的PWM输出的设计
STM32的单个IO口最大可提供25mA电流(数据手册),蜂鸣器驱动电流为30mA左右,因此,通过三极管扩流后再驱动蜂鸣器,只需要不到1mA的电流就够了
蜂鸣器与STM32连接原理图
image.png图中我们用到一个 NPN 三极管(S8050)来驱动蜂鸣器, R33 主要用于防止蜂鸣器的误发
声。当 PB.8 输出高电平的时候,蜂鸣器将发声, 当 PB.8 输出低电平的时候,蜂鸣器停止发声。
单片机音乐产生的原理
音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音,要想产生音频脉冲信号,需要算出某音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半周期的时间,每当计时到后就输出脉冲的I/O口反相,这样就在此I/O口上得到此脉冲的频率。
音阶与频率的对照: 百度即可
PWM的频率有个计算公式:
image
我们需要让PWM的这个频率与实际的音调频率相一致,那么我们可以这样来设定:设需要的音调频率为f,psc为8,arr为8M/f-1,我们就正好得到了F=f。我们只需要不断变化这个f值,就能变化音调。
四分之一音符、二分之一音符、全音符,我们可以通过delay_ms延时函数来实现。
除了arr和psc我们需要设定外,音乐的音量也需要通过下面的函数来实现。
TIM_SetCompare2(TIM3,ulVal/100);
这里面CCR2值为ulVal/100,是控制PWM的输出脉宽。这个值越大,发出的声音越大。
关于音符0的处理以及改进
在我写完的程序中,我是这样处理的,一旦遇到音符0,让PWM停止输出。有想过关闭TIM14和PORTF时钟,但是没有用——因为用同样的方法,在一首歌结束之后就是一段相同频率的杂音。所以这种方法是不可以让PWM输出停止的。最后换了个方法,把PF9设置成普通IO口而且是输入模式就可以了,就不会有噪声了
最后,遇到音符0的时候,只需要将PWM输出频率变大,让蜂鸣器发出一个人耳听不到的超声波就可以了
按键的使用
采用NVIC中断实现
音量加减:KEY0 ,KEY1 Volume(); CCR2值为ulVal/100,是控制PWM的输出脉宽。这个值越大,发出的声音越大
暂停与继续:KEY_UP PlayControl(); (默认播放,flag=0,按下一次,falg=1,break;)
网友评论