PID算法Matlab仿真程序和C程序_第1頁(yè)
PID算法Matlab仿真程序和C程序_第2頁(yè)
PID算法Matlab仿真程序和C程序_第3頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、增量式 PID 控制算法Matlab 仿真程序設(shè)一被控對(duì)象 G(s)=50/(0.125s2+7s),用增量式 PID 控制算法編寫仿真程序(輸入分別為單位階躍、正弦信號(hào),采樣時(shí)間為 1ms,控制器輸出限幅: -5,5, 仿真曲線包括系統(tǒng)輸出及誤差曲線,并加上注釋、圖例) 。程序如下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 加在簡(jiǎn)單 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 只加在微分環(huán)節(jié)上的不完全微分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 簡(jiǎn)單的 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 語(yǔ)言 PID 演示程序#include <string.h>#include<stdio.h>typedef struct PIDdouble Command; /輸入指令double Proportion;/比例系數(shù)double Integral;/積分系數(shù)double Derivative;/ 微分系數(shù)double preErr;/ 前一拍誤差double sumErr;/ 誤差累積PID;doublePIDCale(PID*p,doublefeedback)double dErr,Err;Er

14、r=p->Command-feedback;/ 當(dāng)前誤差p->sumErr+=Err;/ 誤差累加dErr=Err-p->preErr;/誤差微分p->preErr=Err;return(p->Proportion*Err/比例項(xiàng)+p->Derivative*dErr/微分項(xiàng)+p->Integral*p->sumErr);/積分項(xiàng)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;/二階系統(tǒng)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設(shè)定值 =%f被控量 =%f偏差 =%f控制量增量式 PID 控制 C 語(yǔ)言代碼增量式 PID 控制 C 語(yǔ)言代碼/ / 定義 PID 參數(shù)結(jié)構(gòu)體/typedef struct PID / 結(jié)構(gòu)體定義intSetPoint/設(shè)定值intProportion;/Proportion比例系數(shù)intIntegral;/Integral積分系數(shù)intDerivative;/Derivative微分系數(shù)intLastErr

18、or;/Error-1前一拍誤差intPreError;/Error-2前兩拍誤差 PID;main()PID vPID;/定義結(jié)構(gòu)變量名PIDInit( &vPID );/InitializeStructurevPID.Proportion= 10;/Set PID CoefficientsvPID.Integral= 10;/ Set PID Integral vPID.Derivative = 10;/ Set PID DerivativevPID. SetPoint=/根據(jù)實(shí)際情況設(shè)定while(1)Verror=Measure();/得到 AD 的輸出值Error =vPID

19、.SetPoint-Verror;/與設(shè)定值比較,得到誤差值tempi=PIDCal(&vPID,Error;laser.Value+=tempi;/ Value 與 Num2 為共同體,共同體名 laserLASERH=laser.Num0;LASERL=laser.Num1;/ /Title:PID 參數(shù)初始化 /Description: Proportion="0"/Integral=0/LastError=0/Input: PID 的 P、I 控制常數(shù)和之前的誤差量( PID *pp )/Return:/ /void PIDInit(PID *pp)/PID 參數(shù)初始化,都置0memset( pp,0,sizeof(PID);/memset() 的函數(shù), 它可以一字節(jié)一字節(jié)地把整個(gè)數(shù)組設(shè)置為一個(gè)指定的值。/ memset() 函數(shù)在 mem.h 頭文件中聲明,它把數(shù)組的起始地址作為其第一個(gè)參數(shù),/第

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論