从光敏电阻到麦克风:用单片机AD/DA和运放搞定传感器信号采集(附电路分析)
2026/4/20 2:11:39 网站建设 项目流程

从光敏电阻到麦克风:用单片机AD/DA和运放搞定传感器信号采集(附电路分析)

当我们需要将现实世界中的光强、温度或声音信号转化为数字信号进行处理时,传感器信号采集系统就成为了连接物理世界与数字世界的桥梁。本文将带你从零开始,构建一个完整的传感器信号采集链路,涵盖从传感器选型、信号调理电路设计到单片机AD转换的每个环节。无论你是想制作一个光照强度监测装置,还是设计简单的音频采集系统,这些核心技能都能让你事半功倍。

1. 传感器信号采集系统架构

一个完整的传感器信号采集系统通常包含三个关键环节:传感器模块信号调理电路AD转换模块。光敏电阻、热敏电阻这类电阻型传感器的输出信号往往非常微弱,且容易受到干扰,这就需要我们设计合理的信号调理电路。

典型的信号链路如下:

传感器 → 信号调理 → AD转换 → 单片机

信号调理电路的主要作用包括:

  • 阻抗匹配(如电压跟随器)
  • 信号放大(比例放大器)
  • 滤波(消除高频噪声)
  • 电平转换(将信号调整到AD输入范围内)

以光敏电阻为例,在10-100kΩ范围内变化时,直接分压输出的电压可能只有0.1-1V的波动,而大多数AD转换器的满量程输入为0-5V。这时就需要通过运放电路将信号放大到适合采样的范围。

2. 关键硬件选型与电路设计

2.1 传感器特性对比

传感器类型典型阻值范围灵敏度响应时间适用场景
光敏电阻10Ω-1MΩ10-100ms光照检测
热敏电阻1kΩ-100kΩ1-10s温度监测
驻极体麦克风输出mV级信号<1ms声音采集

2.2 运算放大器电路设计

运放是信号调理的核心元件,以下是三种最常用的电路配置:

1. 电压跟随器(阻抗匹配)

Vin ────┬───── │ > │ └───┬─── Vout > │ GND

提示:电压跟随器输入阻抗极高,输出阻抗极低,适合作为缓冲级隔离前后电路。

2. 同相放大器(信号放大)

R1 Vin ────^^^^───┬─── Vout > R2 │ GND ────^^^^───┘

放大倍数:A = 1 + R2/R1

3. 反相放大器(信号调理)

R1 Vin ────^^^^───┬─── >─── Vout R2 │ GND ────^^^^───┘

放大倍数:A = -R2/R1

实际设计麦克风前置放大器时,通常会选择同相放大结构,并加入高通滤波:

# 伪代码:计算放大电路参数 def calculate_components(gain=50, cutoff_freq=20Hz): R1 = 1e3 # 1kΩ基础电阻 R2 = (gain - 1) * R1 C = 1/(2*3.14*R1*cutoff_freq) return R2, C

3. AD转换实战配置

3.1 ADC0809经典电路分析

ADC0809是一款8位逐次逼近型AD转换器,其典型应用电路包含以下几个关键部分:

  1. 参考电压电路:通常采用TL431提供稳定的2.5V基准
  2. 时钟电路:外接RC振荡或使用单片机提供500kHz时钟
  3. 输入通道选择:通过ADDA、ADDB、ADDC三位地址选择8路输入
  4. 控制信号
    • START:启动转换脉冲
    • EOC:转换结束标志
    • OE:输出使能

连接STM32的典型接线方式:

ADC0809 STM32F103 VREF(+) → 3.3V IN0 → 传感器信号 ADDA/B/C → GPIO输出 START → GPIO输出 EOC → GPIO输入 D0-D7 → GPIO输入

3.2 软件驱动实现

以下是基于STM32 HAL库的ADC0809驱动代码片段:

#define ADC_PORT GPIOA #define START_PIN GPIO_PIN_0 #define EOC_PIN GPIO_PIN_1 uint8_t ADC0809_Read(uint8_t channel) { // 设置通道选择 HAL_GPIO_WritePin(ADC_PORT, ADDA_PIN, (channel&0x1)?GPIO_PIN_SET:GPIO_PIN_RESET); HAL_GPIO_WritePin(ADC_PORT, ADDB_PIN, (channel&0x2)?GPIO_PIN_SET:GPIO_PIN_RESET); HAL_GPIO_WritePin(ADC_PORT, ADDC_PIN, (channel&0x4)?GPIO_PIN_SET:GPIO_PIN_RESET); // 启动转换 HAL_GPIO_WritePin(ADC_PORT, START_PIN, GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(ADC_PORT, START_PIN, GPIO_PIN_RESET); // 等待转换完成 while(HAL_GPIO_ReadPin(ADC_PORT, EOC_PIN) == GPIO_PIN_RESET); // 读取数据 return GPIO_ReadInputData(ADC_DATA_PORT) & 0xFF; }

4. 完整项目案例:环境光强监测系统

4.1 硬件组成

  • 传感部分:GL5528光敏电阻(10-200kΩ)
  • 信号调理
    • 第一级:电压跟随器(LM358)
    • 第二级:同相放大器(增益=20,R1=1k,R2=19k)
  • AD转换:ADC0809(8位精度)
  • 主控:STM32F103C8T6

4.2 关键电路参数计算

  1. 分压电路设计

    • 光敏电阻与10kΩ固定电阻分压
    • 光照强度与输出电压关系:
      强光(100Lux):R≈10kΩ → Vout=2.5V 弱光(10Lux):R≈100kΩ → Vout=0.45V
  2. 放大电路设计

    • 目标将0.5-2.5V信号放大到0-5V范围
    • 选择增益=20的同相放大器
    • 实际输出电压:Vout = (1 + R2/R1) * Vin = 20 * Vin
  3. AD采样值转换

    • 8位AD,参考电压5V
    • 分辨率:5V/256 ≈ 19.5mV
    • 照度计算公式:
      def lux_calculate(adc_value): voltage = adc_value * 19.5 # mV resistance = 10000 * (5000 - voltage) / voltage # Ω return 10 ** ((log10(resistance) - 4.5) / -0.8) # Lux

4.3 系统优化技巧

  1. 噪声抑制

    • 在运放电源引脚加0.1μF去耦电容
    • 信号线采用屏蔽线或双绞线
    • 添加RC低通滤波(fc=100Hz)
  2. 校准方法

    • 两点校准法:
      • 黑暗环境下记录AD值(零点)
      • 标准光源下记录AD值(满量程)
    • 线性插值公式:
      float calibrate(uint8_t raw, uint8_t dark, uint8_t bright) { return (raw - dark) * 100.0 / (bright - dark); // 百分比 }
  3. 软件滤波算法

    • 移动平均滤波(窗口大小=10)
    • 中值滤波(采样5次取中间值)
    • 一阶滞后滤波:
      #define ALPHA 0.2 float filtered_value = last_value * (1-ALPHA) + new_sample * ALPHA;

在实际项目中,我发现信号调理电路的稳定性很大程度上取决于电源质量。使用普通USB电源时,光照读数可能会有±5%的波动,而改用锂电池供电后,波动降低到了±1%以内。另外,将运放电路与数字电路分区布局,也能显著降低数字噪声对模拟信号的干扰。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询