博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
增量式PID的matlab实现
阅读量:4581 次
发布时间:2019-06-09

本文共 2898 字,大约阅读时间需要 9 分钟。

首先,增量式PID的实现公式:

式中 Δe(k)=e(k)-e(k-1)

进一步可以改写成

       

式中       、

 

为了便于理解,也可写成:

式中e(k)为第k次采样时的设定值与实际值的差,e(k-1)为上一次采样时的设定值与实际值的差值,e(k-2)一样类推。

所以增量式PID 输出的是控制量的增量,无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

而且,由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,

因此对系统影响较大。

下面是用Matlab 对增量式PID的仿真。

1 %执行机构需要的是控制量的增量,例如驱动不仅电机的时候,采用增量式PID控制, 2 %增量式PID控制算法中不需要累加,控制增量u(k)仅与最近k次的采样有关,所以误动作影响小。 3 %设一被控对象G(s)=50/(0.125s^2+7s),   4 %用增量式PID控制算法编写仿真程序   5 %(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-5,5],   6 %  仿真曲线包括系统输出及误差曲线,并加上注释、图例)。   7    8 clc; 9 clear ;     10 ts=0.001;                  %采样时间  11 %sys=tf(50,[0.125,7, 0]);  %tf是传递函数,用来实现G(s);  在自动控制领域经常用到,12 sys=tf(400,[1,50,0]);   13 dsys=c2d(sys,ts,'z');        %把控制函数离散化,转化为拆分方程14 [num,den]=tfdata(dsys,'v');  % 离散化后提取分子、分母 ,提取拆分方程系数   15 u_1=0.0;  16 u_2=0.0;  17 y_1=0.0;  18 y_2=0.0;  19 x=[0,0,0]';  20 error_1=0;  21 error_2=0;  22 for k=1:1:3000  23 time(k)=k*ts;    %采样次数  24 25 S=4;   %选择需要跟踪的函数26 if S==1  27    % kp=10;ki=0.1;kd=15;             %初始化PID28     kp=8;ki=0.1;kd=10;29     rin(k)=1;            %Step Signal ,阶跃信号  30 end31 if S==2  32     kp=10;ki=0.1;kd=15;               33     rin(k)=0.5*sin(2*pi*k*ts);       %Sine Signal   正弦信号  34 end    35 if S==3          %三角波信号 36      kp=10;ki=0.1;kd=15;37      if mod(time(k),2)<138          rin(k)=mod(time(k),1);39      else40          rin(k)=1-mod(time(k),1);41      end42      rin(k)=rin(k)-0.5;43 end44 if S==4     %锯齿波信号45     kp=8;ki=0.05;kd=4; %测试得合适参数,如果输出过冲,可将kd调小。46     rin(k)=mod(time(k),1);47 end48  49 du(k)=kp*x(1)+kd*x(2)+ki*x(3);      %PID Controller   控制系数    50 u(k)=u_1+du(k); 51 52 if u(k)>=10         %Restricting the output of controller,输出限幅53    u(k)=10;  54 end  55 if u(k)<=-10  56    u(k)=-10;  57 end  58 59 %Linear model  60 yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;          %实际输出  61 error(k)=rin(k)-yout(k);                                       %Return of parameters 误差  62 u_2=u_1;                                                       %保存上上次输入   为下次计算  63 u_1=u(k);                                                      %保存上一次控制系数   为下次计算  64 y_2=y_1;                                                       %保存上上次次输出   为下次计算  65 y_1=yout(k);                                                   %保存上一次输出   为下次计算  66 67 x(1)=error(k)-error_1;            %Calculating P  68 x(2)=error(k)-2*error_1+error_2;  %Calculating D  69 x(3)=error(k);                    %Calculating I  70 71 error_2=error_1;                      72 error_1=error(k);                      73 end  74 75 figure(1);  76 plot(time,rin,'b',time,yout,'r');                        %输入 和实际控制输出  77 xlabel('time(s)'),ylabel('rin,yout');   78 % figure(2);  79 % plot(time,error,'r')                                     %输入与输出误差输出曲线  80 % xlabel('time(s)');ylabel('error');

 

 对锯齿信号的追踪图形:

 

转载于:https://www.cnblogs.com/qsyll0916/p/6890479.html

你可能感兴趣的文章
sqlserver跨服务器数据库sql语句
查看>>
设计模式-结构型模式,外观模式(6)
查看>>
Trie模版
查看>>
2018HDU多校训练-3-Problem F. Grab The Tree
查看>>
2016012032四则运算网页版结对项目报告
查看>>
淘宝专业版改基础版方法
查看>>
[转]ARM Pipeline
查看>>
[转]Blocking Code Injection on iOS and OS X
查看>>
颜色分类函数
查看>>
(中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
查看>>
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>
.NET中的out和ref关键字
查看>>
Python之ftp服务器
查看>>
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>
C语 三子棋小游戏
查看>>
[BZOJ 1861] 书架
查看>>
送给毕业生的一个学习建议
查看>>
基于redis+lua实现高并发场景下的秒杀限流解决方案
查看>>