pid算法
引言
上篇介绍了连续系统的PID算法,但是计算机控制是一种采样控制,他只能根据采样时刻的偏差来计算控制量,因此计算机控制系统中,必须对公式进行离散化,具体就是用求和代替积分,用向后差分来代替微分,使模拟PID离散化为数字形式的差分方程。
准备工作
在采样周期足够小时,可以作如下近似:
式中
- T————为采样周期
- k————为采样序号,k=0,1,2….
用这种近似方法,可以得到两种形式数字PID控制算法
位置式pid算法
由前面推倒很容易得到离散化后的表达式
由此式可以看出数字调节的输出u(k)跟过去的所有偏差信号有关,计算机需要对e(i)进行累加,运算量太大,一般不用,重点说明增量式PID算法。
增量式PID算法
由于增量式PID的算法不够方便,不仅对偏差进行累加,占用过多的存储单元,而且不方便写程序,所以需要进行一些改进,对位置式取增量,方法如下:
Matlab仿真
分析过程
1、对G(s)进行离散化即进行Z变换得到Z传递函数G(Z);
2、分子分母除以z的最高次数即除以z的最高次得到;
3、由z的位移定理Z[e(t-kt)]=z^k*E(z)逆变换得到差分方程;
4、PID编程实现
具体实现细节在代码注释中已经给出
%设一被控对象G(s)=50/(0.125s^2+7s),
%用增量式PID控制算法编写仿真程序
%(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-3,3],
% 仿真曲线包括系统输出及误差曲线)。
ts=0.001; %采样时间
sys=tf(50,[0.125,7, 0]); %tf是传递函数 即被控对象函数G();
dsys=c2d(sys,ts,'z'); %把控制函数离散化取Z变换n阶定常离散系统差分方程
%在零初始条件下取Z变换:
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');% 离散化后提取分子、分母
u_1=0.0;
u_2=0.0;
y_1=0.0;
y_2=0.0;
x=[0,0,0]';
ERROR_1=0;
error_2=0;
%核心代码
for k=1:1:1000
time(k)=k*ts; %采样次数
S=1;
if S==1 %阶跃输入
kp=6.5;ki=0.1;kd=1; %初始化PID
rin(k)=1; %Step signal
elseif S==2 %正弦输入
kp=10;ki=0.1;kd=15;
rin(k)=0.5*sin(2*pi*k*ts); %Sine Signal 即实际输入
end
du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID controller 控制系数
u(k)=u_1+du(k); %真正的PID输出应该为du+前一时刻的输出
if u(k)>=3
u(k)=3;
end
if u(k)<=-3
u(k)=-3;
end
%Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; %实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。
error(k)=rin(k)-yout(k); % 误差 输入-输出
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_2=y_1; %保存上上次次输出 为下次计算
y_1=yout(k); %保存上一次输出 为下次计算
x(1)=error(k)-error_1; %KP的系数
x(2)=error(k)-2*error_1+error_2; %KD的系数
x(3)=error(k); %KI的系数
error_2=error_1; %上次的变上上次误差
error_1=error(k); %这次的变上次的误差
end
figure(1);
plot(time,rin,'b',time,yout,'r'); %输入 和实际控制输出
xlabel('time(s)'),ylabel('rin,yout');
figure(2);
plot(time,error,'r') %时间误差输出曲线
xlabel('time(s)');ylabel('error');
仿真效果(PID调参后)
调参过程
(1)
确定比例系数Kp
确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为
纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
(2)
确定积分时间常数Ti
比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。
(3)
确定微分时间常数Td
微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。
(4)
系统空载、带载联调
对PID参数进行微调,直到满足性能要求。
Simulink仿真部分
这里使用Simulink仿真也非常的方便,只需要设定好PID控制器的参数和传递函数即可
这里注意Filter coefficient这个参数起前向滤波作用,这里取得1
微分环节的缺点,就是误差e变化微弱的时候,如果D过大会产生过大的修正量,导致震动不但不减小反而扩大。
滤波器的作用就是滤除高频修正,使D更好用,说白了是一个改进型
运行后双击示波器查看结果
结论
(1)对于PID 参数采用 MATLAB 进行整定和仿真,使用起来不仅快捷、方便,而且更为直观,同时也避免了传统方法反复修改参数调试。
(2)系统的响应速度会随Kp值的增大而加快,同时也有助于静差的减小,而Kp值过大则会使系统有较大超调,稳定性变坏;此外,系统的动作会因为过小的Kp值减慢。
(3)超调的减小、振荡变小以及系统稳定性的增加都取决于积分时间Ti的增大,但是系统静差消除时间会因为Ti的增大而变长。
(4)增大微分时间Td对于系统的稳定性、系统响应速度的加快以及系统超调量的减小都会有所帮助。但是如果Td过大,则会使得调节时间较长,超调量也会增大;如果Td过小,同样地也会发生以上状况。
(5)总之PID 参数的整定必须考虑在不同时刻三个参数的作用以及彼此之间的作用关系。
相关Matlab代码和Simulink仿真文件已经上传,可自行下载https://download.csdn.net/download/kilotwo/10329949
相关阅读
def gethint(secret, guess): secret_dict = {} # 创建字典 用于存储公牛和母牛的数量(AB) guess_dict = {} A =
一、递归法 引用:https://www.cnblogs.com/mengfanrong/p/3854044.html 比如,假设集合是{a,b,c},那么这个集合中元素的全部排列是{
日期大写的输出 假设今天是2019年8月27日13点5分39秒 返回 => 贰零壹玖年捌月贰拾柒日壹拾叁点伍分叁拾玖秒function myfunction(
atoi函数要求 我所实现的atoi函数有以下几个要求: 1,这个函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开
好吧,一个标题党的标题,但是本质上也没有任何夸大,算法的确知道你值多少钱,并决定向你展示什么样的广告。自从Facebook引入oCPM出价以