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

STM32——悦耳的蜂鸣器实验

[复制链接]
feixiang20 发布时间:2018-1-15 20:38
我们将利用一个 IO 口来控制板载的无源蜂鸣器,实现蜂鸣器发声。通过本次实验,你将进一步了解 STM32 的 IO 口作为输出口使用的方法。实验目标:+ J; Z0 m/ j) G. j' M0 N) g+ A# n
1、无源蜂鸣器发出悦耳声音。0 j3 s" h9 ~, N/ x$ P$ X2 Z
2、学会设置 STM32 的 GPIO 输出控制蜂鸣器。
9 |: ]  y9 ]' o( t1 s
0 r, Z0 i" ?. u+ t& e/ b/ D蜂鸣器简介
8 O1 @3 h' F+ l3 G1 _蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。如下图所示
$ O7 m6 h8 i: c7 A8 \5 J3 A9 G9 [) u8 A, L, @5 x: V6 u
1.jpg
$ x% l, N+ u$ F. D$ B* T! v1 S1 w8 j  ?& x% P4 ]" Y7 Y7 e
本次实验所用的蜂鸣器是无源蜂鸣器,需要自己编写震荡部分
; g  d! S. [6 S* L7 E8 C7 ?这里的无源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器带震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz 左右的方波驱动,才能发声。STM32 的单个 IO最大可以提供 25mA 电流,而蜂鸣器的驱动电流是 30mA 左右,算是比较接近。综合考虑可以直接驱动。0 J. r$ u7 D+ s& L7 G6 u" }9 P
还有一个方案就是:STM32 的 IO 不直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32 的 IO 只需要提供不到 1mA 的电流就足够了。
* [) A0 G+ B4 V) ~硬件设计从原理图中,我们可以看到蜂鸣器是接到单片机的 PB6。而驱动无源蜂鸣器的原理就是产生 2~5Khz 左右的方波驱动,才能发声。所以要使蜂鸣器发声也就是将单片机 PB6 管脚每间隔一段时间不输出一个高低电平脉冲即可。
7 X6 r/ P* I1 Y8 i' g
, ~& Z, a0 L! g; K( w+ w 2.jpg
1 u1 D. l) B2 a1 a$ Y* N: T  r
% e7 [4 ~. E; M蜂鸣器 IO  初始化
% l1 z# w1 z3 K5 E3 Kvoid buzz_Init() //端口初始化
  L3 `& m( @) s. T{; w  m, b6 X. V+ \
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
  w: B& z. B) l: D2 BRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* 开启 GPIO时钟 */! b; [0 H9 v  A7 J  g
/* 配置 GPIO 的模式和 IO 口 */
. c2 P4 k& Q% Q( n! H) ^GPIO_InitStructure.GPIO_Pin=buzz; //选择你要设置的 IO 口5 Z! U  \: Y6 O+ i6 ~! T
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式2 l% G. k: {; y% v% I+ b7 D
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
+ ]+ M. h  R% t6 O# hGPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化 GPIO */
% d. v. w& L3 b% m# B  M}
/ q3 M9 e5 t+ x$ {8 J6 ]! Z2 d4 _  Q. r
蜂鸣器管脚定义在其头文件内如下:
5 ]9 ?0 I+ `' |3 ~#define buzz GPIO_Pin_6 //PB6 定义端口 PB6) j0 X7 p% C: y. }  ^; m& R

' y/ C# V1 X" f; S1 }# }& t0 J. A# O蜂鸣器发声函数   通过改变频率控制声音变化void buzz_lisen() //报警声
; Z- C9 ~) H% }0 [, ?9 K' P5 O{$ D, O! B/ q. L
u32 i=1000;1 o) L% P: z$ A1 L+ m, o
while(i--) //产生一段时间的 PWM 波,使蜂鸣器发声4 a$ S* L$ C' R
{
1 Z" k- n: H5 A, m2 i5 g& D+ YGPIO_SetBits(GPIOB,BZ);  //IO 口输出高电平
9 h; \$ O1 W+ V& m7 I  b( x0 Tdelay(i);
& x/ }# ]- P& c6 e6 B  D+ D" dGPIO_ResetBits(GPIOB,BZ); //IO 口输出低电平& o6 j  @( u& y# m4 }, G& W( z
delay(i--);
2 v+ l: Q7 z) r1 ~" X& o}
$ A  ^) l# t/ H& t; z9 U! o}0 O# ~; E+ O  V4 X

; g4 \7 }: }" |' s! O- e这里的蜂鸣器驱动发生没有使用stm32自带的pwm是自己模拟写的。1 c0 C! A, l" _* Y! _$ [# v2 z
所有驱动代码写完了,可以使用主函数调用了。  b( q# x0 y; J. b6 E& ?
主函 数
! w, @3 @+ c/ ~+ Gint main()
7 a! ^& e" r  J) j{ 2 s3 _0 |+ m: g) E6 {
buzz_Init(); //端口初始化$ W9 g. C' ~% |5 A- P
while(1), b% g& S- e( F8 J
{, a: b1 n8 J5 \& U, I
buzz_lisen();
* b  D: `! p/ G! V1 s" N) J2 Q} " B$ e. p3 W/ O" z8 L& U! M
}) Q  n& P' u9 F7 _
有源蜂鸣器就到这里,关于无源的蜂鸣器是跟LED相似的,不在讲解,这次就到这里了。
1 v: B( e% m8 Q! M3 R" d3 U* u2 [
! N! d7 a( E, D: ?8 Y7 ^
收藏 评论2 发布时间:2018-1-15 20:38

举报

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

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版