增量式PID 的matlab仿真
2017-05-22 17:31
246 查看
首先,增量式PID的实现公式:
式中 Δe(k)=e(k)-e(k-1)
进一步可以改写成
式中
、
、
为了便于理解,也可写成:
式中e(k)为第k次采样时的设定值与实际值的差,e(k-1)为上一次采样时的设定值与实际值的差值,e(k-2)一样类推。
所以增量式PID 输出的是控制量的增量,无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
而且,由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,
4000
而位置式的输出直接对应对象的输出,
因此对系统影响较大。
下面是用Matlab 对增量式PID的仿真。
%执行机构需要的是控制量的增量,例如驱动不仅电机的时候,采用增量式PID控制,
%增量式PID控制算法中不需要累加,控制增量u(k)仅与最近k次的采样有关,所以误动作影响小。
%设一被控对象G(s)=50/(0.125s^2+7s),
%用增量式PID控制算法编写仿真程序
%(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-5,5],
% 仿真曲线包括系统输出及误差曲线,并加上注释、图例)。
clc;
clear ;
ts=0.001; %采样时间
%sys=tf(50,[0.125,7, 0]); %tf是传递函数,用来实现G(s); 在自动控制领域经常用到,
sys=tf(400,[1,50,0]);
dsys=c2d(sys,ts,'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:3000
time(k)=k*ts; %采样次数
S=4; %选择需要跟踪的函数
if S==1
% kp=10;ki=0.1;kd=15; %初始化PID
kp=8;ki=0.1;kd=10;
rin(k)=1; %Step Signal ,阶跃信号
end
if S==2
kp=10;ki=0.1;kd=15;
rin(k)=0.5*sin(2*pi*k*ts); %Sine Signal 正弦信号
end
if S==3 %三角波信号
kp=10;ki=0.1;kd=15;
if mod(time(k),2)<1
rin(k)=mod(time(k),1);
else
rin(k)=1-mod(time(k),1);
end
rin(k)=rin(k)-0.5;
end
if S==4 %锯齿波信号
kp=8;ki=0.05;kd=4; %测试得合适参数,如果输出过冲,可将kd调小。
rin(k)=mod(time(k),1);
end
du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller 控制系数
u(k)=u_1+du(k);
if u(k)>=10 %Restricting the output of controller,输出限幅
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Linear model
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; %实际输出
error(k)=rin(k)-yout(k); %Return of parameters 误差
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_2=y_1; %保存上上次次输出 为下次计算
y_1=yout(k); %保存上一次输出 为下次计算
x(1)=error(k)-error_1; %Calculating P
x(2)=error(k)-2*error_1+error_2; %Calculating D
x(3)=error(k); %Calculating I
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');
对锯齿信号的追踪图形:
式中 Δe(k)=e(k)-e(k-1)
进一步可以改写成
式中
、
、
为了便于理解,也可写成:
式中e(k)为第k次采样时的设定值与实际值的差,e(k-1)为上一次采样时的设定值与实际值的差值,e(k-2)一样类推。
所以增量式PID 输出的是控制量的增量,无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
而且,由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,
4000
而位置式的输出直接对应对象的输出,
因此对系统影响较大。
下面是用Matlab 对增量式PID的仿真。
%执行机构需要的是控制量的增量,例如驱动不仅电机的时候,采用增量式PID控制,
%增量式PID控制算法中不需要累加,控制增量u(k)仅与最近k次的采样有关,所以误动作影响小。
%设一被控对象G(s)=50/(0.125s^2+7s),
%用增量式PID控制算法编写仿真程序
%(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-5,5],
% 仿真曲线包括系统输出及误差曲线,并加上注释、图例)。
clc;
clear ;
ts=0.001; %采样时间
%sys=tf(50,[0.125,7, 0]); %tf是传递函数,用来实现G(s); 在自动控制领域经常用到,
sys=tf(400,[1,50,0]);
dsys=c2d(sys,ts,'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:3000
time(k)=k*ts; %采样次数
S=4; %选择需要跟踪的函数
if S==1
% kp=10;ki=0.1;kd=15; %初始化PID
kp=8;ki=0.1;kd=10;
rin(k)=1; %Step Signal ,阶跃信号
end
if S==2
kp=10;ki=0.1;kd=15;
rin(k)=0.5*sin(2*pi*k*ts); %Sine Signal 正弦信号
end
if S==3 %三角波信号
kp=10;ki=0.1;kd=15;
if mod(time(k),2)<1
rin(k)=mod(time(k),1);
else
rin(k)=1-mod(time(k),1);
end
rin(k)=rin(k)-0.5;
end
if S==4 %锯齿波信号
kp=8;ki=0.05;kd=4; %测试得合适参数,如果输出过冲,可将kd调小。
rin(k)=mod(time(k),1);
end
du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller 控制系数
u(k)=u_1+du(k);
if u(k)>=10 %Restricting the output of controller,输出限幅
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Linear model
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; %实际输出
error(k)=rin(k)-yout(k); %Return of parameters 误差
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_2=y_1; %保存上上次次输出 为下次计算
y_1=yout(k); %保存上一次输出 为下次计算
x(1)=error(k)-error_1; %Calculating P
x(2)=error(k)-2*error_1+error_2; %Calculating D
x(3)=error(k); %Calculating I
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的matlab仿真
- 增量式PID控制算法的MATLAB仿真及思考
- 增量式PID的matlab实现
- Matlab的高斯输入的PID仿真
- Kalman滤波锁相及Matlab仿真
- 离合器预减振超载造成变速箱怠速异响matlab仿真分析
- 《卡尔曼滤波原理及应用-MATLAB仿真》程序-3.2
- 《卡尔曼滤波原理及应用-MATLAB仿真》程序-7.1
- STK/MATLAB/Aerospace联合仿真函数总集
- 【机器学习】视觉机器学习20讲配套仿真代码(Matlab)
- 论文中matlab仿真图在word双栏清晰显示
- matlab和c#联合仿真之一(VS2010,Matlab2012a)
- Solidworks与Matlab联合仿真&SimMechnics下载及安装
- matlab仿真迈克尔逊干涉仪工作 单频非定域等倾干涉
- matlab数据流仿真和时间流仿真
- OFDM信号仿真MATLAB程序
- MATLAB BP神经网络中仿真结果与手工计算不符合的解决办法
- Third order system anlysis 自控 三阶系统的稳定性分析 matlab multisim仿真分析
- PMSM控制01-在MATLAB/sinmulink仿真实现-计时器比较法输出SVPWM波形
- 最小二乘曲线拟合的MATLAB仿真