目录
蜂鸣器介绍
蜂鸣器的驱动方式
ULN2003D芯片工作原理
实战预备知识:基础乐理
音名的分组
全音和半音的关系
音高的表示
五线谱中的符号定义
简谱上的符号定义
C调音符与频率对照表
相关计算
蜂鸣器介绍
蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号
蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。
不同的工程师画的蜂鸣器的符号不一样,比如上图中间的那张图的样子,
还有下图这种符号也表示蜂鸣器
或者直接画成一个喇叭的形式
它的原理图
PS:BZ是一个网络编号
蜂鸣器也分正负极,像下图中标了一个+极符号的这边引脚就是蜂鸣器的正极。如果引脚没有被剪过的话,长的一边为正极。
蜂鸣器的驱动方式
有源蜂鸣器的驱动方式
一般,有源蜂鸣器一般通电就可以响了。它的正极接到电源的正极,负极接地就额可以响了。
无源蜂鸣器的驱动方式
我们的开发板上是无源蜂鸣器,如果将无源蜂鸣器的正极接到电源的正极,负极接到IO口上,然后IO不断地输出一个频率,不断地震荡,根据这个频率,蜂鸣器也可以发声,并且频率可以由震荡去改变。
以上是两种蜂鸣器的一般驱动方式,但由于LED供电比较小,所以我们一般加一个驱动电路,最常见的是加一个三极管开关驱动电路
三极管分为NPN和PNP两种
NPN型的三极管开关是高电平导通的三极管开关
它相当于一个正常开关的外加一只手来控制这个开关的闭合,如果给这只手一个高电平,那么它就帮我们把这个开关闭合,如果给它一个低电平,它就帮我们把开关打开。
手的那端还接了一个限流电阻,它可以减少控制信号的电流,就是相当于把控制信号的驱动能力这一指标给弱化了。
实际的驱动来源于VCC这里
这个VCC给蜂鸣器提供功率信号,可以省下单片机的驱动能力。
同理,PNP型三极管开关也是一样的工作方式,但是它由低电平导通的。
这个限流电阻只需要能保证三极管开关能够饱和就可以了,1K欧或者10K欧的这个范围都行。
还有一个集成电路驱动的方式用的比较少
很少见到这种驱动方式,但是我们的开放板就是这种驱动方式。单片机的IO口不能直接驱动蜂鸣器,所以就过一个芯片,这个芯片叫做ULN2003(驱动芯片),它的原理图就在步进机的这里:
它和蜂鸣器的连接是这样:
ULN2003D芯片工作原理
那ULN2003D这个芯片是怎么工作的呢?我们要看一下芯片手册的介绍
其中这个达林顿晶体管也是一种三极管开关
一般也可以叫达林顿管为复合管,它可以增大驱动能力。
它是NPN型的三极管开关
然后再看芯片的逻辑框图(虽然图这样话的,但其实它是由达林顿管组成的)
中间那一列是非门(取反),如果输入为0,则输出1,输入1,则输出为0。
如果将它其中一个通路接上负载(比如说蜂鸣器),那么非门的输入端为1时,输出为0,则蜂鸣器就会响。
如果非门的输入端为0,则输出端为1,则这个芯片没有驱动能力,驱动无效,即使是别接了一个接了地的负载也不可以。
这一排LED其实是用来测试的
比如,可以来看一下它的应用电路,如果非门的输入端没有电平,这时,芯片的输出端接上一排负载(LED),当按下这个lamp test灯测试开关之后,那么就相当于芯片内部的LED的阴极接上了低电平0,则外部的LED就导通了,它就会亮。
然后我们51单片机是TTL电平,5V代表高电平,0V代表低电平
以上就把蜂鸣器的驱动原理讲完了。
总结一句话就是,我们只需要控制P15引脚输出1或者0就能控制蜂鸣器是否有电流,然后我们是无源蜂鸣器,我们就需要控制P15产生一个振动频率,蜂鸣器就跟着震动频率发声了。
PS:我们的单片机的设计不太合理,但是自己设计电路的时候,不能让无源蜂鸣器始终充电,很容易烧毁蜂鸣器
实战预备知识:基础乐理
接下来我们开始认识一下钢琴和乐谱,因为我们要用蜂鸣器发出有规律的音乐旋律。
由于我也不是学音乐的专业人士,我也是在网上现学了一下,我会把自己认为解释的好的文章的链接贴出来,大家可以直接点击查看,一定要稍微大概了解一下!
音名的分组
分组如图所示:
更详细的解释可以看这篇文章
链接:音名的分组 - 新芭网 (sin80.com)
全音和半音的关系
官方解释: 相邻的两个音之间,最小的距离叫半音。 钢琴上两个紧挨着的音,就是半音。两个半音的距离构成了一个全音。
更详细的解释可以看这篇文章
链接:3分钟了解钢琴乐理里的全音和半音 - 知乎 (zhihu.com)
音高的表示
如c1和c2相差8度,不同组之间是8度的关系
白键的音:以中央C为分界线,它的左边是降音,右边的是升音,数字头上一个点就是升一个8度,数字底下一个点就是降一个8度,两点就降两个8度
黑键的音:就要用到#(升音)和b(降音)符号,如果是#1就是1升高半音(往右边移一个键),如果是b1就是1降低半音(往左边移一个键)
然后弹钢琴的时候主要是按的音高、按的时长(时值)就可以弹出音乐来。
时值就是比如下图中的-符号,表示这个5的音占了两个拍子。
五线谱中的符号定义
再来看看五线谱中的符号定义
一般我们以四分音符为时间基准,这个四分音符可以是100ms也可以是200ms。
比如四分音符是500ms,那么二分音符就是它的两倍,也就是1000ms(1s),全音符就是2000ms(2s)
八分音符就是250ms,十六分音符就是150ms.....
这就跟我们的二进制很像。
简谱上的符号定义
再来看一下简谱上的符号定义
下图中的这符号1=D是调号,4/4是拍号
4/4是拍号,总的意思是以四分音符为一拍,每小节为四拍。
附点表示这个音符延长为原来的二分之一,比如原来这个音符是500ms,加了这个附点之后就变成500ms加上原来的一半=500ms+250ms=750ms。
每一小节的总时间是一样的,都是4*500ms=2000ms=2s
然后还要注意弹的时候的一些细节:
如果到这里还是看不懂乐理的话,可以到某站搜索一下基础乐理,看看基础的解释。
C调音符与频率对照表
有了前面的乐理基础,我们想用蜂鸣器模拟音乐的旋律的话还需要这个表:
这个表只是部分音和频率
表上说的C调就是对应我们前面说的这个D调,只不过我们上表是C调
C调简单说就是全部弹白色的钢琴键,其他调就会出现要弹黑键的情况
其中这个对应中央C键
这张表涵盖了钢琴上的这些键
一组中白色的键和黑色的键一共是12个键,正好对应表中的一列
那么我们就是根据表中的频率值去控制我们的定时器产生相应频率的计时,有了频率就有了计时频率、计时周期,有了周期计时然后就控制中断,再去控制IO的翻转,就可以控制我们的频率。
表上的这些频率的关系成一个平滑的曲线关系
我们以低音6为基准频率,其他频率都是以它为基准做一个倍数的关系
这一个a到下一个a是两倍的关系
一组中的12个键的频率是以等比数列进行平分的,也叫做12平分率
比如这组键的频率比都是1.06,所以是等比数列关系
那么这个a到它自己右边的键的频率是2的1/12次方,比如277=262*2^1/12
相关计算
因为我们是通过频率来产生对应的音符的,但是单片机的定时器是用周期来计时的,所以要将频率转换成周期。
定时器加1的时间就是1微秒,也就是一个机器周期(晶振为12兆),有了这个周期我们翻转IO口就可以控制频率。
重装载值=65536-周期/2(us)
以下是计算好的结果:
音符 | 频率(Hz) | 周期(us) | 周期/2(us) | 取整 | 重装载值 | 索引 |
1 | 262 | 3816.793893 | 1908.396947 | 1908 | 63628 | 1 |
1# | 277 | 3610.108303 | 1805.054152 | 1805 | 63731 | 2 |
2 | 294 | 3401.360544 | 1700.680272 | 1701 | 63835 | 3 |
2# | 311 | 3215.434084 | 1607.717042 | 1608 | 63928 | 4 |
3 | 330 | 3030.30303 | 1515.151515 | 1515 | 64021 | 5 |
4 | 349 | 2865.329513 | 1432.664756 | 1433 | 64103 | 6 |
4# | 370 | 2702.702703 | 1351.351351 | 1351 | 64185 | 7 |
5 | 392 | 2551.020408 | 1275.510204 | 1276 | 64260 | 8 |
5# | 415 | 2409.638554 | 1204.819277 | 1205 | 64331 | 9 |
6 | 440 | 2272.727273 | 1136.363636 | 1136 | 64400 | 10 |
6# | 466 | 2145.922747 | 1072.961373 | 1073 | 64463 | 11 |
7 | 496 | 2016.129032 | 1008.064516 | 1008 | 64528 | 12 |
1 | 523 | 1912.045889 | 956.0229446 | 956 | 64580 | 13 |
1# | 554 | 1805.054152 | 902.5270758 | 903 | 64633 | 14 |
2 | 587 | 1703.577513 | 851.7887564 | 852 | 64684 | 15 |
2# | 622 | 1607.717042 | 803.8585209 | 804 | 64732 | 16 |
3 | 659 | 1517.450683 | 758.7253414 | 759 | 64777 | 17 |
4 | 698 | 1432.664756 | 716.3323782 | 716 | 64820 | 18 |
4# | 740 | 1351.351351 | 675.6756757 | 676 | 64860 | 19 |
5 | 784 | 1275.510204 | 637.755102 | 638 | 64898 | 20 |
5# | 831 | 1203.369434 | 601.6847172 | 602 | 64934 | 21 |
6 | 880 | 1136.363636 | 568.1818182 | 568 | 64968 | 22 |
6# | 932 | 1072.961373 | 536.4806867 | 536 | 65000 | 23 |
7 | 988 | 1012.145749 | 506.0728745 | 506 | 65030 | 24 |
1 | 1046 | 956.0229446 | 478.0114723 | 478 | 65058 | 25 |
1# | 1109 | 901.7132552 | 450.8566276 | 451 | 65085 | 26 |
2 | 1175 | 851.0638298 | 425.5319149 | 426 | 65110 | 27 |
2# | 1245 | 803.2128514 | 401.6064257 | 402 | 65134 | 28 |
3 | 1318 | 758.7253414 | 379.3626707 | 379 | 65157 | 29 |
4 | 1397 | 715.8196135 | 357.9098067 | 358 | 65178 | 30 |
4# | 1480 | 675.6756757 | 337.8378378 | 338 | 65198 | 31 |
5 | 1568 | 637.755102 | 318.877551 | 319 | 65217 | 32 |
5# | 1661 | 602.0469597 | 301.0234798 | 301 | 65235 | 33 |
6 | 1760 | 568.1818182 | 284.0909091 | 284 | 65252 | 34 |
6# | 1865 | 536.1930295 | 268.0965147 | 268 | 65268 | 35 |
7 | 1976 | 506.0728745 | 253.0364372 | 253 | 65283 | 36 |
下一节开始代码演示!