MATLAB/Simulink水箱水位控制系统实现

一、系统建模与参数设定

1.1 水箱动力学模型

质量守恒方程

Adhdt=Qin−QoutA\frac{dh}{dt}=Q_{in}−Q_{out}Adtdh=Qin−Qout

其中:

  • AAA:水箱横截面积(m²)
  • hhh:水位高度(m)
  • QinQ_{in}Qin:进水流量(m³/s)
  • QoutQ_{out}Qout:出水流量(m³/s)

阀门特性

Qin=Kv⋅u⋅2gQ_{in}=Kv⋅u⋅\sqrt{2g}Qin=Kv⋅u⋅2g
Qout=Kv⋅2ghQ_{out}=K_v⋅\sqrt{2gh}Qout=Kv⋅2gh

  • KvK_vKv:阀门流量系数
  • uuu:阀门开度(0-1)
1.2 参数设置
matlab 复制代码
A = 0.25;    % 水箱面积 (m²)
Kv = 0.1;    % 阀门系数
g = 9.81;    % 重力加速度
h_set = 1.0; % 设定水位 (m)

二、模糊控制实现

2.1 模糊控制器设计

输入变量

  • 水位误差:e=hset−he=h_{set}−he=hset−h(范围:[-0.5, 0.5])
  • 误差变化率:e˙=dedte˙=\frac{de}{dt}e˙=dtde(范围:[-0.2, 0.2])

输出变量

  • 阀门开度:u(范围:[0, 1])

隶属函数

  • 输入:高斯型(NB, NS, ZO, PS, PB)
  • 输出:三角形(NB, NS, ZO, PS, PB)

模糊规则(共5条):

matlab 复制代码
1. IF e is NB THEN u is PB
2. IF e is NS THEN u is PS
3. IF e is ZO THEN u is ZO
4. IF e is PS AND \dot{e} is positive THEN u is NS
5. IF e is PB AND \dot{e} is negative THEN u is NB
2.2 Simulink模型搭建
matlab 复制代码
% 创建模糊系统
fis = newfis('tank_ctrl');
fis = addvar(fis,'input','e',[-0.5,0.5]);
fis = addmf(fis,'input',1,'NB','gaussmf',[0.2,0]);
fis = addmf(fis,'input',1,'ZO','gaussmf',[0.1,0]);

fis = addvar(fis,'output','u',[0,1]);
fis = addmf(fis,'output',1,'NB','trimf',[0,0,0.5]);
fis = addmf(fis,'output',1,'ZO','trimf',[0.25,0.5,0.75]);

% 规则设置
ruleList = [1 1 1 1; 2 2 1 1; 3 3 1 1; 4 4 1 1; 5 5 1 1];
fis = addrule(fis,ruleList);

% 导出到Simulink
writefis(fis,'tank_ctrl');

三、PID控制实现

3.1 传递函数建模

G(s)=(K)Ts+1G(s)=\frac{(K)}{T_s+1}G(s)=Ts+1(K)

  • K=2(增益)
  • T=30(时间常数)
3.2 参数整定
matlab 复制代码
% 自动整定PID参数
sys = tf(2, [30 1]);
[C,info] = pidtune(sys,'pid');
3.3 Simulink模型
matlab 复制代码
% 构建闭环系统
open_system('tank_pid');
set_param('tank_pid/PID Controller','Kp',num2str(C.Kp));
set_param('tank_pid/PID Controller','Ki',num2str(C.Ki));
set_param('tank_pid/PID Controller','Kd',num2str(C.Kd));

四、MATLAB代码实现

4.1 模糊控制完整代码
matlab 复制代码
%% 模糊控制仿真
clear; clc;
sim('tank_fuzzy'); % 运行Simulink模型

%% 结果可视化
figure;
plot(t,h_ref,'r--',t,h_sim,'b-o');
legend('设定值','实际值');
xlabel('时间(s)'); ylabel('水位(m)');
title('模糊控制响应曲线');
4.2 PID控制完整代码
matlab 复制代码
%% PID控制仿真
sys = tf(2, [30 1]);
pid_block = 'tank_pid/PID Controller';
set_param(pid_block,'Kp',num2str(C.Kp));
sim('tank_pid');

%% 性能指标计算
overshoot = max(h_sim)-h_set;
settling_time = find(abs(h_sim-h_set)<=0.02,1,'first');

五、扩展应用

  1. 多水箱级联控制

    matlab 复制代码
    % 二级水箱传递函数
    G2 = tf(0.5, [20 1]);
    sys_total = series(G, G2);
  2. 实时硬件在环测试 使用Arduino采集水位传感器数据 通过Simulink Coder生成嵌入式代码

  3. 可视化界面开发

    matlab 复制代码
    % 创建GUI界面
    h = figure('Name','水位控制面板');
    uicontrol('Style','slider','Position',[20 20 200 20],...
        'Min',0,'Max',1,'Value',0.5,'Callback',@valve_callback);

六、参考

  1. 代码 matlab实现水箱水位控制系统 www.youwenfan.com/contentcsl/79942.html
  2. 刘金琨. 智能控制(第4版)[M]. 电子工业出版社, 2022.
  3. MathWorks. Fuzzy Logic Toolbox User's Guide, 2023.
  4. 张伟等. 基于模糊PID的水箱液位控制研究[J]. 自动化仪表, 2021(6):45-50.
相关推荐
草履虫建模16 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq18 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq18 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
学嵌入式的小杨同学18 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Re.不晚19 小时前
Java入门17——异常
java·开发语言
爱吃rabbit的mq19 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
精彩极了吧19 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
(❁´◡`❁)Jimmy(❁´◡`❁)19 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi20 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
南极星100520 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言