首页 > 编程知识 正文

单片机蜂鸣器简单音乐,树莓派3b+加蜂鸣器

时间:2023-05-05 14:18:46 阅读:112414 作者:873

用草莓馅饼B 5控制蜂鸣器演奏乐曲

bbs.pediy.com

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

1被动蜂鸣器和主动蜂鸣器

主要是我自己也没有意识到蜂鸣器是区分被动的和主动的,但是手里接着电源,买了不发出声音,第一次发现买的蜂鸣器是被动的蜂鸣器。

被动蜂鸣器:

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

2声音的频率可以控制,可以制作不同的声音。

主动蜂鸣器:

1内部装有振荡电路,通电后会立即鸣叫,因此和前面的LED一样,只要提供高电平就能鸣叫,编程比无源更方便。

被动比主动便宜,被动2毛,主动4毛。 我买的无源蜂鸣器,这个蜂鸣器的阻抗为42欧姆,可以用3V和5V的东西驱动。 草莓派的高水平正好是3.3V。

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

这个蜂鸣器清楚地显示为正负。

2 PWM和输出模式

清秀冬瓜和上次一样操作GPIO端口高低设置不能输出PWM。 好在草莓派的几个PIN口都有这个模式。 那是PIN12口。 可以通过控制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芯片手册第九章。 读完本章后我得到的重点如下。

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。

平衡模式时。 1个周期内(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的大小。 然后,根据该频率在pwmsetrasnge(intrange )中设定最终频率。 范围为2-4095。

通过PWMset clock (时钟)及PWM se

tRasnge(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,那么就是这段时期内一直是低电平,没有任何高电平,蜂鸣器就不发声了。

验证一下如下图。

50% (range/2)

20% (range/5)

因此我们可以初始化里面这么写

void init()

{

if (wiringPiSetup () == -1)

exit (1) ;

//设置针脚为pwm输出模式

pinMode (1, PWM_OUTPUT) ;

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

pwmSetMode(PWM_MODE_MS);

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

pwmSetClock(32);

}

为了后续能弹奏不同频率的音阶。封装一个beep函数以及beep的持续时间。

void beep(int freq,int t_ms)

{

int range;

if(freq<2000||freq>5000)

{

printf("invalid freq");

return;

}

//设置range为 600KHZ/freq。也就是由range个1/600KHZ组成了freq频率的周期。

range=600000/freq。

pwmSetRange(range);

//设置占空比为50%。

pwmWrite(1,range/2);

if(t_ms>0)

{

delay(t_ms);

}

}

通过delay来控制延时。

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

剩下的就是查找 一闪一闪亮晶晶的简谱。对应设定好频率和持续时间。随后循环播放出来就可以了。

这里就只截图,具体代码下载pwm.c查看。

接线图如下。BCM标号1(PIN12 )接无源蜂鸣器的正极。负极接GND,为了接线方便。我买了扩展版和排线哦。(第一次错买了树莓派2的40 PIN,第二次卖家给我发错货了。第三次才买到,也是坎坷)。

编译执行

gcc -o pwm pwm.c -lwiringpi

sudo ./pwm

就可以听到播放曲谱了。

建议不要多听。因为2K-5K的频率对于人的耳朵实在是有点高了,听多了刺耳心慌。

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

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

PinWrite(1);

sleep(100us);

pinWrite(0);

sleep(100us);

这样不是也行吗?

的确这样是可以的,但是CPU占用的资源很高。使用python的话时间控制更是不精准,因此既然有硬件的PWM模块我们还是使用一下这个功能把。

其实我没想本节这么复杂的。以为蜂鸣器接上电源就会响。不过省了两毛钱的同时还让我学到了更多的东西。有时候网上查不到的一些东西,就需要自己认认真真查看相关资料测试。还有就是硬件比软件麻烦多了。

下一节是人体感应器。感应到人体以后配合蜂鸣器报警。

上传的附件:

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次下载)

pwm.c.txt

(1.53kb,152次下载)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。