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

STM32——悦耳的蜂鸣器实验

[复制链接]
feixiang20 发布时间:2018-1-15 20:38
我们将利用一个 IO 口来控制板载的无源蜂鸣器,实现蜂鸣器发声。通过本次实验,你将进一步了解 STM32 的 IO 口作为输出口使用的方法。实验目标:
* F6 H' i4 i+ ~7 y; a9 O9 ?6 u1、无源蜂鸣器发出悦耳声音。
& J, l5 O: n$ ]) T8 U8 L2、学会设置 STM32 的 GPIO 输出控制蜂鸣器。9 N2 M# |* b% W; M( [

' P* [; ?) E" Y6 h+ {$ O蜂鸣器简介) P+ v( \& s) n: u, d$ U
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。如下图所示9 ~+ e4 W( a+ }5 V2 y

- u' r9 {. a& p8 X6 b+ D' _ 1.jpg
# d4 \" J3 \0 L$ N+ j8 t8 Y( x4 s" k/ F- d6 W# k
本次实验所用的蜂鸣器是无源蜂鸣器,需要自己编写震荡部分
  y4 x" V, N5 z& q这里的无源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器带震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz 左右的方波驱动,才能发声。STM32 的单个 IO最大可以提供 25mA 电流,而蜂鸣器的驱动电流是 30mA 左右,算是比较接近。综合考虑可以直接驱动。' F- V% D2 Q; \. h
还有一个方案就是:STM32 的 IO 不直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32 的 IO 只需要提供不到 1mA 的电流就足够了。1 ~0 k( Y* l7 h2 k; X! e* _
硬件设计从原理图中,我们可以看到蜂鸣器是接到单片机的 PB6。而驱动无源蜂鸣器的原理就是产生 2~5Khz 左右的方波驱动,才能发声。所以要使蜂鸣器发声也就是将单片机 PB6 管脚每间隔一段时间不输出一个高低电平脉冲即可。
% V" B0 a( B& }/ |
6 h1 m0 Q2 Y% ^) `! E/ S% i5 | 2.jpg
  H! y6 H) E3 @3 \; n) x
5 w6 j9 p& r% z: e蜂鸣器 IO  初始化
& G/ C3 J* Z; J- Ovoid buzz_Init() //端口初始化. G+ D7 h, t# Y5 C6 d' ~
{8 v0 q. ]8 @3 @: e. z: s& t* Z# k
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
/ W/ M/ j2 p4 h. VRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* 开启 GPIO时钟 */$ D9 a6 q- M: N+ w& c1 L2 v1 T
/* 配置 GPIO 的模式和 IO 口 */
4 y* D+ q) Q; ?& I  W8 y+ r; KGPIO_InitStructure.GPIO_Pin=buzz; //选择你要设置的 IO 口( H9 u1 b$ M+ e9 Z5 o9 {9 e- a
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
- ?& z& K1 o7 ]$ c  m; \$ W! HGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
  H; d- w# H" j( V6 h  n: L; |8 CGPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化 GPIO */
. L6 x5 s  O* f1 L# G: r}
/ H. D$ y9 g. r" y6 D, }; f
* i- R& W5 n$ I5 i% h1 U蜂鸣器管脚定义在其头文件内如下:+ A, e" Y0 o# W) B; `' c4 A) ]
#define buzz GPIO_Pin_6 //PB6 定义端口 PB6
! M& v+ L8 R2 g3 y& R& \+ Q* h0 P  \9 P9 H
蜂鸣器发声函数   通过改变频率控制声音变化void buzz_lisen() //报警声$ t- n( ?) E  z: b. P* C
{2 f5 a2 l% `0 }. I& x4 h! d9 p9 Q
u32 i=1000;5 g  t+ S( g1 Q7 J% f$ W* I+ {, R
while(i--) //产生一段时间的 PWM 波,使蜂鸣器发声: q% p. B& A$ J% J0 I
{, k8 M- h! W2 I3 [& K
GPIO_SetBits(GPIOB,BZ);  //IO 口输出高电平: y4 p* W8 H/ w
delay(i);
( E( _7 b$ n; ?! qGPIO_ResetBits(GPIOB,BZ); //IO 口输出低电平# P3 g8 R$ u6 }4 J3 ^: S3 j
delay(i--);, P/ T1 s: W9 A5 a# I( Z7 C% c
}
9 L  L/ }  d5 x}$ ]2 x. O- Q" O8 B
* m& y' I, @* J1 U; Q) j
这里的蜂鸣器驱动发生没有使用stm32自带的pwm是自己模拟写的。
- o, _+ G. M3 q4 i$ i5 B所有驱动代码写完了,可以使用主函数调用了。
+ ^, E# j0 {+ t主函 数
+ r2 D  C# X* nint main()$ L# C: O- o8 E+ {
{ 6 p# ~0 m& D3 q; A! c
buzz_Init(); //端口初始化
4 a9 [7 j  x  p- x4 P; Twhile(1)
( x0 W* t+ q0 L" u2 g2 q7 g  ^5 u{; F& C  d1 E" |# P  S8 \
buzz_lisen();
$ t% Y! i  e/ d: t9 j# L2 q} 6 W3 D) p# j4 z; s/ R, c' ~
}
$ C3 p! n" X' {/ U7 u8 Z& ^4 B有源蜂鸣器就到这里,关于无源的蜂鸣器是跟LED相似的,不在讲解,这次就到这里了。
4 a% I8 V; B8 T6 e$ H. i$ k0 v  s$ \5 g# C" C& x( j
收藏 评论2 发布时间:2018-1-15 20:38

举报

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

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版