1. 项目概述
这个基于STM32F103C8T6的氧气浓度检测系统是我在指导毕业设计时经常推荐的一个经典案例。它完整涵盖了传感器采集、阈值判断、电机控制和人机交互等嵌入式系统核心要素,特别适合作为电子类专业学生的综合训练项目。
系统核心功能是通过氧气传感器实时监测环境氧浓度,当检测值超过预设阈值时,自动启动通风风扇并触发声光报警。用户可以通过按键设置报警阈值和风扇转速档位(0-10档),所有参数和实时数据都通过OLED屏直观显示。这种设计模式在工业监控、实验室安全等领域都有广泛应用场景。
2. 系统架构设计
2.1 硬件组成框图
整个系统采用经典的"输入-处理-输出"架构:
code复制[传感器输入] -> [STM32主控] -> [执行器输出]
↑ |
└──[人机交互]─┘
具体硬件模块划分如下:
输入部分:
- 氧气检测模块:采用电化学式氧气传感器,输出0-5V模拟信号
- 按键模块:4个机械按键(设置、加、减、确认)
- 供电电路:TYPE-C接口输入5V,经LDO稳压至3.3V
处理核心:
- STM32F103C8T6:72MHz主频,64KB Flash,20KB RAM
- 外设资源分配:
- ADC1_CH0:氧气传感器模拟输入
- TIM3_PWM:风扇调速控制
- GPIOB:按键扫描
- I2C1:OLED显示
输出部分:
- OLED显示:128x64分辨率,I2C接口
- 风扇阵列:4个12V直流风扇,通过MOS管驱动
- 声光报警:蜂鸣器+LED组合报警
2.2 PCB设计要点
-
层叠结构:
- 两层板设计(Top/Bottom)
- 双面覆铜接地
- 板厚1.2mm(常规FR4材料)
-
布局技巧:
- 电源模块靠近TYPE-C接口
- 单片机居中放置
- 模拟信号走线远离数字部分
- 风扇驱动电路靠近板边
-
关键封装:
- 传感器:3P 2.54mm排针
- 风扇接口:4P 2.54mm排母
- 按键:6x6mm贴片微动
提示:虽然使用现成模块可以加快开发,但建议学生自己设计传感器信号调理电路,这对理解模拟信号处理很有帮助。
3. 核心电路解析
3.1 氧气检测电路
典型的电化学氧气传感器输出为mV级信号,需要经过放大调理:
code复制传感器 -> 仪表放大器 -> 低通滤波 -> ADC
具体参数设计:
-
放大倍数计算:
- 传感器满量程输出:50mV(对应25%O2)
- 目标ADC输入范围:0-3V
- 所需增益:3V/50mV = 60倍
-
滤波器设计:
- 截止频率:10Hz(二阶有源滤波)
- 运放选用:LMV358(低功耗轨到轨)
3.2 风扇驱动电路
采用N沟道MOS管驱动方案:
code复制MCU_PWM -> 栅极电阻 -> MOS管 -> 风扇
↑
10K下拉电阻
关键参数:
- MOS管选型:AO3400(30V/5.8A)
- 栅极电阻:100Ω(限制冲击电流)
- 续流二极管:1N4148(保护MOS管)
3.3 电源设计
系统包含3.3V和12V两路电源:
-
5V转3.3V:
- LDO选用:AMS1117-3.3
- 输入电容:10μF陶瓷
- 输出电容:22μF钽电容
-
12V升压电路:
- 芯片选用:MT3608
- 电感值:4.7μH
- 反馈电阻:100K+20K(输出12.5V)
4. 软件设计实现
4.1 程序架构
采用分层设计模式:
code复制应用层(main.c)
├── 业务逻辑层(o2_logic.c)
├── 设备驱动层(o2_sensor.c, fan_ctrl.c...)
└── 硬件抽象层(hal_gpio.c, hal_adc.c...)
4.2 关键算法实现
氧气浓度计算
c复制#define O2_SENSOR_ADC_MAX 4095 // 12bit ADC
#define O2_SENSOR_RANGE 25.0 // 25%满量程
float Get_O2_Concentration(void)
{
uint16_t adc_val = ADC_Read(ADC_CH0);
float voltage = (adc_val * 3.3f) / O2_SENSOR_ADC_MAX;
return (voltage * O2_SENSOR_RANGE) / 3.3f;
}
风扇PID控制
c复制typedef struct {
float Kp, Ki, Kd;
float err_sum, last_err;
} PID_Ctrl;
void PID_Init(PID_Ctrl* pid, float Kp, float Ki, float Kd)
{
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->err_sum = 0;
pid->last_err = 0;
}
uint8_t PID_Update(PID_Ctrl* pid, float setpoint, float actual)
{
float err = setpoint - actual;
pid->err_sum += err;
float output = pid->Kp * err
+ pid->Ki * pid->err_sum
+ pid->Kd * (err - pid->last_err);
pid->last_err = err;
// 限制输出范围0-100%
output = fmaxf(0, fminf(100, output));
return (uint8_t)output;
}
4.3 主程序流程
c复制void main(void)
{
// 硬件初始化
System_Init();
// 参数初始化
float O2_max = 21.0; // 默认阈值21%
uint8_t gears = 0;
while(1) {
// 1. 数据采集
float O2_value = Get_O2_Concentration();
// 2. 阈值判断
if(O2_value > O2_max) {
Alarm_Trigger();
gears = (gears == 0) ? 1 : gears;
Fan_SetSpeed(gears);
} else {
Alarm_Stop();
Fan_SetSpeed(0);
gears = 0;
}
// 3. 按键处理
Key_Process(&O2_max, &gears);
// 4. 显示更新
OLED_Show(O2_value, O2_max, gears);
HAL_Delay(100);
}
}
5. 调试经验分享
5.1 传感器校准技巧
-
两点校准法:
- 在纯氮气环境中记录ADC值(对应0%O2)
- 在正常空气中记录ADC值(对应20.9%O2)
- 建立线性转换公式:O2% = k*ADC + b
-
温度补偿:
c复制// 添加温度传感器读数 float temp = DS18B20_Read(); float compensated_O2 = raw_O2 * (1 + 0.003*(temp - 25));
5.2 常见问题排查
-
风扇不转:
- 检查MOS管栅极电压(应>4V)
- 测量风扇两端电压(应≈12V)
- 确认PWM信号频率(建议1-5kHz)
-
氧气读数跳动:
- 添加软件滤波(移动平均或中值滤波)
- 检查传感器供电稳定性(纹波<50mV)
- 确保传感器预热时间(至少5分钟)
-
OLED显示异常:
- 确认I2C上拉电阻(通常4.7K)
- 检查电源电压(3.3V±5%)
- 验证通信速率(标准模式100kHz)
5.3 性能优化建议
-
低功耗设计:
- 空闲时切换至STOP模式
- 使用定时器唤醒(每1秒采样一次)
- 关闭未使用的外设时钟
-
可靠性增强:
c复制// 添加看门狗 IWDG_Init(4, 625); // 4秒超时 while(1) { IWDG_Refresh(); // ...主循环代码 } -
扩展功能:
- 添加蓝牙/WiFi模块远程监控
- 实现数据SD卡存储
- 增加多气体检测能力
6. 项目进阶方向
这个基础框架可以延伸出多个有价值的改进方向:
-
多传感器融合:
- 增加CO2、温湿度传感器
- 实现环境综合指数评估
-
智能控制算法:
c复制// 模糊控制示例 float Fuzzy_Control(float err, float err_rate) { // 模糊化输入 // 规则评估 // 解模糊输出 return pwm_duty; } -
工业级改进:
- 采用4-20mA电流环传输
- 添加RS485通信接口
- 通过EMC测试
-
UI优化:
- 设计分级菜单系统
- 添加历史曲线显示
- 实现触摸按键控制
在实际教学中,我会要求学生至少实现其中1-2个扩展功能,这对培养系统工程思维很有帮助。从反馈来看,做过这类完整项目的学生,在后续工作中展现出了明显的优势。