PID算法Matlab仿真程序和C程序_第1页
PID算法Matlab仿真程序和C程序_第2页
PID算法Matlab仿真程序和C程序_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、增量式 PID 控制算法Matlab 仿真程序设一被控对象 G(s)=50/(0.125s2+7s),用增量式 PID 控制算法编写仿真程序(输入分别为单位阶跃、正弦信号,采样时间为 1ms,控制器输出限幅: -5,5, 仿真曲线包括系统输出及误差曲线,并加上注释、图例) 。程序如下clear all;close all;ts=0.001;sys=tf(50,0.125,7, 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'e

2、rror_1=0;error_2=0;for k=1:1:1000time(k)=k*ts;S=2;if S=1kp=10;ki=0.1;kd=15;end%Linear modelyout(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 parametersu_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);x(1)=error(k)-error_1; %Cal culating Px(2)=error(k)-2*error_1+error_2; %C

3、alculating Dx(3)=error(k);%Calculating Ierror_2=error_1;error_1=error(k);endfigure(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 仿真程序ri

4、n(k)=1;%PID Controler with differential inStep Signaladvanceelseif S=2clear all;close all;kp=10;ki=0.1;kd=15;%SineSignalts=20;rin(k)=0.5*sin(2*pi*k*ts);sys=tf(1,60,1,'inputdelay',80);enddsys=c2d(sys,ts,'zoh');du(k)=kp*x(1)+kd*x(2)+ki*x(3);%num,den=tfdata(dsys,'v');PID Control

5、leru(k)=u_1+du(k);u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;%Restricting the output of controllerud_1=0;if u(k)>=5y_1=0;y_2=0;y_3=0;u(k)=5;error_1=0;error_2=0;endei=0;if u(k)<=-5for k=1:1:400u(k)=-5;time(k)=k*ts;%Linear modelyout(k)=-den(2)*y_1+num(2)*u_5;kp=0.36;kd=14;ki=0.0021;rin(k)=1.0*sign(sin(0.0002

6、5*2*pi*k*ts);error(k)=rin(k)-yout(k);ei=ei+error(k)*ts;gama=0.50;Td=kd/kp;Ti=0.5;c1=gama*Td/(gama*Td+ts); c2=(Td+ts)/(gama*Td+ts); c3=Td/(gama*Td+ts);M=1;if M=1 %PID Control with differential in advanceud(k)=c1*ud_1+c2*yout(k)-c3*y_1;u(k)=kp*error(k)+ud(k)+ki*ei; elseif M=2 %Simple PID Controlu(k)=k

7、p*error(k)+kd*(error(k)-error_1)/ts+ki*ei;endif u(k)>=110u(k)=110;endif u(k)<=-110u(k)=-110;end%Update parametersu_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);y_3=y_2;y_2=y_1;y_1=yout(k);error_2=error_1;error_1=error(k);endfigure(1);plot(time,rin,'r',time,yout,'b');xlabel('time(

8、s)');ylabel('rin,yout');figure(2);plot(time,u,'r');xlabel('time(s)');ylabel('u');不完全微分 PID 算法 Matlab 仿真程序%PID Controler with Partial differentialclear all;close all;ts=20;sys=tf(1,60,1,'inputdelay',80);dsys=c2d(sys,ts,'zoh');num,den=tfdata(dsys,

9、9;v');u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;ud_1=0;y_1=0;y_2=0;y_3=0;error_1=0;ei=0;for k=1:1:100time(k)=k*ts;rin(k)=1.0;%Linear modelyout(k)=-den(2)*y_1+num(2)*u_5;error(k)=rin(k)-yout(k);%PID Controller with partly differentialei=ei+error(k)*ts;kc=0.30;ki=0.0055;TD=140;kd=kc*TD/ts;Tf=180;Q=tf(1,Tf,1);

10、%Low Freq SignalFilterM=2;if M=1 %Using PID with Partial differential 加在简单 PID 后的不完全微分alfa=Tf/(ts+Tf);u(k)=alfa*u_1+(1-alfa)*(kc*error(k )+kd*(error(k)-error_1)+ki*ei);u_1=u(k);elseif M=2 %Using PID with Partial differential 只加在微分环节上的不完全微分alfa=Tf/(ts+Tf);ud(k)=kd*(1-alfa)*(error(k)-error_1)+alfa*ud_

11、1;u(k)=kc*error(k)+ud(k)+ki*ei;ud_1=ud(k);elseif M=3 %Using Simple PID 简单的 PID 微分u(k)=kc*error(k)+kd*(error(k)-error _1)+ki*ei;end%Restricting the output of controller if u(k)>=10u(k)=10;endif u(k)<=-10u(k)=-10;endu_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);y_3=y_2;y_2=y_1;y_1=yout(k);error_1=err

12、or(k);endfigure(1);plot(time,rin,'b',time,yout,'r');xlabel('time(s)');ylabel('rin,yout');figure(2);plot(time,u,'r');xlabel('time(s)');ylabel('u');figure(3);plot(time,rin-yout,'r');xlabel('time(s)');ylabel('error');figure

13、(4);bode(Q,'r');dcgain(Q);C 语言 PID 演示程序#include <string.h>#include<stdio.h>typedef struct PIDdouble Command; /输入指令double Proportion;/比例系数double Integral;/积分系数double Derivative;/ 微分系数double preErr;/ 前一拍误差double sumErr;/ 误差累积PID;doublePIDCale(PID*p,doublefeedback)double dErr,Err;Er

14、r=p->Command-feedback;/ 当前误差p->sumErr+=Err;/ 误差累加dErr=Err-p->preErr;/误差微分p->preErr=Err;return(p->Proportion*Err/比例项+p->Derivative*dErr/微分项+p->Integral*p->sumErr);/积分项void PIDInit(PID *p)memset(p,0,sizeof(PID);/初始化typedef struct motordouble lastY;double preY;=%fn",k,sPID.

15、Command,y,sPIDdouble lastU;.Command-y,u);double preU;motor;u=PIDCale(&sPID,y);y=motorCal(&m_motor,u);void motorInit(motor *m)k+;memset(m,0,sizeof(motor);printf("%fn",y);fclose(fp);double motorCal(motor *m,double u)doubley=1.9753*m->lastY-0.9753*m->preY+0.00003284*u+0.00006568

16、*m->lastU+0.00003284*m->preU;/二阶系统m->preY=m->lastY;m->lastY=y;m->preU=m->lastU;m->lastU=u;return y;void main()FILE *fp=fopen("data.txt","w+"); PID sPID;motor m_motor;int k=0;double u;double y=0;PIDInit(&sPID);sPID.Proportion=2;sPID.Derivative=1;sPID.In

17、tegral=0.00001;sPID.Command=10;motorInit(&m_motor);while(k<=1000)?fprintf(fp,"%d设定值 =%f被控量 =%f偏差 =%f控制量增量式 PID 控制 C 语言代码增量式 PID 控制 C 语言代码/ / 定义 PID 参数结构体/typedef struct PID / 结构体定义intSetPoint/设定值intProportion;/Proportion比例系数intIntegral;/Integral积分系数intDerivative;/Derivative微分系数intLastErr

18、or;/Error-1前一拍误差intPreError;/Error-2前两拍误差 PID;main()PID vPID;/定义结构变量名PIDInit( &vPID );/InitializeStructurevPID.Proportion= 10;/Set PID CoefficientsvPID.Integral= 10;/ Set PID Integral vPID.Derivative = 10;/ Set PID DerivativevPID. SetPoint=/根据实际情况设定while(1)Verror=Measure();/得到 AD 的输出值Error =vPID

19、.SetPoint-Verror;/与设定值比较,得到误差值tempi=PIDCal(&vPID,Error;laser.Value+=tempi;/ Value 与 Num2 为共同体,共同体名 laserLASERH=laser.Num0;LASERL=laser.Num1;/ /Title:PID 参数初始化 /Description: Proportion="0"/Integral=0/LastError=0/Input: PID 的 P、I 控制常数和之前的误差量( PID *pp )/Return:/ /void PIDInit(PID *pp)/PID 参数初始化,都置0memset( pp,0,sizeof(PID);/memset() 的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。/ memset() 函数在 mem.h 头文件中声明,它把数组的起始地址作为其第一个参数,/第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论