我是靠谱客的博主 优秀花生,这篇文章主要介绍MATLAB-增量式PID的实现&Simulink PID实现增量式PID介绍  运行结果simulink PID仿真:,现在分享给大家,希望可以做个参考。

增量式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要稳定一些

代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
%增量式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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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小旋-CSDN博客_增量式pid

simulink PID仿真:

模型建立:

PID参数设置:

 

运行结果:

 

 

最后

以上就是优秀花生最近收集整理的关于MATLAB-增量式PID的实现&Simulink PID实现增量式PID介绍  运行结果simulink PID仿真:的全部内容,更多相关MATLAB-增量式PID的实现&Simulink内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部