第二章:模拟传感器接口——运算放大器基础、信号调理与ADC选型

大家好,我是你们的老朋友。今天咱们聊聊传感器接入里最“硬核”的一环——模拟接口。

说实话,我见过太多项目,传感器选得挺好,算法也写得漂亮,结果卡在模拟前端上。信号没调理好,ADC采出来的数据全是噪声,后面再好的融合算法也白搭。所以这一章,咱们把基础打扎实。

2.1 运算放大器基础:为什么你需要它?

传感器输出的信号,通常很微弱。比如热电偶,输出只有几毫伏。你直接送给ADC?ADC根本“看”不见。这时候就需要运算放大器(运放)上场。

运放的核心作用就三个:放大、缓冲、差分转换。

  • 放大:把微弱的mV级信号放大到ADC能处理的V级范围。
  • 缓冲:高输入阻抗,低输出阻抗。说白了,就是不让传感器被后级电路“拖垮”。
  • 差分转单端:很多传感器输出是差分信号(比如桥式压力传感器),而大多数ADC是单端输入,运放可以完成这个转换。

重要概念:虚短与虚断

运放工作在深度负反馈时,同相输入端和反相输入端的电压近似相等(虚短),流入输入端的电流近似为0(虚断)。这是所有运放电路分析的基础。

我刚开始学运放时,总觉得“虚短虚断”是玄学。后来在项目里调试一个pH计电路,发现输出死活不对,最后发现是反馈电阻焊错了。嗯,从那以后,我再也不敢小看这两个概念。

2.2 信号调理电路:滤波与放大

传感器信号进了运放,不等于万事大吉。真实世界里,噪声无处不在——50Hz工频干扰、高频开关噪声、传感器自身的抖动。所以,信号调理的核心就是先滤波,再放大(或者反过来,看具体场景)。

2.2.1 滤波电路

我个人习惯,在运放输入端先加一级无源RC低通滤波。为什么?简单、便宜、不引入额外噪声。

比如,一个截止频率为100Hz的低通滤波器:

// 无源RC低通滤波器设计
// 截止频率 f_c = 1 / (2 * π * R * C)
// 假设 R = 15.9kΩ, C = 0.1μF
// f_c ≈ 100Hz

// 实际项目中,我常用 R=10kΩ, C=1μF,截止频率约16Hz
// 专门滤除50Hz工频干扰

如果对滤波效果要求更高,可以用有源滤波器(比如Sallen-Key结构)。但要注意,有源滤波器会引入运放自身的噪声和失调。我在一个医疗设备项目里吃过这个亏——用了四阶有源滤波器,结果运放自身的1/f噪声把信号淹没了。后来换成无源+低噪声运放,问题解决。

2.2.2 放大电路

最常用的就是同相放大器和反相放大器。我个人偏爱同相放大器,因为输入阻抗高,不拉低传感器信号。

同相放大器增益公式:G = 1 + Rf / Rg

举个例子,你想把0~10mV的信号放大到0~3.3V(适配3.3V ADC),增益需要330倍。但我不建议一级放大330倍——运放的失调电压和噪声也会被放大330倍。我的做法是:两级放大,第一级放大10倍,第二级放大33倍,中间加一级RC滤波。

实战技巧: 运放选型时,注意看“增益带宽积”(GBP)。比如你放大100倍,信号频率1kHz,那么运放的GBP至少需要100 * 1kHz = 100kHz。留点余量,选1MHz以上的运放比较稳妥。

2.3 ADC选型与驱动:以ADS1115为例

信号调理好了,接下来就是模数转换。ADC选型,我主要看三个参数:分辨率、采样率、输入范围。

参数 说明 我的建议
分辨率 位数越高,量化噪声越小 一般传感器12~16位够用,高精度场景用24位
采样率 每秒采样次数(SPS) 根据信号最高频率的2倍以上(奈奎斯特定理)
输入范围 ADC能接受的电压范围 最好与运放输出范围匹配,避免削波

ADS1115是我非常喜欢的一款ADC。16位分辨率、内置参考电压、I2C接口、可编程增益放大器(PGA),非常适合嵌入式传感器接入。

2.3.1 ADS1115驱动要点

ADS1115的驱动,说白了就是通过I2C读写寄存器。核心寄存器就几个:

  • 配置寄存器(0x01):设置采样率、PGA增益、连续/单次模式
  • 转换寄存器(0x00):读取转换结果

下面是我在实际项目中用过的初始化代码(基于STM32 HAL库):

// ADS1115初始化配置
// 目标:PGA=±4.096V,采样率860SPS,连续转换模式
uint16_t config = 0;
config |= (0x02 << 12);  // PGA: ±4.096V (FS=2.048V)
config |= (0x07 << 5);   // 数据速率: 860SPS
config |= (0x00 << 8);   // 连续转换模式
config |= (0x01 << 15);  // 启动转换

// 写配置寄存器
uint8_t data[3];
data[0] = 0x01;  // 配置寄存器地址
data[1] = (config >> 8) & 0xFF;
data[2] = config & 0xFF;
HAL_I2C_Master_Transmit(&hi2c1, 0x48 << 1, data, 3, 100);

// 读取转换结果
uint8_t buf[2];
HAL_I2C_Master_Transmit(&hi2c1, 0x48 << 1, (uint8_t[]){0x00}, 1, 100);
HAL_I2C_Master_Receive(&hi2c1, 0x48 << 1, buf, 2, 100);
int16_t raw = (buf[0] << 8) | buf[1];
float voltage = raw * 2.048 / 32768.0;  // 转换为实际电压

注意: ADS1115的I2C地址默认是0x48(ADDR引脚接地)。如果多个设备共用I2C总线,记得检查地址冲突。我曾经在一个项目里,因为没注意地址冲突,调试了整整两天才发现是地址被占用了。

2.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

模拟传感器接口知识体系 传感器 (微弱信号) 运算放大器 (放大/缓冲) 信号调理 (滤波+放大) ADC转换 (ADS1115) 数字信号 (I2C/SPI) 运放关键参数 • 增益带宽积 (GBP) • 输入失调电压 • 共模抑制比 (CMRR) • 压摆率 (Slew Rate) • 噪声密度 信号调理要点 • 无源RC低通滤波 • 有源Sallen-Key滤波 • 两级放大策略 • 阻抗匹配 • 噪声抑制 ADS1115驱动 • I2C通信协议 • 配置寄存器设置 • PGA增益选择 • 数据读取与转换 • 连续/单次模式

这张图把整个流程串起来了:传感器输出微弱信号 → 运放进行缓冲和初步放大 → 信号调理(滤波+二级放大)→ ADC采样(ADS1115)→ 数字信号输出给MCU。每一步都有坑,每一步也都有技巧。

2.5 避坑指南

最后,分享几个我踩过的坑:

  • 电源去耦:运放和ADC的电源引脚旁边,一定要放0.1μF和10μF的去耦电容。我曾经因为偷懒没放,结果ADC读数跳得像心电图。
  • 模拟地与数字地:尽量用单点接地,或者用磁珠隔离。混合在一起,数字噪声会串进模拟信号。
  • 输入保护:传感器接口容易受静电或过压冲击。我习惯在运放输入端加一对肖特基二极管到电源和地,钳位保护。
  • 采样率别贪高:ADS1115最高860SPS,但采样率越高,噪声越大。如果信号变化慢(比如温度),用8SPS就够了,噪声低很多。

好了,这一章的内容就到这里。记住,模拟接口是传感器接入的“咽喉”,调理好了,后面的数据融合才能事半功倍。

课后小练习: 找一个实际传感器(比如光敏电阻或热电偶),设计一个完整的信号调理电路,包括运放选型、滤波参数计算、ADC配置。动手做一遍,比看十遍书都管用。

可可精品资料库