1. 引言
声音传感器模块这玩意一般在什么环境检测类的课设毕设用的比较多,什么工地环境检测,声控灯、噪音监测、安防报警等场景。
本文将详细介绍硬件连接、STM32CubeMX配置以及完整的HAL库驱动代码,最终通过串口打印实时噪声值(ADC原始值、电压值、声音强度等级)。

2. 硬件准备
-
STM32F103C8T6开发板(核心板或最小系统板均可)
-
高感度声音传感器模块(带AO模拟输出引脚)
-
USB转TTL模块(用于串口打印调试)
-
杜邦线若干
声音传感器模块引脚说明
| 引脚 | 功能 |
|---|---|
| VCC | 3.3V/5V电源(本文使用3.3V) |
| GND | 地 |
| AO | 模拟信号输出(接STM32 ADC) |
| DO | 数字信号输出(本文未使用) |
3. 硬件连接
| 传感器引脚 | STM32引脚 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| AO | PA3 (ADC1通道3) |
| DO | 未使用 |
将USB转TTL模块的TX、RX分别连接STM32的PA9(TX)、PA10(RX),用于串口输出。
4. STM32CubeMX配置
4.1 时钟配置
-
HSE:外部晶振8MHz
-
系统时钟:72MHz
-
APB2外设时钟:72MHz
4.2 ADC1配置
-
开启ADC1,选择IN3(对应PA3)
-
模式:独立模式,单次转换,软件触发
-
采样时间:55.5周期(保证稳定读数)
-
ADC分辨率:12位

4.3 USART1配置
-
模式:异步
-
波特率:115200
-
数据位:8位
-
停止位:1位
-
无校验
4.4 生成代码
选择HAL库,生成MDK-ARM工程。
5. 代码实现
5.1 关键代码 (main.c)
/* 根据ADC值判断噪声等级 */
void Display_Noise_Level(uint16_t adc_val)
{
float voltage = adc_val * 3.3f / 4095.0f;
if (adc_val < 800) {
sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Quiet\r\n", adc_val, voltage);
}
else if (adc_val < 1600) {
sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Normal\r\n", adc_val, voltage);
}
else if (adc_val < 2400) {
sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Loud\r\n", adc_val, voltage);
}
else if (adc_val < 3200) {
sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Very Loud\r\n", adc_val, voltage);
}
else {
sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=!DANGER!\r\n", adc_val, voltage);
}
printf("%s", msg_buffer);
}
int main(void)
{
HAL_ADC_Start(&hadc1);
printf("\r\nNoise Sensor Test Start!\r\n");
printf("Sampling every 500ms...\r\n\r\n");
while (1)
{
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
{
adc_value = HAL_ADC_GetValue(&hadc1);
Display_Noise_Level(adc_value);
}
HAL_Delay(500);
}
}
5.2 代码说明
-
ADC读取 :使用
HAL_ADC_PollForConversion等待转换完成,然后读取12位采样值。 -
电压换算:参考电压3.3V,分辨率4096,公式:电压 = 采样值 × 3.3 / 4095。
-
噪声分级:根据ADC值将声音分为"安静""正常""响亮""非常响亮""危险"五个等级,阈值可根据实际环境调整。
-
串口输出 :重定向
printf到USART1,每500ms输出一次噪声数据。
6. 测试结果
将程序下载到开发板后,打开串口助手(115200-8-1-N),这里我放了一首歌,可以看到如下输出:

这一章节比较简单,就不放代码了,主要还是一个ADC转换