4、信号调理电路:仪表放大器设计、低通滤波器设计、ADC选型与配置

好,咱们接着聊。袖带里的压力传感器输出信号,说白了就是个微弱的模拟电压。你想想看,传感器出来的信号通常只有几毫伏到几十毫伏,直接送给ADC?那肯定不行,噪声都比信号大。所以,中间必须经过一道「信号调理」工序。

我个人习惯把这部分分成三个核心环节:仪表放大器负责把差模信号拎出来并放大,低通滤波器负责把高频噪声滤掉,最后ADC负责把模拟量变成数字量。每一步都有坑,咱们一个一个说。

4.1 仪表放大器设计

为什么非要用仪表放大器?普通运放不行吗?

嗯,这里要注意。压力传感器通常是桥式结构,输出的是差分信号。普通运放对共模信号的抑制能力很差,而袖带充放气过程中,共模电压会随着人体运动和泵体振动来回漂。仪表放大器天生就是干这个活的——高输入阻抗、高共模抑制比(CMRR)。

我在项目中遇到过一个问题:选了一款便宜的仪表放大器,规格书上CMRR写着100dB,结果实际测下来只有70多dB。后来一查,是外围电阻匹配精度不够。所以我的建议是:要么用集成电阻的仪表放大器(比如AD620、INA128),要么就用0.1%精度的贴片电阻

给大家一个典型电路参考:

// 仪表放大器增益设置(以AD620为例)
// 增益公式:G = 49.4kΩ / RG + 1
// 目标增益:500倍(传感器输出10mV,希望放大到5V)

RG = 49.4kΩ / (500 - 1) ≈ 99Ω

// 实际选型:取标准电阻100Ω
// 实际增益:G = 49.4kΩ / 100Ω + 1 = 495倍
// 输出范围:10mV * 495 = 4.95V(接近满量程)
小技巧:我习惯在仪表放大器的输入端并联两个背靠背的二极管(比如BAT54S),用来做输入过压保护。袖带突然泄气时,传感器可能会产生尖峰电压,这招能救你一命。

4.2 低通滤波器设计

信号放大完了,接下来就是滤波。袖带压力信号的变化频率很慢,充放气过程也就几赫兹到十几赫兹。但环境中的50Hz工频干扰、泵体的机械振动噪声,这些高频成分必须干掉。

我推荐用二阶巴特沃斯低通滤波器。为什么?巴特沃斯在通带内最平坦,不会把有用的压力波形给「削」变形了。你想想看,如果滤波器的幅频响应有波纹,血压波形的收缩压和舒张压拐点就可能被扭曲,那测量精度就全完了。

曾经有一次,我为了省一个运放,用了RC一阶滤波,结果发现示波器上的波形毛刺还是很多。后来换成二阶有源滤波,效果立竿见影。所以别省那几毛钱,该用有源滤波就用。

设计参数如下:

// 二阶巴特沃斯低通滤波器设计
// 截止频率:fc = 30Hz(保留有效信号,滤除工频及高频噪声)
// 品质因数:Q = 0.707(巴特沃斯响应)

// 选择电容 C1 = C2 = 0.1μF(常用值)
// 计算电阻:
R1 = R2 = 1 / (2 * π * fc * C) 
     = 1 / (2 * 3.14 * 30 * 0.1e-6) 
     ≈ 53kΩ

// 实际选型:取标准值 51kΩ
// 实际截止频率:fc ≈ 31.2Hz(完全满足要求)
注意:滤波器的运放选型不能马虎。我见过有人用LM358做滤波器,结果在30Hz附近相位裕度不够,产生了自激振荡。建议用低噪声、轨到轨的运放,比如OPA2333或MCP6002。

4.3 ADC选型与配置

ADC是模拟链路的最后一站。选型时我主要看三个指标:分辨率、采样率、输入范围

先说分辨率。袖带压力测量需要多高的精度?一般来说,血压测量要求误差在±3mmHg以内。压力传感器满量程通常是300mmHg,对应输出电压0.5V~4.5V。算一下:

// 分辨率需求计算
// 要求误差:±3mmHg / 300mmHg = 1% 满量程
// 考虑裕量,取 0.5% 满量程
// 所需ADC位数:log2(1 / 0.005) ≈ 7.6位

// 实际选型:至少12位ADC(4096级)
// 12位下,每级对应:300mmHg / 4096 ≈ 0.073mmHg
// 远优于±3mmHg的要求

采样率呢?血压波形的主要频率成分在0.5Hz~5Hz之间。根据奈奎斯特定理,采样率至少10Hz。但我建议留足裕量,取100Hz~200Hz。为什么?因为后续可能要做数字滤波和特征点提取,采样点多一些,算法处理起来更灵活。

输入范围这块,我吃过亏。之前选了一款ADC,输入范围是0~3.3V,但仪表放大器输出是0~5V。结果不得不加一级电平移位电路,白白增加了噪声。所以我的建议是:ADC的输入范围要和前级输出匹配。如果仪表放大器用5V供电,那就选0~5V输入的ADC;如果用3.3V供电,就选0~3.3V的。

给大家一个实际配置示例(以STM32内置ADC为例):

// ADC配置参数(基于STM32F4系列)
// 分辨率:12位
// 采样率:200Hz(5ms采样一次)
// 参考电压:3.3V(内部VREF)
// 采样通道:ADC1_IN0(PA0引脚)

void ADC_Config(void) {
    // 使能ADC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    
    // ADC初始化
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    
    // 配置采样时间(保证200Hz采样率)
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles);
    
    // 校准
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    
    // 启动连续转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
核心要点总结:
  • 仪表放大器:选高CMRR、集成电阻的型号,增益设在300~500倍
  • 低通滤波器:二阶巴特沃斯,截止频率20~30Hz,用低噪声运放
  • ADC:12位以上,采样率100~200Hz,输入范围匹配前级输出

最后说一句,信号调理电路是血压计精度的「守门员」。前面传感器再好,后面算法再牛,中间这一关没把好,一切都是白搭。我当年调试第一版样机时,就是因为在滤波器上省了一个电阻,结果波形失真,算法死活算不准血压值。后来老老实实按手册来,一次通过。所以,别偷懒,该算的算,该测的测。