树莓派控制无源蜂鸣器,树莓派有源蜂鸣器实验

  树莓派控制无源蜂鸣器,树莓派有源蜂鸣器实验

  用草莓派B 5控制蜂鸣器播放音乐

  bbs.pediy.com

  步进电机和无源蜂鸣器都需要脉冲信号驱动。这次尝试用GPIO的PWM接口驱动无源蜂鸣弹《一闪一闪亮晶晶》。

  1个无源蜂鸣器和有源蜂鸣器

  主要是没意识到蜂鸣器是无源蜂鸣器和有源蜂鸣器,买回来就没声音了。第一次发现买的蜂鸣器是无源蜂鸣器。

  无源蜂鸣器:

  1无源内部振荡源,DC信号下无振铃。必须由非振荡电流驱动。2K-5KHZ方波脉宽调制(PWM)。5KHZ电流的方波是什么意思?每秒振荡5K次,完整周期占用200us,高点平均占用部分时间,低位占用部分时间。

  声音的频率可以控制,可以发出不同的声音。

  活动蜂鸣器:

  1内部有振荡电路,通电后会立即发出蜂鸣声。所以和前面的LED一样,只要提供高电平就能发出哔哔声。编程比被动方便。

  比主动便宜。被动是20美分,主动是40美分。我买了一个无源蜂鸣器。这个蜂鸣器的阻抗是42欧姆,可以用3V,5V的东西驱动。草莓派的高电平正好是3.3V

  在此之前,我并不知道主动蜂鸣器和被动蜂鸣器的区别,只是有了后来的曲折和摸索。

  这蜂鸣器清楚地显示积极和消极。

  2 PWM和输出模式

  青秀瓜不能像上次一样通过操作GPIO口高低设置输出PWM。还好草莓派的几个PIN口都有这个模式。这是引脚12。可以通过控制PIN12口的PWM模式来实现。请理解为方波。因为pygpio暂时不支持操作硬件的PWM。这里使用的是wiringpi库。

  WiringPi pinmode(1,PWM_OUT)可以设置模式。PIN12是wiringpi的第一名。

  图中的T(PWM)是一个周期的时间长度。对于2K频率,周期为1S/2K=500us。图中的d称为占空比。指高层时间占整个周期时间的比例。第一个周期,D=50%,高电平和低电平的时间各占一半。下一个D为33%,开机时间为33%,剩余非开机时间为67%。

  占空比确实会影响频率,但没有关于它如何影响频率的具体调查。我在测试中使用了50%的占空比,也就是说高低电平各占一半时间。

  因为可供借鉴的例子太少了。只能翻翻芯片手册找相关资料。具体信息参见BCM2835芯片手册第9章。看完这一章,我得到了以下几点。

  PWM的频率由时钟管理器控制。(草莓派的基础时钟频率是19.2MHZ)。

  PWM输出占空比有两种模式:平衡模式和MS模式。

  首先观察占空比中的平衡模式和MS模式,把你要输出的占空比设置为N/M。

  平衡模式是根据一种算法来计算什么时候发送低电平和高电平,这种算法尽量使任意时刻的占空比最接近N/m,显然下图是【4/8的几种发送方式】,好的算法即使花任意时间也更接近4/8。

  所谓M/S模式,在整个S周期内,首先传输M时间的高电平,其余S-M时间为低电平。

  因此,如果是4/8的占空比。

  11110000在M/S模式8小时内发出(周期长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(intclock),时钟的基频可以设置为19.2M/clock。然后根据这个频率,在pwmsetrange(in trange)中设置最终频率。范围是2-4095。

  带PWMset时钟和PWM se

  t range(范围)将最终频率控制在19.2 MHz/时钟/范围。

  在这里,我将时钟设置为32,并将时钟的基频设置为19.2MHZ/32=600khz。

  所以我们只要设置300到120的范围就可以得到2k-5k的频率。

  你如何设置占空比?还有一个函数pwmWrite(值)。值指定在范围指定的时间内发送高电平的基本周期数(由时钟的基本频率计算)。因此,值/范围就是占空比。写入(范围/2)可以获得50%的占空比。范围/5给出20%的占空比。如果该值设置为0,则在此期间始终为低电平。没有任何高电平,蜂鸣器不会鸣响。

  验证下图。

  50%(范围/2)

  20%(范围/5)

  所以我们可以初始化它。它是这样说的

  void初始化()

  {

  if (wiringPiSetup ()==-1)

  出口(1);

  //将引脚设置为pwm输出模式

  pinMode (1,PWM _ OUTPUT);

  //将pwm信号模式设置为ms模式

  PWM setmode(PWM _ MODE _ MS);

  //设置时钟基频为19.2M/32=600KHZ

  PWM setclock(32);

  }

  以便以后弹奏不同频率的音阶。封装了一个哔哔声函数和哔哔声的持续时间。

  无效蜂鸣音(int freq,int t_ms)

  {

  int范围;

  中频(频率2000 频率5000)

  {

  printf(无效频率);

  返回;

  }

  //将范围设置为600KHZ/freq。也就是说,频率的周期由1/600KHZ的范围组成。

  范围=600000/频率.

  pwmSetRange(范围);

  //将占空比设置为50%。

  pwmWrite(1,range/2);

  if(t_ms0)

  {

  延时(t _ ms);

  }

  }

  延迟由延迟控制。

  通过pwmWrite(1,0)关闭输出。

  剩下的就是找到闪烁星的乐谱了。设置相应的频率和持续时间。然后循环播放。

  这里只是截图。具体代码下载pwm.c。

  接线图如下。标签BCM 1(针脚12)连接到无源蜂鸣器的正极。为了接线方便,将负极连接到GND。我买的是加长版和排线。(第一次买错了树莓派2的40 PIN,第二次卖家发错货了。只买了第三次,也是颠簸)。

  编译并执行

  gcc -o pwm pwm.c -lwiringpi

  须藤。/pwm

  你可以听到音乐在播放。

  建议不要多听。因为2K-5K的频率对人的耳朵来说有点高,听着太刺耳心慌。

  学会pwm后,可以控制一些需要脉冲波控制的外部设备。

  有人会说,把GPIO设置成输出模式。

  pin write(1);

  睡眠(100u s);

  pin write(0);

  睡眠(100u s);

  这不是很好吗?

  这是可能的,但是CPU占用了很多资源。如果用python,时间控制就更不准确了,所以既然有硬件PWM模块,就用这个函数吧。

  实际上,我并不认为这一部分如此复杂。以为接上电源蜂鸣器就会响。然而,我省了20美分,学到了更多。有时候网上找不到的东西,就需要仔细查相关资料。而且硬件比软件麻烦多了。

  下一部分是人体传感器。感应到人体后,配合蜂鸣器报警。

  上传的附件:

  fb.png

  (24.77kb,4次下载)

  beep.png

  (192.63kb,4次下载)

  pwm.png

  (20.49kb,10次下载)

  balance.png

  (14.79kb,2次下载)

  msmode.png

  (6.40kb,3次下载)

  pic_ms.png

  (3.04kb,2次下载)

  pic_bal.png

  (1.89kb,2次下载)

  50perc.png

  (1.03kb,2次下载)

  20perc.png

  (1.81kb,2次下载)

  notation2.png

  (94.92kb,4次下载)

  notation1.png

  (16.81kb,4次下载)

  main.png

  (22.99kb,9次下载)

  result.png

  (540.95kb,7次下载)

  脉冲宽度调制

  (1.53kb,152次下载)

树莓派控制无源蜂鸣器,树莓派有源蜂鸣器实验