差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
buzzer [2022/01/26 21:03]
gongyusu 创建
buzzer [2022/02/06 16:53] (当前版本)
gongyusu
行 1: 行 1:
-## 蜂鸣器+## Buzzer - 蜂鸣器
 ### 1 介绍 ### 1 介绍
 +{{ :buzzer.jpg ?300 | }}
 +和LED常用于发光指示一样,作为一种声音模块,蜂鸣器常被用于做发声的功能。有源蜂鸣器通过内置的振荡器,发出单一固定频率提示性报警声音;无源蜂鸣器是通过不同频率的脉冲驱动,可以发出不同频率的声音信号。
  
 ### 2 工作原理 ### 2 工作原理
 +蜂鸣器的分类:
 +按其结构主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型:
 +  * 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
 +  * 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,​输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
 +
 +按是否带有信号源分为有源蜂鸣器和无源蜂鸣器两种类型:
 +  * 有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。
 +  * 无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。
  
 ### 3 电路连接 ### 3 电路连接
 +本章节主要介绍无源蜂鸣器的驱动,FPGA或MCU的GPIO口驱动能力弱,不能直接驱动无源蜂鸣器,常用的蜂鸣器驱动电路如下:
 +{{ :​无源蜂鸣器驱动电路.jpg?​600 |}}
 +蜂鸣器使用NPN三极管(9013)驱动,三极管当开关用,当基极电压拉高时,蜂鸣器通电,当基极电压拉低时,蜂鸣器断电,MCU或FPGA控制GPIO口给三极管的基极输出不同频率的脉冲信号,蜂鸣器就可以发出不同的音节。
 +不同音节与蜂鸣器震荡频率的对应关系如下:
 +{{ :​蜂鸣器音节频率.jpg?​800 |}}
  
 ### 4 MicroPython编程(MCU) ### 4 MicroPython编程(MCU)
 +  * [[https://​www.coderdojotc.org/​micropython/​sound/​02-play-tone/​|Play Tones Using the PWM]]
 +  * [[https://​www.coderdojotc.org/​micropython/​sound/​03-play-three-tones/​|Play Three Tones]]
 +  * [[https://​www.coderdojotc.org/​micropython/​sound/​04-play-scale/​|Play a Scale]]
 +  * [[https://​www.coderdojotc.org/​micropython/​sound/​05-play-mario/​|Play Mario on MicroPython]]
 +  * [[https://​www.coderdojotc.org/​micropython/​sound/​07-play-audio-file/​|播放音频文件]]
 +  * [[https://​www.coderdojotc.org/​micropython/​sound/​09-converting-mp3-to-wav/​|转换MP3音频文件为Wav文件]]
 +  * [[https://​github.com/​james1236/​buzzer_music|buzzer_music]]
 +
 +
 +### 5 Verilog编程(FPGA)
 +在FPGA中使用PWM来驱动蜂鸣器,使用计数器对系统时钟进行分频,改变计数器的计数终值从而实现调节PWM信号频率的目的,使用PWM信号控制蜂鸣器电路。
 +
 +<code verilog>
 +// --------------------------------------------------------------------
 +// >>>>>>>>>>>>>>>>>>>>>>>>>​ COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<​
 +// --------------------------------------------------------------------
 +// Module: Beeper
 +// Author: Step
 +// Description:​ Beeper
 +// Web: www.stepfapga.com
 +// --------------------------------------------------------------------
 +// Code Revision History :
 +// --------------------------------------------------------------------
 +// Version: |Mod. Date:   ​|Changes Made:
 +// V1.0     ​|2016/​04/​20 ​  ​|Initial ver
 +// --------------------------------------------------------------------
 +module Beeper
 +(
 +input clk_in,​ //​系统时钟
 +input rst_n_in,​ //​系统复位,低有效
 +input tone_en,​ //​蜂鸣器使能信号
 +input [4:​0] tone,​ //​蜂鸣器音节控制
 +output reg piano_out //​蜂鸣器控制输出
 +);
 +
 +/*
 +无源蜂鸣器可以发出不同的音节,与蜂鸣器震动的频率(等于蜂鸣器控制信号的频率)相关,
 +为了让蜂鸣器控制信号产生不同的频率,我们使用计数器计数(分频)实现,不同的音节控制对应不同的计数终值(分频系数)
 +计数器根据计数终值计数并分频,产生蜂鸣器控制信号
 +*/
 +
 +reg [15:0] time_end;
 +//​根据不同的音节控制,选择对应的计数终值(分频系数)
 +//​低音1的频率为261.6Hz,蜂鸣器控制信号周期应为12MHz/​261.6Hz = 45871.5,
 +//​因为本设计中蜂鸣器控制信号是按计数器周期翻转的,所以几种终值 = 45871.5/2 = 22936
 +//​需要计数22936个,计数范围为0 ~ (22936-1),所以time_end = 22935
 +always@(tone) begin
 + case(tone)
 + 5'​d1:​ time_end = 16'​d22935;​ //​L1,​
 + 5'​d2:​ time_end = 16'​d20428;​ //​L2,​
 + 5'​d3:​ time_end = 16'​d18203;​ //​L3,​
 + 5'​d4:​ time_end = 16'​d17181;​ //​L4,​
 + 5'​d5:​ time_end = 16'​d15305;​ //​L5,​
 + 5'​d6:​ time_end = 16'​d13635;​ //​L6,​
 + 5'​d7:​ time_end = 16'​d12147;​ //​L7,​
 + 5'​d8:​ time_end = 16'​d11464;​ //​M1,​
 + 5'​d9:​ time_end = 16'​d10215;​ //​M2,​
 + 5'​d10:​ time_end = 16'​d9100;​ //​M3,​
 + 5'​d11:​ time_end = 16'​d8589;​ //​M4,​
 + 5'​d12:​ time_end = 16'​d7652;​ //​M5,​
 + 5'​d13:​ time_end = 16'​d6817;​ //​M6,​
 + 5'​d14:​ time_end = 16'​d6073;​ //​M7,​
 + 5'​d15:​ time_end = 16'​d5740;​ //​H1,​
 + 5'​d16:​ time_end = 16'​d5107;​ //​H2,​
 + 5'​d17:​ time_end = 16'​d4549;​ //​H3,​
 + 5'​d18:​ time_end = 16'​d4294;​ //​H4,​
 + 5'​d19:​ time_end = 16'​d3825;​ //​H5,​
 + 5'​d20:​ time_end = 16'​d3408;​ //​H6,​
 + 5'​d21:​ time_end = 16'​d3036;​ //​H7,​
 + default:​time_end = 16'​d65535;​
 + endcase
 +end
 +
 +reg [17:0] time_cnt;
 +//​当蜂鸣器使能时,计数器按照计数终值(分频系数)计数
 +always@(posedge clk_in or negedge rst_n_in) begin
 + if(!rst_n_in) begin
 + time_cnt <= 1'b0;
 + end else if(!tone_en) begin
 + time_cnt <= 1'b0;
 + end else if(time_cnt>​=time_end) begin
 + time_cnt <= 1'b0;
 + end else begin
 + time_cnt <= time_cnt + 1'b1;
 + end
 +end
 +
 +//​根据计数器的周期,翻转蜂鸣器控制信号
 +always@(posedge clk_in or negedge rst_n_in) begin
 + if(!rst_n_in) begin
 + piano_out <= 1'b0;
 + end else if(time_cnt==time_end) begin
 + piano_out <= ~piano_out;​ //​蜂鸣器控制输出翻转,两次翻转为1Hz
 + end else begin
 + piano_out <= piano_out;
 + end
 +end
 +
 +endmodule
  
-### 5 Verilog代码(FPGA)+</​code>​ 
 +\\  ​