请选择 进入手机版 | 继续访问电脑版

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

STM32——悦耳的蜂鸣器实验

[复制链接]
feixiang20 发布时间:2018-1-15 20:38
我们将利用一个 IO 口来控制板载的无源蜂鸣器,实现蜂鸣器发声。通过本次实验,你将进一步了解 STM32 的 IO 口作为输出口使用的方法。实验目标:) r8 U' L7 V# i, Y- T
1、无源蜂鸣器发出悦耳声音。, R  Q' ?. i; z% T! B
2、学会设置 STM32 的 GPIO 输出控制蜂鸣器。
- W& Z- V" x) w0 u; G: I3 ?/ x* C( U# U9 z4 s& P0 ]& _! u3 D0 t5 |0 A
蜂鸣器简介+ ]" d" I. J$ {+ @# O+ q* u  w
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。如下图所示6 a! A+ q. O0 |7 b0 [

: o  s' [( \0 z% f% v* R! F 1.jpg * _; P4 _7 H! t4 Y. `" O  j
1 v. F3 h9 `1 l8 S' q, F
本次实验所用的蜂鸣器是无源蜂鸣器,需要自己编写震荡部分% a( s9 D4 J2 {4 i, A$ p9 Z, I
这里的无源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器带震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz 左右的方波驱动,才能发声。STM32 的单个 IO最大可以提供 25mA 电流,而蜂鸣器的驱动电流是 30mA 左右,算是比较接近。综合考虑可以直接驱动。1 e/ Y' g0 L+ t( N
还有一个方案就是:STM32 的 IO 不直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32 的 IO 只需要提供不到 1mA 的电流就足够了。# `& ]# O  d$ H9 {& e2 ~+ p6 m
硬件设计从原理图中,我们可以看到蜂鸣器是接到单片机的 PB6。而驱动无源蜂鸣器的原理就是产生 2~5Khz 左右的方波驱动,才能发声。所以要使蜂鸣器发声也就是将单片机 PB6 管脚每间隔一段时间不输出一个高低电平脉冲即可。1 t' C/ V* ]0 I  l0 k
1 g$ N9 R+ a4 J  A6 G
2.jpg
) R. i  ?0 Y$ @3 }& |* h/ }
) E2 i0 ^# O0 ~* r! `1 n蜂鸣器 IO  初始化6 U9 o& l' v# O, h# m
void buzz_Init() //端口初始化: T: X9 P% y8 Y/ y1 h. ~
{1 F- J% g# t6 m2 ?
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
5 X) @" f: y4 K; o; k  M2 c4 v" [& QRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* 开启 GPIO时钟 */1 X" B! h& }8 h7 [( Z& G' [
/* 配置 GPIO 的模式和 IO 口 */9 E3 `: p1 O2 L4 j! @
GPIO_InitStructure.GPIO_Pin=buzz; //选择你要设置的 IO 口
- X# y  K3 W* H: P* _GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式7 C* C4 p+ d& X- g& L( a
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
9 V* F9 J& [! {  \$ [/ _GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化 GPIO */
3 p1 U) i6 Y: c$ h}) G8 C% ?' }5 @# c/ w, q0 ?% x0 o
$ V1 w  c( s* x
蜂鸣器管脚定义在其头文件内如下:1 G  x, K2 E! W5 i: Z. X
#define buzz GPIO_Pin_6 //PB6 定义端口 PB6
0 S8 g+ e! K- m' f6 P* j/ |5 `5 d8 Z
蜂鸣器发声函数   通过改变频率控制声音变化void buzz_lisen() //报警声
( ^  ]# h  \! A! S% \$ u$ V) }{
2 k0 B5 I: D  e% }u32 i=1000;
# M5 u8 `4 l7 W7 g" C/ ewhile(i--) //产生一段时间的 PWM 波,使蜂鸣器发声3 j3 v% Z( s5 K( i! {' S
{* S* K) e4 [+ O. G6 c9 P
GPIO_SetBits(GPIOB,BZ);  //IO 口输出高电平1 J( m3 F7 n- l: x
delay(i);/ f& G2 A2 g8 g9 ]
GPIO_ResetBits(GPIOB,BZ); //IO 口输出低电平' I& n" C9 j, r4 M: P' A
delay(i--);
# ~8 V- P. }7 d' X+ C' w}
; F8 d: p+ I8 i, r2 j5 b# p}! Z* H$ G2 u" [; Q

' W' X" `! E5 d  s. P! V  P! ?这里的蜂鸣器驱动发生没有使用stm32自带的pwm是自己模拟写的。
3 W) x: H- k1 J- q2 O$ i所有驱动代码写完了,可以使用主函数调用了。
5 Z# ?9 B* \. V: }  c/ h主函 数; A) `/ @* W8 a$ l
int main()
  K4 A4 Q4 ^4 `  X, y! E% G! q3 r{
! j9 l: W3 j' C- }- h/ u% G8 d! fbuzz_Init(); //端口初始化* s: i+ I  x5 [2 }- \6 z; K
while(1)0 c4 }+ m* B  X( x
{
$ W9 `- W/ r4 x* u4 qbuzz_lisen();
( X  J  E/ _- F8 R0 |}
$ a' I  l: ]6 P" f6 T3 l2 m}5 J1 i6 S+ w" B9 b
有源蜂鸣器就到这里,关于无源的蜂鸣器是跟LED相似的,不在讲解,这次就到这里了。- z8 ~( K0 j2 `( @3 P8 n- i. r& R

5 @1 d* L+ N2 G; T: u
收藏 评论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 手机版