|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& T% l P1 d: K, Z5 J, m: Q
. \4 u. _+ P4 M! n) X7 G
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 压电式蜂鸣器:压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。 多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。 电磁式蜂鸣器:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。 根据蜂鸣器本身是否集成了震荡源,蜂鸣器可以分为有源蜂鸣器与无源蜂鸣器。 有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。 有源蜂鸣器与无源蜂鸣器的区别: 注意:这里的“源”不是指电源,而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫; 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它 有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。 无源蜂鸣器的优点是: 1. 便宜 2. 声音频率可控,可以做出“多来米发索拉西”的效果 3. 在一些特例中,可以和LED复用一个控制口 有源蜂鸣器的优点是:程序控制方便。
3 {, v. T$ L5 N" T$ ]# u以上介绍了蜂鸣器的种类以及有源蜂鸣器、无源蜂鸣器的特点。接下来,我们将介绍芯航线 FPGA学习套件主板上使用的蜂鸣器电路,并使用Verilog设计一个蜂鸣器驱动电路,来驱动蜂鸣器发声。 ' z6 b! C/ s* k
蜂鸣器电路介绍
s7 e _. `. k3 F) y) P8 ^芯航线FPGA学习套件主板上使用了一枚3.3V驱动的无源蜂鸣器,其电路如下所示: ; H. r( d1 ?% _6 G! j# M; g2 h
+ b, C$ Y: {- w2 _, d( s电容 C37 用于提高电路抗干扰性能。 D1 起保护三极管的作用,当三极管突然截止时,无源蜂鸣器两端产生的瞬时感应电动势可以通过 D3 迅速释放掉,避免叠加到三极管集电极上从而击穿三极管。 beep端口接FPGA输出管脚,使用时,只需要在beep信号上输出2~5KHz的pwm波,就能驱动蜂鸣器发声。 1 v# w# L0 T4 o( C" }5 l% a
无源蜂鸣器控制器设计 * P( D# n0 p9 e8 u- R0 h1 Z
通过前面对无源蜂鸣器的特点介绍可知,要使无源蜂鸣器能够正常发声,需要在控制端beep给出相应频率的PWM波。因此,对于无源蜂鸣器的控制,就转化为了设计一个PWM波发生电路。因此,接下来我们将介绍PWM波发生电路的设计。 何为PWM波?PWM的英文全名叫Pulse Width Modulation,即脉冲宽度调制。通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,广泛应用在从测量、通信到功率控制与变换的许多领域中。 以下为周期为1KHz,脉冲宽度(占空比)分别为20%、50%、90%的波形图: # q( O h; c: p" [: n9 K. K, u, s
* \3 @. Z& q# Z0 D2 w. L5 B& |$ `. g" v( d8 @ w: g
' P8 Q1 V- R2 D
, f7 t6 b8 Q, G' ], X* I
, q2 C k: b6 l8 n9 I/ e. D由图可知,当信号周期一定,信号高电平时间所占总时间的百分比不一样,即为不同占空比的PWM波。在逆变电路中,当使用这样的波形去驱动MOS管的导通时,因为一个周期内不同占空比的PWM信号其高电平持续长度不一样,因此使得MOS管的开通时间也不一样,从而使得电路中的平均电流也不一样,因此,通过调整驱动信号的占空比即可调整被控制电路中的平均电流。 而除了调整PWM信号的占空比,PWM信号的周期也是可以调整的,例如,在逆变电路中,使用IGBT作为开关器件,常见开关频率为几K到几十K,而使用MOS管作为开关器件,其开关频率则可高达几百K。因此,对于不同的器件,对驱动信号的频率要求也不一样。所以,还需要能够对PWM波的频率进行调整。 通过以上分析,可以知道,要设计一个PWM发生电路,需要能够实现对信号的频率和占空比的调节。使用过 单片机或者 DSP产生PWM波的朋友应该知道,在单片机或者DSP中,产生PWM波的方法就是使用片上定时器进行循环计数,通过设定定时器的一个定时周期时长来确定对应输出PWM信号的频率,同时还有一个比较器,该比较器比较定时器的实时计数值与用户设定的比较值的大小,根据比较结果来控制输出信号的电平高低。通过设定不同的比较值,即可实现不同占空比的PWM信号输出。 0 u( V) j) {) Z0 i/ O* O
! i2 u" @; W6 I' F4 B* B* _: z: q
对于FPGA来说,要产生PWM波,也可以借鉴单片机或DSP使用定时器产生PWM波的思路。 基于FPGA的PWM电路设计根据DSP产生PWM波典型原理,在FPGA中设计PWM发生器时,也可提取出如下两个主要电路: 1、 定时器/计数器电路 2、 输出比较电路 , W! e, {+ z! Y
定时器/计数器电路设计定时器电路设计较为简单,在《小梅哥FPGA设计思想与验证方法视频教程》中,04课“计数器设计与验证”介绍了最简单的计数器设计。参考各种mcu的计数器输出PWM波时的典型配置,可知该定时/计数器采用循环递减的计数方式,计数器循环从设定的计数初始值递减到0,然后再回到计数初始值再次递减。这样,只需要设定一个计数初始值,并确定计数时钟源频率,即可确定计数一个完整周期的时间,也即PWM信号频率。 在本节中,我们设计定时/计数器的计数时钟源频率为芯航线FPGA学习套件主板上晶体振荡器的输出频率50MHz,定时/计数器位宽为32位,则计数器代码如下所示: & `" N, @, j' O+ f9 L2 E. w6 R6 s
0 B4 d4 W0 z& a# u- {7 X
6 U4 T2 ^. j! ^ J. U; _
输出比较电路 输出比较电路通过比较计数器实时计数值与比较寄存器中的设定值,来确定最终PWM输出信号的电平状态。这里,我们可以定义,当计数器计数值大于等于比较值时,PWM输出端输出低电平,当计数值小于比较值时,PWM输出端输出高电平。因此输出比较电路设计代码如下:
7 t7 w2 ^+ z+ I8 j" D( I1 V5 c
) o1 w) L) L9 e6 p) n完整PWM发生电路设计通过以上设计,一个最简单的PWM产生电路主要电路就设计完成了,以下为PWM产生电路的完整代码:
& H) _5 @& E5 l
' y; f8 B: C( l4 j8 C1 }
& x! n8 w6 r% P8 j# n- c) ?: T$ N% v( Q' G: J2 _- J" e
PWM发生电路仿真验证对本PWM发生电路的验证思路比较简单,只需要产生50MHz基准计数时钟源(其他频率也可以,只需要修正频率和占空比计算公式中的相关参数),然后给出预重装值和输出比较值,然后使能计数,即可启动PWM输出。在运行过程中,修改预重装值可以设置输出PWM信号的频率,并将同时影响输出占空比,而在预重装值确定的情况下,修改输出比较值,则可以设置输出占空比。 最终输出PWM波的频率计算公式为: ) v( Q- v$ ?+ `7 T
" H2 M% `3 ^) J) j- c, t6 I因此,当输出频率确定时,可计算得到预重装值,计算公式为:
6 N3 i' p- m) E2 h, M$ Z4 ?; A
q8 v, D7 h3 E: e例如,当希望设置输出信号频率为5KHz时
% W: P- x; P5 e* Z0 k
/ b, L1 t$ h- ]/ [! A因此,我们只需要设置counter_arr值为9999即可使得最终输出信号频率为5KHz。 当输出PWM频率确定后,其输出占空比计算则为输出比较值与预重装值之商。计算公式为: ( j" t& _, O2 P& o6 r/ ^; P) H
) t( h- `1 S2 G1 U
因此,当输出占空比确定时,可计算得到输出比较值,计算公式为:
3 z4 d! h" a' i
g" [ C% O& d8 ~, u$ K. C例如,当输出频率为5KHz,输出占空比为70%时 . W' p$ @: U4 x& Q* f5 p
3 {$ l( [6 [: e
PWM发生电路testbench设计根据上述计算公式,可以设计pwm_generator模块的仿真文件如下所示:
3 o/ c9 G6 R( V$ k
; w' k1 P$ j% z3 ~. q7 l/ W4 q
! v, [) D; c7 E( _( y( d$ }( S& q, o/ S
4 Y1 S2 z: Q7 E5 n* \* t$ o, q6 @
仿真结果分析下图为设置输出PWM波频率为50KHz(counter_arr为999)、占空比为40%(counter_ccr为400)时的仿真波形,由图可知,低电平周期为12us,高电平周期为8us,整个信号周期为20us,即频率为50KHz。占空比为8/20= 0.4。 4 t' Y! G. G/ m/ l: d U2 Q6 E/ h) E/ ~
- C) ^9 L" X# X7 q! Y( k9 [3 g下图为设置输出PWM波频率为50KHz(counter_arr为999)、占空比为70%(counter_ccr为700)时的仿真波形,由图可知,低电平周期为6us,高电平周期为14us,整个信号周期为20us,即频率为50KHz。占空比为14/20= 0.7。 ' ?6 n( A: Q0 _
, C5 H7 f; V2 @$ l5 i: x
下图为设置输出PWM波频率为100KHz(counter_arr为499)、占空比为50%(counter_ccr为250)时的仿真波形,由图可知,低电平周期为5us,高电平周期为5us,整个信号周期为10us,即频率为100KHz。占空比为5/10= 0.5。
6 ?! J o0 h( \8 Q: G' ]0 _
3 s& \% ~1 S# c- b0 L下图为设置输出PWM波频率为100KHz(counter_arr为499)、占空比为20%(counter_ccr为100)时的仿真波形,由图可知,低电平周期为8us,高电平周期为2us,整个信号周期为10us,即频率为100KHz。占空比为2/10= 0.2。
* w) y! ~" q0 n0 l* K
1 ?. F. z; F6 g' H' s由此可知,该PWM生成电路能够正确的产生PWM输出信号。 PWM驱动蜂鸣器板级验证通过仿真验证,我们确认了该PWM发生电路理论设计正确,接下来,我们将使用该PWM发生模块来驱动芯航线FPGA开发板上的无源蜂鸣器,让无源蜂鸣器能够循环依次发出“哆来咪发梭拉西”的音调。(本想让蜂鸣器能够演奏一曲的,可是无奈本人音乐天赋为负数,学不会谱曲,因此只能把最基本的“哆来咪发梭拉西”放出来了,希望有音乐天赋的朋友能在此基础上谱写演奏出美丽的乐章)。 以下为查资料得知的每个乐调对应的频率。
) [0 q* q( |1 X: q O2 j, j
1 z: Y0 b' S; |( _) U6 R! n
3 k; a, x+ k3 y9 T$ D! c根据每个音调的频率值,可以计算得出PWM发送模块的预重装值,以下为计算得出的音调频率与对应PWM发送模块输出相应频率的预重装值。
9 `8 n4 p/ d/ c3 _0 E' ? L/ p; @. F L' L( M/ j5 S
. v5 P. z" u1 O9 ]& O本例中,保持PWM波的占空比始终为50%即可,而通过前面仿真验证可知,占空比为50%时,输出比较值刚好为预重装值的一半,因此,我们只需要将预重装值除以2(右移一位)的结果直接赋值给输出比较值即可,这样可以避免再重复计算输出比较值。 7 o: ?6 t. c! i7 [! N$ M
另外,为了保证音调的切换能够让我们容易分辨,因此设计一个500ms的定时器,每500ms切换一次音调。该部分电路非常简单,因此本板级验证部分将不再讲解代码的详细设计思路,只给出具体代码。 音调播放电路的代码如下所示: 0 ]! Z; k8 c5 Q8 Q9 I$ h3 R
! [, `. p+ g% G( C# Y
[3 Y! o: m3 _9 u1 Y$ K: C: Q# ~
% c$ C- \/ [. `
$ e$ x+ \+ n- w8 Z
+ }: d4 \) k" [
8 v7 h# \; E: ]) O# |7 r0 f1 S/ O, r& M1 y$ X
/ }& v, k0 S6 H1 y' Z
蜂鸣器音调播放电路的引脚分配如下表所示:
- f/ t1 D) c$ q% @- {7 N
9 j( \% K9 ~+ L: V; @7 E引脚分配完成后对工程全编译,然后下载到芯航线FPGA开发板上,下载完成后蜂鸣器即开始循环从低音1播放到高音7。 - L; {/ @5 d8 O$ y, K0 P; r* C
. @) R- r1 ?; b; o" O# P- ]
7 ]7 A$ X) [# l! L9 h
+ O0 R1 Y5 R1 Z9 I' x8 A; P" y
. N* p: k/ Y# K9 q9 @% i6 [$ | x
' L- v) z) ^2 U! Z# S( F' {
' P: u. ?( P' O: P8 `0 `& E2 u5 ~
6 N% s, N* k' `
1 W% v' ]7 e0 \" t8 d) g6 }' a- ~: R3 C: v
# G l3 P( ^3 V2 v$ N# F
& c9 ]2 z" E! a. Z% R1 A+ N
& j$ m0 U; d* F: M* n1 [$ j
+ t3 ^* f6 g& R4 V# F
, P4 B0 ^$ Z$ v4 G9 Z! b' y7 U& i# D F# Q
7 e& O2 y4 b5 A! d. B v0 d & w" g+ S' T- W0 _1 ?7 p, G; s! k% G
+ {1 o/ a/ R& A! {$ N
?( } c$ u! F3 A5 f + n8 g6 W6 s- _3 Q( ]; z- C: K
# ^" U c! ^" U3 J! ?/ Y9 K' q
5 }8 \7 B$ y. g1 i2 A& N: z% A+ V
/ L' N/ l) f- d' Y1 o% ^0 `- z7 m2 O& D" [
/ q6 Z& F% s1 A" Q/ b
/ p5 ?' a' s( Y+ w q% N0 p j
. O& z' e5 j3 E6 S8 a3 l+ f , @- P* c4 E. ~% a7 E! g5 e1 t7 U2 K
% F/ d0 Y5 A+ ]4 L P3 L) \ ^
- G1 q* V: o( J7 t* m) d$ B
) [. s5 N/ A v; ~
. g3 N3 M$ V% K2 ?# ?8 n7 d
5 ]9 i, j, X$ V. v4 `! e9 z/ a' h' `: e5 b+ V- y4 \" h
+ B7 O& v3 R" A
\* x& Y+ @/ \: h. C 5 P0 {- _) n. G
2 b; A7 E, m6 x% t
- T, q T$ o! I" v m2 m
" R& p) M% d4 W% ]3 e# T
: ^4 D, x: F i$ I4 G; j
- s8 w( F, [1 y* y1 U
' z% g' e, \4 R9 b8 o) o |
|