1. 项目概述
这个基于单片机的氧气浓度检测系统,是我去年为某医疗设备厂商做的一个实际项目。当时他们需要一套低成本、高精度的氧气浓度监测方案,用于新生儿保育箱的环境监测。市面上现成的氧气检测仪要么价格昂贵(动辄上万元),要么精度达不到医疗级要求(±0.5%以内)。经过两个月的开发和测试,最终用不到500元的BOM成本实现了医疗级精度。
这个系统的核心在于将电化学氧气传感器与高精度ADC电路结合,通过单片机进行温度补偿和线性化处理。实测在20.9%氧气浓度(标准大气)下,连续72小时测量的标准差仅为0.12%,完全满足医疗监护场景的需求。下面我就把这个项目的完整实现过程拆解给大家。
2. 核心硬件设计
2.1 传感器选型与特性
我们测试了三种主流的氧气检测方案:
- 电化学传感器(如Alphasense O2-A2)
- 光学荧光传感器(如SST Sensing LOX-02)
- 氧化锆传感器(如Figaro KE-25)
最终选择电化学方案,主要考虑:
- 成本:电化学传感器单价约200元,是光学方案的1/5
- 功耗:工作电流仅1.5mA,适合电池供电
- 线性度:在15-25%浓度范围内非线性误差<1%
特别注意:电化学传感器需要定期校准(建议每3个月一次),且要避免接触有机溶剂蒸汽。我们在PCB上专门设计了密封舱和透气膜来保护传感器。
2.2 信号调理电路设计
传感器输出的电流信号非常微弱(nA级),需要经过两级放大:
- 跨阻放大器:将电流转换为电压,使用TI的LMP7721(输入偏置电流仅3fA)
- 可编程增益放大器:PGA280,增益范围1-128倍可调
ADC选用ADS1115(16位分辨率,860SPS),其特点:
- 内置可编程增益放大器(PGA)
- I2C接口,方便与单片机通信
- 差分输入,有效抑制共模噪声
电路设计关键点:
- 在传感器输出端串联100kΩ电阻用于限流保护
- 所有模拟走线做guard ring处理
- 电源端加π型滤波(10μF+100nF)
3. 软件算法实现
3.1 基础数据采集流程
c复制void read_O2_concentration() {
// 1. 启动ADS1115转换
write_register(ADS1115_REG_CONFIG, 0xC583);
delay(10);
// 2. 读取ADC值
uint16_t adc_val = read_register(ADS1115_REG_CONVERSION);
// 3. 转换为电压值
float voltage = (adc_val * 4.096) / 32767.0;
// 4. 计算氧气浓度(需温度补偿)
float temp = read_temperature();
float o2_concentration = (voltage - 0.02*temp) * calibration_factor;
}
3.2 温度补偿算法
电化学传感器的输出会受温度影响,我们采用二阶多项式补偿:
code复制O2_corrected = O2_raw × (1 + 0.0032×(T-25) + 0.000015×(T-25)²)
实现代码:
c复制float temperature_compensation(float raw, float temp) {
float delta = temp - 25.0;
float factor = 1.0 + 0.0032*delta + 0.000015*delta*delta;
return raw * factor;
}
3.3 数字滤波处理
采用移动平均+卡尔曼滤波组合:
- 先做5点移动平均平滑
- 再用卡尔曼滤波降噪
卡尔曼滤波参数设置:
c复制#define Q 0.01 // 过程噪声协方差
#define R 0.25 // 观测噪声协方差
float kalman_filter(float measurement) {
static float x_hat = 20.9, P = 1.0;
// 预测
float x_hat_minus = x_hat;
float P_minus = P + Q;
// 更新
float K = P_minus / (P_minus + R);
x_hat = x_hat_minus + K*(measurement - x_hat_minus);
P = (1 - K)*P_minus;
return x_hat;
}
4. 系统校准与测试
4.1 三点校准法
使用标准气体进行校准:
- 零点校准:通入纯氮气(0% O2)
- 中点校准:15% O2标准气
- 满量程校准:25% O2标准气
校准数据记录示例:
| 标准值(%) | ADC读数 | 补偿后值(%) |
|---|---|---|
| 0.0 | 124 | 0.1 |
| 15.0 | 18653 | 15.2 |
| 25.0 | 31042 | 25.1 |
校准系数计算:
code复制slope = (25.1 - 0.1)/(31042 - 124) = 0.000808
offset = 0.1 - (124*0.000808) = 0.0
4.2 长期稳定性测试
将设备置于20.9%氧气环境中连续测试72小时,结果:
| 时间(h) | 测量均值(%) | 标准差(%) |
|---|---|---|
| 0-24 | 20.91 | 0.13 |
| 24-48 | 20.89 | 0.11 |
| 48-72 | 20.88 | 0.15 |
漂移量:<0.5%/24h,符合YY 0607-2007医用氧气监测标准。
5. 实际应用中的经验总结
-
传感器老化处理:电化学传感器每年灵敏度会下降约3%,我们在软件中加入了使用时间计数器,自动按0.025%/天的比例调整校准系数。
-
抗干扰设计:
- 在ADC输入端并联100pF电容滤除高频噪声
- 传感器供电采用独立的LDO(TPS7A4901)
- 数字信号线加22Ω串联电阻抑制振铃
-
低功耗优化:
- 采用间歇工作模式(每10秒唤醒一次)
- 关闭单片机未用外设(ADC在采样时才上电)
- 实测平均电流:1.8mA(使用CR2450电池可工作3个月)
-
生产测试发现的问题:
- 初期发现约5%的板子读数漂移大,排查发现是焊锡膏残留导致传感器引脚漏电,改用免清洗焊锡膏后解决
- 温度传感器(DS18B20)安装位置距离氧气传感器应小于5mm,否则补偿效果差
这个项目给我的最大启示是:高精度测量系统必须从传感器选型、电路设计、算法处理到生产工艺全程把控。现在这套方案已经批量生产300多台,客户反馈故障率低于0.5%,完全达到了医疗设备的可靠性要求。
