普中STM32-PZ6806L开发板(HAL库函数实现-无源蜂鸣器响动)

简介

本篇将驱动无源蜂鸣器进行5KHz的响动。

电路原理图

蜂鸣器电路原理图
在这里插入图片描述
主芯片驱动引脚原理图
在这里插入图片描述

其他知识

蜂鸣器类型

蜂鸣器分为
有源蜂鸣器 :触发就会响。
无源蜂鸣器 : 需要给源, 输出一定频率的音频信号, 震动发声;

占空比

为什么占空比总是50%呢?
当蜂鸣器的信号占空比较低时,即高电平时间较短,低电平时间较长。这时蜂鸣器的发声强度会较低,声音持续时间也较短。
当蜂鸣器的信号占空比较高时,即高电平时间较长,低电平时间较短。这时蜂鸣器的发声强度也会较高,但声音持续时间相对较短。因为蜂鸣器在高电平时间过长的情况下,虽然能够充分振动产生较大的声音,但声音传播时间变短,导致发声时间较短。这种情况下,蜂鸣器的声音更加尖锐和紧凑。- 来自 蜂鸣器发声强度与信号占空比的关系是怎么样的?
虽然查到的资料并没有说明占空比50%是绝对的, 除非你仔细测试研究了适合你蜂鸣器的占空比, 否则50%就是比较合适的, 本次实验也是在50%占空比的情况下进行测试的;

us延时

参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)
本次使用us延时, 而不是PWM实现对应音阶频率, 需要用到us延时, 而系统提供的延时是ms级别的, 所以需要实现一个us的延时方式。

半周期

因为占空比是50%, 高低电平各一半, 半周期指的就是时间的一半

实现振动

如何实现振动, 浅意来说就需要实现波, 令蜂鸣片振动,从而发声, 无源蜂鸣器发声频率范围是在1.5KHz-5KHz, 所以实现这个范围的延时, T(时间s) = 1/f(Hz频率), 例如我要产生5KHz的音频信号, 时间是200us, 那半周期就是100us, 就是在

实现步骤

创建项目

参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

TIM2初始化

TIM2用来实现us级别的延时
初始化 参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)

初始化蜂鸣器引脚

PB5 引脚设置为输出
在这里插入图片描述

添加用户代码

main.c

/*
 *  time : 执行次数
*/
void BEEP_5KHzAction(uint16_t time)
{
	while (time--)
	{
		HAL_GPIO_TogglePin(BEEP_PORT, BEEP_PIN); 
		delay_us(100); // 半周期100us
	}
}

int main()
{
...
while (1)
{
	BEEP_5KHzAction(1); 
}
...
}

代码

不需要下载, 基本代码上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)
普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)