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(接近满量程)
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(完全满足要求)
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,输入范围匹配前级输出
最后说一句,信号调理电路是血压计精度的「守门员」。前面传感器再好,后面算法再牛,中间这一关没把好,一切都是白搭。我当年调试第一版样机时,就是因为在滤波器上省了一个电阻,结果波形失真,算法死活算不准血压值。后来老老实实按手册来,一次通过。所以,别偷懒,该算的算,该测的测。