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

STM32——悦耳的蜂鸣器实验

[复制链接]
feixiang20 发布时间:2018-1-15 20:38
我们将利用一个 IO 口来控制板载的无源蜂鸣器,实现蜂鸣器发声。通过本次实验,你将进一步了解 STM32 的 IO 口作为输出口使用的方法。实验目标:
- r2 L) j3 i! I* @1 x1、无源蜂鸣器发出悦耳声音。  K/ W; y7 U# z/ |+ k4 _0 b
2、学会设置 STM32 的 GPIO 输出控制蜂鸣器。' g; ^+ w$ ?& V

- _4 x! y0 N5 R* I9 i2 g蜂鸣器简介
( e1 ?7 f) ~) M- v% Q& G" Z3 I* l蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。如下图所示* h- {" O. P4 h/ |5 d/ R& A# t

5 w. y% x! F- q# p1 f& ? 1.jpg ; U1 `- d+ D0 D
5 j& m' R: ]0 T" H  n% v4 J( ^
本次实验所用的蜂鸣器是无源蜂鸣器,需要自己编写震荡部分* r  l- K1 A  s
这里的无源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器带震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz 左右的方波驱动,才能发声。STM32 的单个 IO最大可以提供 25mA 电流,而蜂鸣器的驱动电流是 30mA 左右,算是比较接近。综合考虑可以直接驱动。
, s) ~- F* I+ B: y- s3 i; o还有一个方案就是:STM32 的 IO 不直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32 的 IO 只需要提供不到 1mA 的电流就足够了。
/ c. @9 X% f4 P# W8 N硬件设计从原理图中,我们可以看到蜂鸣器是接到单片机的 PB6。而驱动无源蜂鸣器的原理就是产生 2~5Khz 左右的方波驱动,才能发声。所以要使蜂鸣器发声也就是将单片机 PB6 管脚每间隔一段时间不输出一个高低电平脉冲即可。
/ J- a( ?! _; \/ Y$ F% B  [9 _% I) j9 J' v5 }
2.jpg # I1 z& V7 K2 }9 @
9 H& T/ {; Z5 N& `
蜂鸣器 IO  初始化4 k' E1 J0 E9 i0 D7 F+ I# M
void buzz_Init() //端口初始化  e: x2 ?) u2 O
{( F' o+ m9 u  Q2 j  {7 x. }
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
% k7 D+ Q5 N6 K  N! y+ K/ URCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* 开启 GPIO时钟 */
% j" s( F4 K. X+ g. m/* 配置 GPIO 的模式和 IO 口 */
3 P0 v8 W3 z1 @3 q; \: ]1 G" GGPIO_InitStructure.GPIO_Pin=buzz; //选择你要设置的 IO 口
# c: v; ~0 u$ S- S8 k1 ~GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
" }5 ]/ b0 x. f& U3 {7 d8 P* HGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率% }4 q$ k- I! u* p
GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化 GPIO */* _( m8 D  \" i" n
}/ m4 l  a* s5 s3 w8 w
3 V+ B3 a3 V8 C! [9 Q3 a
蜂鸣器管脚定义在其头文件内如下:
' @, s& B! e& O3 g8 G#define buzz GPIO_Pin_6 //PB6 定义端口 PB6
+ h/ B% Y! @6 I) r
% Q( K$ O  u" h/ }0 z蜂鸣器发声函数   通过改变频率控制声音变化void buzz_lisen() //报警声
0 }2 a$ |6 I+ ?  E7 s% k3 N2 ?6 y{
0 V; q" e' F; cu32 i=1000;
3 s: v$ z: u$ v6 c# m- nwhile(i--) //产生一段时间的 PWM 波,使蜂鸣器发声9 ~* v) _' P/ r8 j% `! F3 k
{. E6 k+ a$ ]: K0 J; g
GPIO_SetBits(GPIOB,BZ);  //IO 口输出高电平) M( d6 Q" z9 P& w* v1 u* E( h- I
delay(i);( d6 A. g% h. j' w6 z" k
GPIO_ResetBits(GPIOB,BZ); //IO 口输出低电平
7 m3 \3 K$ Z4 U9 r" adelay(i--);" l  M2 ~+ |- }! L3 h
} * f- {% t  b; @' \" i. s; W
}/ }3 W/ N4 v3 O8 R5 p, b8 ~

; v) v% k. H( n1 C( X这里的蜂鸣器驱动发生没有使用stm32自带的pwm是自己模拟写的。
" p5 T: H# D; a7 N2 y6 Y所有驱动代码写完了,可以使用主函数调用了。
  _, J2 t0 [' F: E& c5 G8 }& C主函 数+ i( U. x7 v" }0 s% ^5 m
int main()1 P9 ^. `" p; f& r  S1 }
{   x6 r: ?2 y& D
buzz_Init(); //端口初始化2 D4 \* E& b" D2 O0 B. r% \" k
while(1)3 f) i0 u# g2 T2 X8 M0 ^
{
# |# w8 Q" k: }7 h& H9 ~/ S4 dbuzz_lisen(); 5 N  `' O" a" v) \3 ^
}
6 H4 C# u' K9 M, {2 v) A% c}% [$ j* U  u) R
有源蜂鸣器就到这里,关于无源的蜂鸣器是跟LED相似的,不在讲解,这次就到这里了。) A7 X  O0 Q( z0 N. \
# i9 ~, m- c* L2 j* N6 G
赞 收藏 评论2 发布时间:2018-1-15 20:38

举报

2个回答
anywill 回答时间:2018-1-15 21:42:20
虚心学习
andey 回答时间:2018-1-16 09:15:09
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

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