
我们将利用一个 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 G9 [) u8 A, L, @5 x: V6 u ![]() ! v1 S1 w8 j ?& x% P4 ]" Y7 Y7 e 本次实验所用的蜂鸣器是无源蜂鸣器,需要自己编写震荡部分 这里的无源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器带震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5Khz 左右的方波驱动,才能发声。STM32 的单个 IO最大可以提供 25mA 电流,而蜂鸣器的驱动电流是 30mA 左右,算是比较接近。综合考虑可以直接驱动。0 J. r$ u7 D+ s& L7 G6 u" }9 P 还有一个方案就是:STM32 的 IO 不直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32 的 IO 只需要提供不到 1mA 的电流就足够了。 硬件设计从原理图中,我们可以看到蜂鸣器是接到单片机的 PB6。而驱动无源蜂鸣器的原理就是产生 2~5Khz 左右的方波驱动,才能发声。所以要使蜂鸣器发声也就是将单片机 PB6 管脚每间隔一段时间不输出一个高低电平脉冲即可。 ![]() 蜂鸣器 IO 初始化 void buzz_Init() //端口初始化 {; w m, b6 X. V+ \ GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* 开启 GPIO时钟 */! b; [0 H9 v A7 J g /* 配置 GPIO 的模式和 IO 口 */ 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; //设置传输速率 GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化 GPIO */ } $ {8 J6 ]! Z2 d4 _ Q. r 蜂鸣器管脚定义在其头文件内如下: #define buzz GPIO_Pin_6 //PB6 定义端口 PB6) j0 X7 p% C: y. } ^; m& R 蜂鸣器发声函数 通过改变频率控制声音变化void buzz_lisen() //报警声 {$ 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 { GPIO_SetBits(GPIOB,BZ); //IO 口输出高电平 delay(i); GPIO_ResetBits(GPIOB,BZ); //IO 口输出低电平& o6 j @( u& y# m4 }, G& W( z delay(i--); } }0 O# ~; E+ O V4 X 这里的蜂鸣器驱动发生没有使用stm32自带的pwm是自己模拟写的。1 c0 C! A, l" _* Y! _$ [# v2 z 所有驱动代码写完了,可以使用主函数调用了。 b( q# x0 y; J. b6 E& ? 主函 数 int main() { 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$ e. p3 W/ O" z8 L& U! M }) Q n& P' u9 F7 _ 有源蜂鸣器就到这里,关于无源的蜂鸣器是跟LED相似的,不在讲解,这次就到这里了。 |
虚心学习![]() |