MATLAB-增量式PID的实现&Simulink PID实现

本文详细介绍了增量式PID控制的原理,并通过MATLAB代码展示了其在系统跟踪响应中的应用。同时,给出了C语言实现增量式PID的示例代码,帮助读者理解其工作过程。此外,还对比了增量式PID与位置式PID的区别,并提供了SIMULINK的PID仿真结果,以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

增量式PID介绍
 

pid算法中位置型和增量型有什么区别,分析两者优缺点

比例P : e(k)-e(k-1) 这次误差-上次误差

积分I : e(i) 误差

微分D : e(k) - 2e(k-1)+e(k-2) 这次误差-2*上次误差+上上次误差

du为增量,error前3偏差计算出来即可算出du;相对于位置式PID要稳定一些

代码:

%增量式PID
clc % 清屏
clear all; % 删除workplace变量
close all; % 关掉显示图形窗口
%% 
%建立传递函数
ts=0.001; %采样时间
sys=tf(400,[1,50,0]);%建立传递函数模型,sys = tf(Numerator,Denominator) 
dsys=c2d(sys,ts,'z');%连续函数离散化,sysd = c2d(sys,Ts,method)
[num,den]=tfdata(dsys,'v');%获得分子分母,[num,den] = tfdata(sys) 

%%
%PID控制量
u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0;y_2=0;y_3=0;
x=[0,0,0]';%’是转置,储存PID的计算值

%%
%误差
error_1=0;
error_2=0;
for k=1:1:1000
    time(k)=k*ts;%时间轴,画图用
    
    yd(k)=2.0;%控制目标(理想位置)
    
    %PID参数
    kp=8;
    ki=0.2;
    kd=10;
    
    du(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID控制值增量
    u(k)=u_1+du(k);%PID控制器输出的控制量
    
    %避免PID值饱和,限制输出
    if u(k)>10
        u(k)=10;
    end
    if u(k)<-10
        u(k)=-10;
    end
    
    %计算y(k)
    y(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;%求系统输出
    u_3=u_2;u_2=u_1;u_1=u(k);%更新PID输出值,用于下一次y(k)计算
    y_3=y_2;y_2=y_1;y_1=y(k);%更新控制结果,用于下一次y(k)计算
    
    %计算偏差,以及PID输入
    error=yd(k)-y(k);%偏差=控制目标-当前的值
    x(1)=error-error_1;  %计算P
    x(2)=(error-error_1)-(error_1-error_2);%计算D
    x(3)=error;        %计算I
    
    %更新偏差
    error_2=error_1;
    error_1=error;
end
    
figure(1);
plot(time,yd,'r',time,y,'b','linewidth',2);
xlabel('时间(s)'); ylabel('误差');
grid on
title('增量式PKD跟踪响应曲线');
legend('理想位置','位置追踪');

figure(2);%误差
plot(time,yd-y,'r','linewidth',2);
xlabel('时间(s)');ylabel('误差');
grid on
title('增量是PID跟踪误差');

运行结果

参考材料《MATLAB_SIMULINK系统仿真》

附:

C语言实现增量是PID:

typedef struct PID
{ 
  float P,I,D,limit;
}PID;
typedef struct Error
{
  float Current_Error;//当前误差
  float Last_Error;//上一次误差
  float Previous_Error;//上上次误差
}Error;
 
/*! 
 *  @brief      增量式PID
 *  @since      v1.0
 *  *sptr :误差参数
 *  *pid:  PID参数
 *  NowPlace:实际值
 *  Point:   期望值
 */
// 增量式PID电机控制
int32 PID_Increase(Error *sptr, PID *pid, int32 NowPlace, int32 Point)
{
 
	int32 iError,	//当前误差
		Increase;	//最后得出的实际增量
 
	iError = Point - NowPlace;	// 计算当前误差
 
	Increase =  pid->P * (iError - sptr->Last_Error)   //比例P
			  + pid->I * iError      //积分I
			  + pid->D * (iError - 2 * sptr->Last_Error + sptr->Previous_Error);  //微分D
	
	sptr->Previous_Error = sptr->Last_Error;	// 更新前次误差
	sptr->Last_Error = iError;		  	// 更新上次误差
	
	return Increase;	// 返回增量
}

参考:位置式PID与增量式PID区别浅析_Z小旋-优快云博客_增量式pid

simulink PID仿真:

模型建立:

PID参数设置:

 

运行结果:

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值