Simulink基础【2】- PID控制器
- 1. Simulink作用回顾
- 1.1 模块化
- 1.2 常用模块
- 1.2.1 输入信号源模块库(Sources)
- 1.2.2 接收模块库(Sinks)
- 1.2.3 系统模块
- 1.2.4 数学运算模块
- 1.3 界面布局与使用
- 1.4 自定义模块
- 2. PID算法仿真
- 2.1 PID算法简介
- 2.2 PID算法的matlab实现
- 2.2.1 代码仿真PID track
- 2.2.2 Simulink仿真
- 2.3 单液压缸仿真
1. Simulink作用回顾
上一节我们讲到,Simulink是Mathworks公司推出的MATLAB中的一种可视化仿真工具,是一个模块化、图形化的编程环境,用于多域仿真以及基于模型的设计。Simulink提供图形编辑器、可自定义的模块库以及求解器,能够用精准数学模型描述用户需求并且执行动态仿真。
1.1 模块化
Simulink可理解为一种可视化的语言体系,其通过模块化的手段把数学公式、算法进行拆分,用搭积木的方式进行组合呈现。Simulink建模本质上与代码并无区别,不过表述方式相比于文本和代码更为直观、高效:其可观测算法中公式之间的上下游关系,输入输出参数之间的交互关系,并可实时观察不同参数变化对每个局部行为的影响。
1.2 常用模块
1.2.1 输入信号源模块库(Sources)
1.2.2 接收模块库(Sinks)
1.2.3 系统模块
1.2.4 数学运算模块
1.3 界面布局与使用
1.4 自定义模块
比如下图表现了飞行控制的整体流程,并对预设控制指令、控制模型、飞机模型、状态反馈等部分进行了模块化建模。
2. PID算法仿真
2.1 PID算法简介
PID控制是一种应用非常广泛的控制算法,PID算法距今已经有108年历史。PID并不是很神秘的东西,在很多实际应用中都可以看到它的身影:温度控制系统、四旋翼飞行器、倒立摆系统、寻迹小车等等。
应用PID控制的前提是系统一定要是一个闭环系统,什么是闭环系统?就是一定要有反馈回路,要能及时反馈我们最终控制的那个量的状态,给到控制器。也就是说,PID控制是根据被控系统的状态来进行控制的,我们需要知道这个状态才能决定控制器下一步应该怎么做。
总的来说,PID控制的用途分为两种,即系统对某一稳定状态的维持或者动态跟踪
- 一种是使某个物理量“保持稳定",即便出现外界干扰也能很快回到原始的稳定状态;
- 另一种是使物理量稳定地“跟踪”给定的信号,稳定地随着给定信号变化。
2.2 PID算法的matlab实现
2.2.1 代码仿真PID track
在使用’tf’函数的时候,显示报错,原来是必须先安装system control 包,但matlab直接显示的函数不识别…不报告咋解决。
函数或变量 'tf' 无法识别。
出错 PID_tracker (第 5 行)
sys=tf(5.235e005,[1,87.35,1.047e004,0]); %建立被控对象传递函数
安装完之后,就好了。这是PID跟踪的代码
%PID Controller
clear, clc, close all;
ts=0.001; %采样时间=0.001s
sys=tf(5.235e005,[1,87.35,1.047e004,0]); %建立被控对象传递函数
dsys=c2d(sys,ts,'z'); %把传递函数离散化
[num,den]=tfdata(dsys,'v'); % 离散化后提取分子、分母
u_1=0.0;u_2=0.0;u_3=0.0; %输入向量 的初始状态
y_1=0.0;y_2=0.0;y_3=0.0; %输出的初始状态
x=[0,0,0]'; %PID的3个参数Kp Ki Kd组成的数组
error_1=0; %初始误差
S=input('请选择输入信号的形式:1 阶跃信号 2 方波信号 3 正弦信号');
for k=1:1:500
time(k)=k*ts; % 仿真时间500ms
if S==1
kp=1.50;ki=0.01;kd=0.01;
yd(k)=1; % 指令为阶跃信号
elseif S==2
kp=0.50;ki=0.001;kd=0.001;
yd(k)=sign(sin(2*2*pi*k*ts)); % 指令为方波信号
elseif S==3
kp=1.5;ki=1.0;kd=0.01; % 指令为正弦信号
yd(k)=0.5*sin(2*2*pi*k*ts);
end
u(k)=kp*x(1)+kd*x(2)+ki*x(3); % PID控制器
% 限制控制器的输出
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
% 近似线性模型
y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;
error(k)=yd(k)-y(k);
% 返回pid参数
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=y(k);
x(1)=error(k); % 计算 P
x(2)=(error(k)-error_1)/ts; % 计算 D
x(3)=x(3)+error(k)*ts; % 计算 I
error_1=error(k);
end
figure(1);
set(0,'defaultfigurecolor','w') % 设置图像背景为白色
plot(time,yd,'r',time,y,'b','linewidth',2);
xlabel('time(s)');ylabel('信号输出');
legend('理想信号','追踪信号');
结果
2.2.2 Simulink仿真
PID的控制简图可被描述为如下形式:
Simulink模块中,实际上已经包含了自带的PID控制器模块,或者也可以自己设计。
打开库浏览器
找到PID controller
最终需要的模块包括以下这些:
结果如下:
2.3 单液压缸仿真
打开simulink的液压缸仿真实例,运行仿真。此处用到的主要工具包括以下两个类别:
-
Simscape Fluids 提供用于流体系统建模和仿真的组件库。它包括泵、阀门、作动器、管道和热交换器的模型。您可以使用这些组件开发液压驱动系统,如前装载机、动力转向和起落架作动系统。引擎冷却和燃油供应系统也可以用 Simscape Fluids 开发。您可以使用 Simscape 产品系列中提供的组件来集成机械、电气、热力和其他系统。
-
Simscape Driveline 提供用于一维机械系统建模和仿真的组件库。它包括旋转和平移部件的模型,如蜗轮、行星齿轮、丝杠和离合器。您可以使用这些组件对直升机传动系统、工业机械、车辆动力总成系统和其他应用中的机械动力传输进行建模。还包括汽车部件,如发动机、轮胎、传动系统和变矩器。
该模型将泵流量 Q 引导至供应压力 p1,层流 q1ex 从供应压力泄漏至排气。活塞/缸组件的控制阀建模为通过可变面积孔口的紊流。其流量 q12 导致中间压力 p2,该压力随后在连接到作动器缸的管路中下降。缸压力 p3 克服弹簧负载移动活塞,从而产生位置 x。模型具体结构示意图如下所示:
可以得到如下图所示的单液压缸仿真结果。p1、p2和p3分别为缸体在原理图上不同位置处的压力值。画布的线条粗细可以直接在matlab画图中的菜单中进行参数设置。