普中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延时)