你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103单片机驱动蜂鸣器

[复制链接]
STMCU小助手 发布时间:2022-3-20 13:32
  蜂鸣器在电子产品中很常见,几乎现在的家电中都有,主要用来做声音提示。
/ N- j+ j5 I2 X5 x3 x
( W" F1 @7 \) K4 G. Z) y蜂鸣器从材料上分可以分为压电式蜂鸣器和电磁式蜂鸣器。
; T$ e  S* |" L4 I! B/ C, f- |9 y( l8 i9 R  I- V
  压电式蜂鸣器: 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
: a1 X* W& R/ k5 U  n5 _
9 k7 w/ s& z% ^0 v) B; S# R" j  电磁式蜂鸣器:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
( q6 ], ?" A5 K& h* _4 X+ l
4 _! `. _6 I9 Z$ f" x3 n蜂鸣器从驱动方式上可以分为有源蜂鸣器和无源蜂鸣器。
9 G3 H/ v# u* P
' c* e# I- Y2 }5 [0 K7 L, W  有源蜂鸣器:内部自己带有驱动电路,只要在外部供上点之后,内部电路就会工作,驱动蜂鸣器内部分线圈进行振动,从而发出声音。
: `) K* d  y/ ]) Q
) T3 Q: x! {4 m4 w; f2 r! L  无源蜂鸣器:内部没有振荡电路,直接给蜂鸣器供直流电时,蜂鸣器不会响,只有外部给蜂鸣器提供一个方波,蜂鸣器才能发出声音。- ?" r5 {& @8 o. ]7 ?
/ b* m) g" J1 r& [
驱动方式:
2 a) W$ v- C& {4 \/ M. T2 {1 T/ p' W7 g2 \
  无源蜂鸣器驱动比较简单,直接用单片机IO口给蜂鸣器发送方波信号就行。6 J) F; k, H. w2 _8 P/ o1 V
( V7 t) X6 x1 t1 z4 D4 |
E~3~TJ617T]7{{D{`4}G$UP.png
' y+ O2 W6 `& i4 z9 e/ I3 G: p& X* P" Y. D4 a
  有源蜂鸣器驱动时,外部需要驱动电路。$ y9 \) V& x9 p) X" F2 x
0 b+ ^8 Q, g: K$ e& d
4FH_2%_KR1CK@M]$)]SFA[6.png
9 P) H; |, ]; c. ]1 n4 Z. `6 D
9 j: e/ O6 K  f5 f$ E  常用的驱动方式就是直接通过三极管来驱动,三极管主要是用来放大电流,因为蜂鸣器响的时候需要的电流比较大,一般单片机口直接提供不了那么大的电流,给蜂鸣器反向并联一个二极管用来延长蜂鸣器的使用寿命。由于蜂鸣器内部有线圈,相当于一个电感,当蜂鸣器关闭的时候,会在线圈上产生一个反向电动势,这个二极管在蜂鸣器关闭的时候可以给线圈进行放电。
1 o  y- ?$ h0 a- `/ o- j) G2 }4 [* X5 _9 l
4 U& Y5 A$ H# k, x& j+ Z# O  用这个驱动电路驱动蜂鸣器的时候,在上电的一瞬间,有时候会听见蜂鸣器嘀的响一声,这时因为在单片机上电时,IO口未初始化之前,有的IO口默认会是高电平,这样当单片机上电的一瞬间,三极管基极就会瞬间又一个高电平,这时候蜂鸣器就会响一声,当IO口初始化完成之后,IO口设置为低电平,这时候三极管不导通,蜂鸣器就不响了,为了避免这种情况发生,一般都会给基极加一个比较大的下拉电阻。( h& d% D) B( b9 r4 I
& e$ g' Y5 I$ k) k' K
TB`AG4S8Y5R_@U9{CRRKS3W.png 9 k& q- G% n. ]9 {% T
" B( o+ V) j' p& e9 s) ^
  给基极加一10K的下拉电阻这样在上电的瞬间,这个下拉电阻就会将三极管基极的电平拉为0,在上电的一瞬间蜂鸣器就不会响了。7 e3 z% {1 `- \. }% f1 e
# J" v8 H, g2 A
  这里驱动蜂鸣器使用的是有源蜂鸣器,虽然驱动电路复杂了一点,但是程序控制比较简单,只需要给IO口高低电平,就可以控制蜂鸣器响或者不响。蜂鸣器初始化代码如下:. ~8 [# S8 m' l

3 V: {1 U5 O' S! V3 _; L. J. J
  1. #define BEEP PBout(8)        //BEEP 蜂鸣器接口; F8 q: `- A/ Q; W$ P' L7 x3 o' T
  2. " a/ A& O! F: c! y
  3. void BEEP_Init(void)
    ) R( X& v4 q: Z. Q
  4. {
    ( l9 M( Y3 Y" W* e& @
  5.     GPIO_InitTypeDef GPIO_InitStructure;
    6 V: w$ {1 m9 }6 a) f% H
  6. % k: U* a+ Z. _
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);) O! D8 W' e7 I7 \/ C- o6 }

  8.   ~* d) V0 o( I* N* r# ]5 K
  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;6 U# \; P8 R- L& W6 |5 b
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;% Q) e3 m/ O% w* ~  \
  11.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ @& }: d# K3 u/ i; R. A/ Q
  12.     GPIO_Init(GPIOB, &GPIO_InitStructure);4 p: _) n4 @  E8 @
  13. ) p# I' @  l8 z( z" n" A
  14.     GPIO_ResetBits(GPIOB, GPIO_Pin_8);6 K& o* |3 U& ^1 x
  15. }
复制代码
% D& C8 b) ?  K( l9 ^; t
将驱动蜂鸣器的口PB8设置为普通IO口,推挽输出就可以了。要蜂鸣器响的时候,直接给PB8口给高电平就行了。
  1. int main(void)
    # H' V) c7 m- u) Z
  2. {
    , y% i) e: E2 `# C  t- p
  3.     delay_init();       //延时函数初始化
    , N4 r/ M2 z) Z1 g4 V' \( ?0 p, e
  4.     LED_Init();         //初始化与LED连接的硬件接口
    ' V: b6 d; z0 X+ V* [
  5.     BEEP_Init();                //初始化蜂鸣器/ W7 o4 @& S# d
  6.     while(1)- ^( @$ ?+ i/ L" W& j/ A
  7.     {   
    : z; G) Y* x7 k  Q
  8.         BEEP = 1;1 |/ u" _8 [# l. v* i
  9.         delay_ms(200);   //延时300ms      
    6 |* ^3 {4 a7 w' X, \& z2 @
  10.         BEEP = 0;8 ?9 y% y9 \. x
  11.         delay_ms(200);  //延时300ms      / R3 W( `3 I  L  `2 x
  12.     }
    ' H% x* q5 t/ Y! |# e. i- Y
  13. }
复制代码

; D: d( Y# b% l! \' S: f- r在主程序中循环的让蜂鸣器一开一关,这样就可以听到蜂鸣器发出的嘀嘀嘀嘀的声音了。: e. E- V' v  n1 t6 L! B% n- `2 J

3 c6 F6 I0 Z. o! a* Y7 A7 O2 M; ], H- `0 I' ?# Z% G! i3 f: r( r
赞 收藏 评论0 发布时间:2022-3-20 13:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版