matlab-PID
PID基本概念
比例,积分,微分控制
参照:链接
当系统输出靠近期望值(设为100)时,系统积分项一直在累积正向误差,导致积分项非常大,系统输出一开始很容易就达到150。
这种现象称为PI过冲。(只有比例积分调节)
解决方法有:抗积分饱和算法
抗积分饱和算法
思想:在计算积分的值U(K)时,判断上一时刻U(K-1)是否超过限定范围:
- 若U(k-1)>Umax,则只累加负偏差;
- 若U(k-1)<Umin,则只累加正偏差。
避免了PID调节难以退出饱和区
不完全微分PID
由于微分项很容易引入高频的干扰,所以通常会给微分项引入低通滤波器,低通滤波器的添加位置有2种,
1是微分调节器的输出端
2是PID相加之后的输出端
如下图:
一阶rc的数字低通滤波器,或者其他高阶的低通滤波器
引入了低通滤波器后,高频的干扰会被过滤掉,减少了微分项导致高频振荡的风险。
微分先行PID
由于输入的期望值一直在跳变的话,这会导致微分调节项引入高频干扰,所以通常在输出端进行微分,而不在输入端进行微分。如下图:
可以避免指令的改变,导致超调过大。
一个经典的PID结构体定义:
typedef struct{
float kp;
float ki;
float kd;
float summary;//积分项累计值
float expect;//期望值
float last_error;//上一次累计误差
}PID_Structure_t;
PID 计算函数:
float pid_result(PID_Structure_t *pid_handler ,float collect){
float current_result;
float error = pid_handler->expect - collect;
//将误差累加到积分项中
pid_handler->summary += error;
current_result = pid_handler->kp * error +
pid_handler->ki * pid_handler->summary +
pid_handler->kd * (pid_handler->last_error);
//更新上刻的误差
pid_handler->last_error = error;
return current_result;
}
matlab中的实现
matlab实现1
参照大佬博客:点点点
上面链接中还可多图比较
可拷贝到命令窗口中直接运行:
clear all
ts=0.005; %采样时间=0.005s
sys=tf(0.998,[0.021,1]); %建立被控对象传递函数,即式4.1
dsys=c2d(sys,ts,'z'); %离散化
[num,den]=tfdata(dsys,'v'); %
e_1=0; %前一时刻的偏差
Ee=0; %累积偏差
u_1=0.0; %前一时刻的控制量
y_1=0; %前一时刻的输出
%PID参数
kp=0.22;
ki=0.13;
kd=0;
u=zeros(1,1000);%预先分配内存
time=zeros(1,1000);%时刻点(设定1000个)
for k=1:1:1000
time(k)=k*ts; %时间参数
r(k)=1500; %期望值
y(k)=-1*den(2)*y_1+num(2)*u_1+num(1)*u(k);%系统响应输出序列
e(k)=r(k)-y(k); %误差信号
u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1); %系统PID控制器输出序列
Ee=Ee+e(k); %误差的累加和
u_1=u(k); %前一个的控制器输出值
y_1=y(k); %前一个的系统响应输出值
e_1=e(k); %前一个误差信号的值
end
%(仅绘制过渡过程的曲线,x坐标限制为[0,1])
p1=plot(time,r,'-.');xlim([0,1]);hold on;%指令信号的曲线(即期望输入)
p2=plot(time,y,'--');xlim([0,1]);%不含积分分离的PID曲线
%plot( x, y); print(gcf, '-djpeg', 'abc.jpg') %绘制图像并保存为jpg格式
hold on
grid on
disp('done')
期望输出是1500,还是感觉很厉害的
输出结果:
matlab实现2(调用内部函数)
参照:链接
code:
clear all
clc
num = [1]
denom = [1 3 1]
Gp = tf( num, denom )
H = [1]
M = feedback( Gp, H )
step(M)
hold on
grid on
%%
Kp = 1
Ki = 0
Kd = 0
Gc = pid( Kp, Ki, Kd)
Mc = feedback( Gc*Gp, H)
step( Mc )
hold on
grid on
PID调参经验
手动整定
也称手动整定。
参照视频:链接
一般先将Pd设为0,进行PI调节。
仅PI调节一般会出现较大的振荡。
口诀:
翻译翻译:
- 先是比例后微分,再积分。
即Kp=3,Ki=0,Kd=0;
Kp=调参结果,Ki=调参,Kd=0;
Kp=调参结果,Ki=调参结果,Kd=调参;
现象 | 处理方法 |
---|---|
振荡频繁 | Kp加大 |
波峰与紧邻谷相距较远 | Kp调小 |
曲线偏离回复慢 | Ki调大 |
曲线波动周期长 | Ki调小 |
导管 | $1 |
业内常用衰减曲线法。
衰减比为4:1的经验公式如下:
就拿经验系数去乘上现在的参数。
衰减比为10:1的公式:
PID自动整定法
常见:
模式识别法(专家系统)。参照专家的一些方法,查询数据手册实现
自校正PID
模糊自适应整定PID
神经网络PID
其他参数优化算法
模式识别法
在暂态过程中,取一些特征的向量。
根据这个方法,去修正PID的值.
自校正PID
实际上是一种极点配置法,就是通过调整PID控制器的结构和参数,让闭环系统的特征多项式接近于预定的式子。
模糊自适应整定PID
针对非线性时不变(LTI)系统就有用,需要一个基础的PID值,通过一些模糊规则实现,
神经网络PID
主要调节参数:学习率,平滑因子等
其他参数优化算法
PID倒立摆实验
simulink仿真
系统学习视频
matlab命令流窗口中启动simulink,打不开就结合手动点击一起
simulink
要看下,有没有下面这个库,方便转化为c语言代码,这里是matlab2012a版本
然后把图画一画:
PID的参数对比组数:
PID=[0.22,0.13,0;
0.4,0.13,0;
0.4,0.25,0;
0.8,0.23,0.4;
0.8,0.2,1;
0.7,0.2,0.9];%初始化PID参数
这里用的参数就是第一组的0.22和0.13,
期望输出就是1500
运行后,双击scope得到波形,nice啊: