matlab-PID

PID基本概念

比例,积分,微分控制
参照:链接
当系统输出靠近期望值(设为100)时,系统积分项一直在累积正向误差,导致积分项非常大,系统输出一开始很容易就达到150。
这种现象称为PI过冲。(只有比例积分调节)
解决方法有:抗积分饱和算法

抗积分饱和算法

思想:在计算积分的值U(K)时,判断上一时刻U(K-1)是否超过限定范围:

  1. 若U(k-1)>Umax,则只累加负偏差;
  2. 若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调节一般会出现较大的振荡。
口诀:
在这里插入图片描述
翻译翻译:

  1. 先是比例后微分,再积分。
    即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啊:
在这里插入图片描述

  • 7
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值