打工人日报#20251210
有源蜂鸣器和无源蜂鸣器是两种常见的发声器件,核心区别在于是否内置振荡电路,以及由此导致的驱动方式、应用场景等差异。
核心区别
- 结构与驱动方式
有源蜂鸣器
内置振荡电路(包含三极管、电阻、电容等组成的振荡模块),只需通入直流电压(如 3V、5V),即可通过内部振荡电路产生固定频率的声波,直接发声。
引脚通常为 2 根(正、负极),极性敏感(需区分正负极供电)。
无源蜂鸣器
无内置振荡电路,本质是一个电磁式扬声器(由线圈、磁铁、振动膜片组成),需要外部输入交变信号(如方波、正弦波),通过交变电流产生变化的磁场,带动膜片振动发声。
引脚无极性(部分型号可能有正负极标识,但主要是为了方便焊接,实际可互换)。 - 发声频率
有源蜂鸣器:频率固定(由内置振荡电路决定,常见 4kHz 左右),只能发出单一音调。
无源蜂鸣器:频率由外部输入信号的频率决定,可通过改变信号频率发出不同音调(如音乐、高低音报警)。 - 功耗与体积
有源蜂鸣器:因内置电路,功耗稍高(通常几 mA 到十几 mA),体积相对较大(内置电路占用空间)。
无源蜂鸣器:无额外电路,功耗较低(通常 1-5mA),体积可做得更小。 - 价格
有源蜂鸣器因包含振荡电路,成本略高;无源蜂鸣器结构简单,价格更低。
应用场景
- 有源蜂鸣器
适合只需单一固定音调的场景,驱动简单(无需复杂信号生成电路),例如:
设备上电提示音、故障报警(如烟雾报警器、门禁系统);
按键反馈音(如计算器、遥控器);
低功耗场景中需要简单发声(如电池供电的小型仪器)。
优点:驱动方便,只需连接直流电源即可工作,适合对电路设计复杂度要求低的场景。 - 无源蜂鸣器
适合需要多样化音调的场景,可通过编程控制频率实现丰富音效,例如:
音乐播放(如玩具电子琴、儿童故事机);
多模式报警(如不同频率区分不同故障类型,如设备过热、电压异常);
语音提示(配合特定频率组合模拟简单语音信号)。
优点:灵活性高,可实现复杂音效,且功耗低、体积小,适合需要定制化声音的场景。
总结

使用 STM32 控制有源蜂鸣器的代码示例,假设蜂鸣器连接到 PA5 引脚,以 STM32F407 为例,使用 HAL 库进行开发
bash
#include "stm32f4xx_hal.h"
// 定义蜂鸣器控制引脚
#define Buzzer_GPIO_Port GPIOA
#define Buzzer_Pin GPIO_PIN_5
// 初始化蜂鸣器相关GPIO
void Buzzer_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA5为推挽输出模式
GPIO_InitStruct.Pin = Buzzer_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(Buzzer_GPIO_Port, &GPIO_InitStruct);
// 初始状态关闭蜂鸣器
HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET);
}
// 控制蜂鸣器发声
void Buzzer_On(void)
{
HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_SET);
}
// 控制蜂鸣器停止发声
void Buzzer_Off(void)
{
HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET);
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 初始化蜂鸣器
Buzzer_Init();
while (1)
{
// 蜂鸣器发声1秒
Buzzer_On();
HAL_Delay(1000);
// 蜂鸣器停止发声1秒
Buzzer_Off();
HAL_Delay(1000);
}
}
Buzzer_Init函数用于初始化蜂鸣器所连接的 GPIO 引脚,将其配置为推挽输出模式,并初始化为低电平(蜂鸣器关闭状态)。
Buzzer_On函数通过设置引脚为高电平来使蜂鸣器发声。
Buzzer_Off函数通过设置引脚为低电平来使蜂鸣器停止发声。
在main函数中,通过循环调用Buzzer_On和Buzzer_Off函数,实现蜂鸣器每隔 1 秒发声和停止发声的效果。
阅读
《县中的教育》
