1. 项目概述
在工业自动化和民用供水系统中,恒压供水控制一直是个经典而实用的课题。我最近完成了一个基于单片机的恒压供水控制器项目,这个看似简单的装置实际上融合了传感器技术、PID控制算法和机电一体化设计。不同于市面上现成的控制器,这个自制方案成本不到商业产品的三分之一,却能达到±0.01MPa的控制精度。
这个项目的核心价值在于:当用水量变化时,系统能自动调节水泵转速,保持管网压力恒定。想象一下早晨小区居民集中用水时,传统供水系统会出现压力骤降,而我们的控制器能让每个楼层的水流保持稳定,既避免了高层住户的水压不足,又防止了低层住户的水压过高。
2. 系统设计与硬件选型
2.1 核心硬件架构
整个系统采用模块化设计,主要包含:
- STM32F103C8T6最小系统板(主控)
- MPX5700DP压力传感器(0-700kPa量程)
- IBT-2电机驱动模块(最大30A电流)
- 1.5kW三相异步水泵
- 0.96寸OLED显示屏
选型时特别考虑了工业环境下的可靠性。比如压力传感器选择了带温度补偿的型号,在-40℃~125℃范围内误差不超过±1.5%。电机驱动模块则预留了3倍余量,确保长期工作不发热。
2.2 关键电路设计
电源部分采用两级滤波设计:
- 220VAC转12VDC开关电源(加装磁环抑制高频干扰)
- 12V转5V/3.3V LDO线性稳压
信号调理电路值得重点关注。压力传感器的原始输出是0.2-4.7V模拟信号,我们设计了如下处理链路:
code复制传感器 → RC低通滤波(截止频率10Hz) → 电压跟随器 → 3.3V钳位保护 → ADC输入
这个设计有效抑制了水泵启停时的电压尖峰,实测ADC采样波动小于±3LSB。
3. 控制算法实现
3.1 PID控制核心代码
采用位置式PID算法,关键参数如下:
c复制typedef struct {
float Kp; // 比例系数=0.8
float Ki; // 积分系数=0.05
float Kd; // 微分系数=0.12
float maxOut; // 输出限幅=100
float deadZone;// 死区=0.005(MPa)
} PID_Param;
float PID_Calculate(PID_Param *pid, float target, float feedback) {
static float lastErr = 0;
static float integral = 0;
float err = target - feedback;
// 死区处理
if(fabs(err) < pid->deadZone) return 0;
integral += err;
// 积分限幅
integral = constrain(integral, -pid->maxOut, pid->maxOut);
float output = pid->Kp * err
+ pid->Ki * integral
+ pid->Kd * (err - lastErr);
lastErr = err;
return constrain(output, -pid->maxOut, pid->maxOut);
}
3.2 参数整定技巧
通过Ziegler-Nichols方法现场调试:
- 先将Ki、Kd设为0,逐渐增大Kp直到系统出现等幅振荡(临界增益Kc=1.2)
- 记录振荡周期Tc=4.2秒
- 根据公式计算:
- Kp = 0.6*Kc = 0.72 → 实际取0.8
- Ki = 2*Kp/Tc ≈ 0.038 → 取0.05
- Kd = Kp*Tc/8 ≈ 0.126 → 取0.12
调试心得:管网系统存在约0.8秒的滞后,适当增大微分作用能显著改善动态响应。
4. 系统集成与测试
4.1 安装注意事项
- 压力传感器应安装在距水泵出口2-3倍管径处,避免湍流影响
- 电机驱动模块必须加装散热器,实测满载时MOS管温度可达60℃
- 所有信号线采用双绞线+屏蔽层接地的布线方式
4.2 性能测试数据
测试条件:设定压力0.3MPa,通过阀门模拟用水量阶跃变化
| 测试项 | 指标要求 | 实测结果 |
|---|---|---|
| 稳态误差 | ≤±0.01MPa | ±0.008MPa |
| 调节时间 | ≤5s | 3.2s |
| 超调量 | ≤10% | 7.5% |
| 空载功耗 | ≤30W | 26W |
5. 故障排查指南
5.1 常见问题处理
-
压力读数跳动大
- 检查传感器供电是否稳定(示波器观察5V纹波应<50mV)
- 确认RC滤波电路参数(推荐10kΩ+100nF组合)
- 排查机械振动干扰(可加装橡胶减震垫)
-
水泵频繁启停
- 适当增大PID死区(建议0.005-0.01MPa)
- 检查控制周期是否过短(推荐100-200ms)
- 确认压力传感器量程匹配(量程过大会降低分辨率)
-
电机异常发热
- 测量三相电流平衡度(偏差应<5%)
- 检查PWM频率(推荐8-10kHz,避免人耳可闻噪音)
- 确认散热风扇运转正常
5.2 维护建议
- 每月检查压力传感器零点(关闭水泵时读数应为0±0.002MPa)
- 每季度清理控制箱内灰尘,特别是散热孔位置
- 每年校准一次压力传感器,方法:
- 连接标准压力表
- 施加0MPa、0.2MPa、0.4MPa、0.6MPa四个点
- 通过上位机软件修正校准系数
这个项目最让我惊喜的是PID参数的自整定功能。通过记录系统响应曲线,自动计算出一组较优参数,虽然比不上专业控制器的算法复杂度,但对大多数应用场景已经足够。下次改进方向是加入压力预测算法,通过用水历史数据预判压力变化趋势。