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

STM32——悦耳的蜂鸣器实验

[复制链接]
feixiang20 发布时间:2018-1-15 20:38
我们将利用一个 IO 口来控制板载的无源蜂鸣器,实现蜂鸣器发声。通过本次实验,你将进一步了解 STM32 的 IO 口作为输出口使用的方法。实验目标:
  D- e- a; S  H9 T& l1、无源蜂鸣器发出悦耳声音。
' T1 ~( T  i8 }; R! m$ n# P; L2、学会设置 STM32 的 GPIO 输出控制蜂鸣器。( X. P0 i9 y2 C2 v) R2 W3 J) G

6 H6 l; O% C; O) D$ b8 B( r蜂鸣器简介
- A% s1 a6 ~) E) c; D* T蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。如下图所示; G, s$ B$ |' c2 J7 r
* w# L; b9 c9 I) N; l4 I
1.jpg
0 h* g0 o6 H8 w4 R* E+ H
3 u# s: |" @% Q& x9 e9 T7 B& w本次实验所用的蜂鸣器是无源蜂鸣器,需要自己编写震荡部分% z3 R' @: k- k6 [7 P; l8 k  `
这里的无源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器带震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz 左右的方波驱动,才能发声。STM32 的单个 IO最大可以提供 25mA 电流,而蜂鸣器的驱动电流是 30mA 左右,算是比较接近。综合考虑可以直接驱动。+ P. r4 \! u1 H- {# J+ F, b+ ]
还有一个方案就是:STM32 的 IO 不直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32 的 IO 只需要提供不到 1mA 的电流就足够了。
$ O/ h0 ?2 |  n5 h# h' e: O9 X8 U+ X硬件设计从原理图中,我们可以看到蜂鸣器是接到单片机的 PB6。而驱动无源蜂鸣器的原理就是产生 2~5Khz 左右的方波驱动,才能发声。所以要使蜂鸣器发声也就是将单片机 PB6 管脚每间隔一段时间不输出一个高低电平脉冲即可。
! v1 ^% D$ H" ]( T& ]0 u
/ d0 Q, }) M: i( r 2.jpg & Z# n2 t' w+ V
+ R; N0 @# ^8 Z" D0 r3 u' Y
蜂鸣器 IO  初始化& {' j# s$ z8 _+ ^: ~' Q! V
void buzz_Init() //端口初始化" P6 U3 y7 X& h
{' a4 ^$ o& f1 ?2 i! x# o
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
8 @9 a1 m" }7 l$ i" [1 a; QRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* 开启 GPIO时钟 */
+ H9 \4 D; ?. y! Q# x: Q/* 配置 GPIO 的模式和 IO 口 */( S$ ]: d2 C9 M' W" m6 y9 Z
GPIO_InitStructure.GPIO_Pin=buzz; //选择你要设置的 IO 口1 E5 d1 {( D0 T& `% ~
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式7 |2 g- h" e3 o+ ^
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
& G% _3 R1 A* VGPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化 GPIO */
7 E$ _# S2 \, d/ P0 m* ]# q0 `}
3 J8 |7 q, Y# C" n% Q; H4 H$ I
# x6 Y2 @, y# v( M0 @! g蜂鸣器管脚定义在其头文件内如下:
; |2 F% k8 S& f% f% V( K+ g# Z#define buzz GPIO_Pin_6 //PB6 定义端口 PB6
: k( {, s' K' e" S3 C" n$ {1 t1 y( i
) T4 [7 D2 Q; c0 p0 o6 d蜂鸣器发声函数   通过改变频率控制声音变化void buzz_lisen() //报警声
; @8 R: K; p& a2 q# V0 B! x{6 L! b0 e# S& g+ a8 c, x! T8 y$ N
u32 i=1000;) \$ A; y- R5 s- e, O! o
while(i--) //产生一段时间的 PWM 波,使蜂鸣器发声
  X. C* o! X; V) J+ s{
9 P2 D* }. F, N* f2 t3 LGPIO_SetBits(GPIOB,BZ);  //IO 口输出高电平; Z7 ]6 p! m4 z, c: @
delay(i);1 y9 I/ Z" a4 C: g  _$ u
GPIO_ResetBits(GPIOB,BZ); //IO 口输出低电平
% b4 p  Y9 }7 L( @: M% pdelay(i--);+ o6 e* C+ I; z3 ^7 `2 v% g, @
} # K1 C- E, |: [( ~9 P: P' q+ U: c
}! C' W# M$ p1 Y0 Q

1 H: {0 Z% r+ f* a这里的蜂鸣器驱动发生没有使用stm32自带的pwm是自己模拟写的。5 Q7 B$ ?8 ]% z& G5 j0 d4 R
所有驱动代码写完了,可以使用主函数调用了。
# K6 E9 v$ N  R! @: B主函 数% {) _5 B, ?0 E+ [2 q. k; z
int main()8 L! x/ h; N& M) H, E  M4 c2 ^
{
) [5 t6 G/ i& P; k3 zbuzz_Init(); //端口初始化
0 x, x8 c- o1 Z; q: @2 M7 Mwhile(1)9 |6 Y% A; r0 X; p$ l
{1 o. Z, X. {" {* I) c. O
buzz_lisen();
+ k' t% D7 n5 ]' i  ~+ E7 m} 8 Q: j- W( M. K: k" N+ L" d6 |
}
" q* i' Y3 ?; Y有源蜂鸣器就到这里,关于无源的蜂鸣器是跟LED相似的,不在讲解,这次就到这里了。, h6 W0 r+ ?, t% N
+ E, i1 H) k# {9 l$ n9 {: e
收藏 评论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 手机版