差别
这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
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> |
+ | \\ |