初玩树莓派B(三) 控制蜂鸣器演吹打曲 8090安适门户
步进电机以及无源蜂鸣器这些都需要脉冲信号才华够驱动,此次测验考试用GPIO的PWM接口驱动无源蜂鸣器弹奏一曲《一闪一闪亮晶晶》。
无源蜂鸣器和有源蜂鸣器
主要是当初我本身也没有意识到蜂鸣器还区分有源和无源的,买得手接上电源,就是不作声,这才发明我买的蜂鸣器是无源的蜂鸣器。
无源蜂鸣器:
1. 无源内部没有震荡源,直流信号无法让它鸣叫。必需用去震荡的电流驱动它,2K-5KHZ的方波PWM (Pulse Width Modulation脉冲宽度调制)。 5KHZ的电流方波是啥意思?那就是每秒震动5K次,每一个完整的周期占用200us的时间,高点平占一部分时间,低电平占一部分时间。
2. 声音频率可控,可以做出差此外音效。
有源蜂鸣器:
内部带震荡电路,一通电就鸣叫,所以可以跟前面LED一样,给个高电平就能响,编程比无源的便利。
无源的比有源的自制,无源的2毛,有源的4毛。我买的无源蜂鸣器,该蜂鸣器阻抗42欧姆 ,可以用3V 和5V的来驱动。树莓派高电平刚好是3.3V。
在这之前我根柢不懂还区分有源和无源蜂鸣器,才有后续的曲折和摸索。
这种蜂鸣器正负极有很明显的符号 + -。
PWM和输出模式
纯挚和上次一样操纵设置GPIO口的凹凸是没法实现输出PWM的。好在树莓派的某些PIN口有这种模式,那就是PIN12口。可以通过控制PIN12口的PWM模式来实现。就理解为方波把。由于pygpio暂不撑持操纵硬件的PWM。这里我们用wiringpi库。
wiringPi中的pinMode (1,PWM_OUT),可以设置模式。PIN12是wiringpi的1号。
图中t(pwm)就是一个周期的时间长度。对付2K频率来说,那么周期就是1S/2K=500us。图中的D叫做占空比。指的是高电平的时间占用整个周期时间的百分比。第一个周期D=50%,那么就是高电平低电平的时间各占一半。接下来的D为33%,那就是通电时间为33%,残剩的欠亨电时间占用67%。
占空比简直会影响频率,但是我没有具体去探究会如何影响频率。我测试的时候使用的占空比是50%,也就是凹凸电平各占用一半的时间。
由于可以参考的例子是在太少了。只能本身翻芯片手册查找相关资料。具体的相关资料在BCM2835芯片手册的第九章(具体翻阅手册检察,真是最好的步伐)。阅读这一章以后我得出的关键点有如下几点:
1. PWM的频率是受时钟打点器控制的,(树莓派的根本时钟频率是19.2MHZ)。
2. PWM的输出占空比模式有两种,一种是平衡模式,一种是MS模式。
先看占空比中的平衡模式和MS模式,假设我们但愿输出的占空比为 N/M。
平衡模式是指的凭据某一种算法计算何时发送低电平,何时发送高电平,该算法力求任意一段时间占空比都最接近N/M,下图是(4/8的时候的几种发送方法),很显然good的算法任意取得一段时间都越发接近4/8。
M/S模式就是整个S周期内,先发送M时间的高电平,残剩的S-M时间为低电平。
因此如果是4/8的占空比。
M/S模式8个时间长度内发送的就是 11110000 (周期为8个时间长度)。 而平衡模式则是 10101010(可以说最小周期为2个时间长度,大的周期为 8个时间长度)。
可能看不懂不妨。用图来解释更有说服力。
假设我们需要的频率为5KHZ,那么周期时间就是1s/5000hz=200us。设定占空比为 0.5 也就是凹凸电平各占一半,那么需要高电平占100us,低电平占100us。
如果是平衡模式。一个大周期内(200us)波形图看起来如下
也就是这个大周期内,任意取一段时间占空比都接近0.5,其实实际频率比5K要大几倍。
如果是MS模式。则看起来如下:
显然这个才是我们需要的标准的5K频率。因为这个模式最小频率就是200us了。
wiringPi中的pwmSetMode (PWM_MODE_MS) 可以设置为ms模式。
前面说到树莓派根本时钟频率是19.2MHZ。pwm也受这个根本频率的控制,也就是最小的根本周期是1/19200000 S。这个周期太小了,我们控制蜂鸣器需要2-5K的频率。我们先将根本频率调大一些。通过pwmsetClock(int clock)可以将时钟根本频率设置为 19.2M/clock的巨细。然后我们再基于这个频率通过pwmsetRasnge(int range)设置最终的频率,range的范畴是2-4095。
通过pwmsetClock(clock)以及pwmsetRasnge(range)将最终的频率控制在 19.2MHz/clock/range的巨细。
这里我设置clock为32 将时钟根本频率设置为19.2MHZ/32=600khz。
这样我们只要设置range从300到120就能得到2k-5k的频率。
那如何设置占空比呢?还有一个函数pwmWrite(value)。value指定了range指定的时间内发送高电平的根本周期个数(以时钟根本频率计算)。因此value/range就是占空比。pwmWrite(range/2)就能得到50%的占空比。range/5 就得到20%占空比。如果设置value为0,那么就是这段时期内一直是低电平,没有任何高电平,蜂鸣器就不发声了。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12544.html