日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Matlab仿真PID控制(带M文件、simulink截图和参数分析)

發(fā)布時(shí)間:2025/3/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab仿真PID控制(带M文件、simulink截图和参数分析) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 0.符號(hào)說(shuō)明
  • 1.如何根據(jù)連續(xù)系統(tǒng)建立差分方程
    • 1.1.獲取連續(xù)系統(tǒng)的傳遞函數(shù)
    • 1.2.獲取離散系統(tǒng)的傳遞函數(shù)
    • 1.3.轉(zhuǎn)換為差分方程
  • 2.基本PID控制原理
  • 3.比較PID輸出,分析參數(shù)產(chǎn)生的影響
  • 4.改進(jìn)PID算法(遇限削弱積分法)
  • 5.simulink仿真

0.符號(hào)說(shuō)明

  • y(k)——系統(tǒng)響應(yīng)輸出的離散值
  • u(k)——數(shù)字PID控制輸出的離散值
  • r(k)——期望輸出的離散值(事先已知),在本例中為常數(shù)(即階躍輸入)
  • e(k)——e(k)=r(k)-y(k),為期望值-實(shí)際值,是單位負(fù)反饋的誤差比較信號(hào)

    注:圖片來(lái)源于百度百科
  • 1.如何根據(jù)連續(xù)系統(tǒng)建立差分方程

    1.1.獲取連續(xù)系統(tǒng)的傳遞函數(shù)

    線性定常系統(tǒng)的控制中,PID是個(gè)非常常見(jiàn)的控制方式,如果可以通過(guò)Matlab仿真出PID的控制效果圖,那么對(duì)系統(tǒng)設(shè)計(jì)時(shí)的實(shí)時(shí)調(diào)試將會(huì)容易得多。在這里我們將會(huì)以一個(gè)利用系統(tǒng)辨識(shí)參數(shù)的PID設(shè)計(jì)為為例展示Matlab仿真PID的過(guò)程。
    首先需要對(duì)一個(gè)未知的系統(tǒng)的參數(shù)進(jìn)行辨識(shí),以延遲環(huán)節(jié)可以忽略不計(jì)的電機(jī)調(diào)速系統(tǒng)為例。將時(shí)間戳導(dǎo)入xdata向量,對(duì)應(yīng)的時(shí)刻轉(zhuǎn)速導(dǎo)入ydata向量,進(jìn)行系統(tǒng)辨識(shí)

    鏈接:Matlab的系統(tǒng)辨識(shí)

    我們就以上文鏈接中辨識(shí)的系統(tǒng)傳遞函數(shù)為例:
    G(s)=0.9980.021s+1G(s)=\frac{0.998}{0.021s+1}G(s)=0.021s+10.998?因此通過(guò)tf函數(shù)建立系統(tǒng)結(jié)構(gòu)體如下:

    sys=tf(0.998,[0.021,1]); %建立被控對(duì)象傳遞函數(shù),即式4.1

    1.2.獲取離散系統(tǒng)的傳遞函數(shù)

    由于是數(shù)字PID仿真,我們需要選取一個(gè)采樣時(shí)間,本案例選用的是0.005s(注意,采樣周期應(yīng)該小于系統(tǒng)純滯后時(shí)間的0.1倍)。在對(duì)其進(jìn)行數(shù)字PID控制前,我們需要將這個(gè)系統(tǒng)離散化:

    ts=0.005; %采樣時(shí)間=0.005s dsys=c2d(sys,ts,'z'); %離散化

    dsys即我們根據(jù)采樣周期離散化的Z變換系統(tǒng)。首先我們需要提取這個(gè)Z變化d那系統(tǒng)的參數(shù)方便后面的計(jì)算:

    [num,den]=tfdata(dsys,'v');%'v'代表強(qiáng)制以向量的格式(默認(rèn)為元胞數(shù)組)輸出num和den

    1.3.轉(zhuǎn)換為差分方程

    求解出的Z變換表達(dá)式為dsys=num(1)?z+num(2)den(1)?z+den(2)=0.2114z?0.7881dsys=\frac{num(1)\cdot z +num(2)}{den(1)\cdot z+den(2)}=\frac{0.2114}{z-0.7881}dsys=den(1)?z+den(2)num(1)?z+num(2)?=z?0.78810.2114?
    在PID仿真的過(guò)程中我們需要求解出時(shí)域表達(dá)式 ,因此需要借助差分方程解決,對(duì)于以下的Z變換:

    \begin{equation}
    Y(z)=dsys\cdot U(z)=\frac{num(2)}{den(1)\cdot z+den(2)}\cdot U(z)
    \label{eq:Sample1}
    \end{equation}

    \begin{equation}
    zY(z)+den(2)Y(z)=num(1)zU(z)+num(2)U(z)
    \label{eq:Sample2}
    \end{equation}
    對(duì)上式進(jìn)行反Z變換,可以得到以下的差分方程:

    \begin{equation}
    y(k+1)+den(2)y(k)=num(1)u(k+1)+num(2)u(k)
    \label{eq:Sample3}
    \end{equation}

    \begin{equation}
    y(k+1)=-den(2)y(k)+num(1)u(k+1)+num(2)u(k)
    \label{eq:Sample4}
    \end{equation}
    位置型PID仿真時(shí)實(shí)際上可以不需要保存前一個(gè)數(shù)據(jù)(u(k)和y(k)),增量型PID必須要保存前一個(gè)數(shù)據(jù)。這里我們使用了位置型PID,但仍然利用u1u_1u1?y1y_1y1?保存了上一個(gè)數(shù)據(jù),僅僅是為了演示這一過(guò)程。\begin{equation}
    y(k+1)=-den(2)y(k)+num(1)u(k+1)+num(2)u(k)
    \end{equation}
    可以轉(zhuǎn)換為下面的式子:
    \begin{equation}
    y(k)=-den(2)y_1+num(1)u(k)+num(2)u_1
    \label{eq:Sample5}
    \end{equation}
    我們的差分方程就這樣建立完畢。注意,此差分方程僅僅是描述系統(tǒng)模型的運(yùn)算規(guī)律的,和我們的控制無(wú)關(guān)。因此是y(k)和u(k)的映射關(guān)系。我們下面的控制則是利用負(fù)反饋信號(hào)e(k)導(dǎo)出u(k)的輸出,求解的是控制器u(k)的序列值。

    2.基本PID控制原理

    以位置型PID控制為例。將連續(xù)的PID控制轉(zhuǎn)換為數(shù)字式時(shí),微分環(huán)節(jié)被用差分代替,積分環(huán)節(jié)被累加和代替,比例環(huán)節(jié)則保持不變。差分的實(shí)現(xiàn)非常簡(jiǎn)單,只需要用e(k+1)?e(k)e(k+1)-e(k)e(k+1)?e(k)e(k)?e1e(k)-e_1e(k)?e1?等效即可。積分的實(shí)現(xiàn)在每一次運(yùn)算的后面都累加原來(lái)的誤差,即Ee=Ee+e_1;即可。PID的控制器輸出u(k)=Kp?e(k)+Kd?(e(k)?e1)+Ki?Eeu(k)=Kp\cdot e(k)+Kd\cdot (e(k)-e_1)+Ki\cdot Eeu(k)=Kp?e(k)+Kd?(e(k)?e1?)+Ki?Ee
    PID控制器構(gòu)造完畢,我們需要通過(guò)r(k)和y(k)得到e(k),再通過(guò)e(k)得出u(k),進(jìn)而再求解出y(k),再結(jié)合r(k)求解出e(k),…以此循環(huán),求解出離散的響應(yīng)點(diǎn)。
    詳細(xì)的代碼如下:

    ts=0.005; %采樣時(shí)間=0.005s sys=tf(0.998,[0.021,1]); %建立被控對(duì)象傳遞函數(shù),即式4.1 dsys=c2d(sys,ts,'z'); %離散化 [num,den]=tfdata(dsys,'v'); % e_1=0; %前一時(shí)刻的偏差 Ee=0; %累積偏差 u_1=0.0; %前一時(shí)刻的控制量 y_1=0; %前一時(shí)刻的輸出 %PID參數(shù) kp=0.22; ki=0.13; kd=0; u=zeros(1,1000);%預(yù)先分配內(nèi)存 time=zeros(1,1000);%時(shí)刻點(diǎn)(設(shè)定1000個(gè)) for k=1:1:1000time(k)=k*ts; %時(shí)間參數(shù)r(k)=1500; %期望值y(k)=-1*den(2)*y_1+num(2)*u_1+num(1)*u(k);%系統(tǒng)響應(yīng)輸出序列e(k)=r(k)-y(k); %誤差信號(hào)u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1); %系統(tǒng)PID控制器輸出序列Ee=Ee+e(k); %誤差的累加和u_1=u(k); %前一個(gè)的控制器輸出值y_1=y(k); %前一個(gè)的系統(tǒng)響應(yīng)輸出值e_1=e(k); %前一個(gè)誤差信號(hào)的值 end %(僅繪制過(guò)渡過(guò)程的曲線,x坐標(biāo)限制為[0,1]) p1=plot(time,r,'-.');xlim([0,1]);hold on;%指令信號(hào)的曲線(即期望輸入) p2=plot(time,y,'--');xlim([0,1]);%不含積分分離的PID曲線 hold on;

    輸出的PID控制曲線如下:

    3.比較PID輸出,分析參數(shù)產(chǎn)生的影響

    一個(gè)基本的PID就完成了。下面如果我們想要知道修改PID的三個(gè)參數(shù)kp,ki,kd會(huì)帶來(lái)什么效果,只需要在程序中修改即可。為了方便起見(jiàn),我們建立一個(gè)PID的數(shù)組,kp,ki,kd每次都取數(shù)組的一個(gè)值,然后設(shè)定一個(gè)大循環(huán)開(kāi)始循環(huán)仿真。再利用subplot輸出子圖的方式將所有的PID效果都輸出到一個(gè)圖進(jìn)行對(duì)比。該代碼根據(jù)上述代碼修改已經(jīng)很容易,PID比較圖的代碼如下:

    close all PID=[0.22,0.13,0;0.4,0.13,0;0.4,0.25,0;0.8,0.23,0.4;0.8,0.2,1;0.7,0.2,0.9];%初始化PID參數(shù) for pid=1:1:6 ts=0.005; %采樣時(shí)間=0.005s sys=tf(0.998,[0.021,1]); %建立被控對(duì)象傳遞函數(shù),即式4.1 dsys=c2d(sys,ts,'z'); %離散化 [num,den]=tfdata(dsys,'v'); % e_1=0; %前一時(shí)刻的偏差 Ee=0; %累積偏差 u_1=0.0; %前一時(shí)刻的控制量 y_1=0; %前一時(shí)刻的輸出 %PID參數(shù) kp=PID(pid,1); ki=PID(pid,2); kd=PID(pid,3); u=zeros(1,1000); time=zeros(1,1000); for k=1:1:1000time(k)=k*ts; %時(shí)間參數(shù)r(k)=1500; %給定量y(k)=-1*den(2)*y_1+num(2)*u_1+num(1)*u(k);e(k)=r(k)-y(k); %偏差u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1); Ee=Ee+e(k); u_1=u(k); y_1=y(k); e_1=e(k); end subplot(2,3,pid); p1=plot(time,r,'-.');xlim([0,1]);hold on; p2=plot(time,y,'--');xlim([0,1]); title(['Kp=',num2str(kp),' Ki=',num2str(ki),' Kd= ',num2str(kd)]); hold on; end

    輸出的子圖矩陣如下:

    可以發(fā)現(xiàn),修改Kp會(huì)造成上升時(shí)間的縮短,但是有可能也會(huì)帶來(lái)較大的超調(diào)。積分的增加是一個(gè)嚴(yán)重的滯后環(huán)節(jié),會(huì)減小相位裕度,也會(huì)帶來(lái)超調(diào)(超調(diào)量并不是絕對(duì)的,相對(duì)于較小的Kp可能會(huì)產(chǎn)生較大的超調(diào),而Kp較大時(shí)超調(diào)會(huì)減小(例如第一行的1圖和2圖的對(duì)比))。然而積分的引入也是必要的,否則將會(huì)很長(zhǎng)時(shí)間無(wú)法削弱誤差e(k)(例如第二行第二個(gè)圖)。微分的引入相當(dāng)于一個(gè)超前校正,會(huì)減少超調(diào),但是過(guò)渡的微分很可能會(huì)造成尾部振蕩,系統(tǒng)逐漸變得不穩(wěn)定。因此微分和積分之間需要一個(gè)平衡,當(dāng)滿足這個(gè)平衡的時(shí)候,系統(tǒng)幾乎沒(méi)有振蕩,同時(shí)響應(yīng)速度也較快。(第一行的圖3是積分過(guò)多,產(chǎn)生超調(diào),第二行的圖1和圖3就比較理想)
    綜合上述,PID的調(diào)節(jié)經(jīng)驗(yàn)可以歸結(jié)為以下幾點(diǎn):

    • Kp較小時(shí),系統(tǒng)對(duì)微分和積分環(huán)節(jié)的引入較為敏感,積分會(huì)引起超調(diào),微分可能會(huì)引起振蕩,而振蕩劇烈的時(shí)候超鐵也會(huì)增加。
    • Kp增大時(shí),積分環(huán)節(jié)由于滯后產(chǎn)生的超調(diào)逐漸減小,此時(shí)如果想要繼續(xù)減少超調(diào)可以適當(dāng)引入微分環(huán)節(jié)。繼續(xù)增大Kp系統(tǒng)可能會(huì)不太穩(wěn)定,因此在增加Kp的同時(shí)引入Kd減小超調(diào),可以保證在Kp不是很大的情況下也能取得較好的穩(wěn)態(tài)特性和動(dòng)態(tài)性能。
    • Kp較小時(shí),積分環(huán)節(jié)不宜過(guò)大,Kp較大時(shí)積分環(huán)節(jié)也不宜過(guò)小(否則調(diào)節(jié)時(shí)間會(huì)非常地長(zhǎng)),在下面這個(gè)例子中我們還會(huì)介紹到,當(dāng)使用分段PID,在恰當(dāng)?shù)臈l件下分離積分,可以取得更好的控制效果。原因在于在穩(wěn)態(tài)誤差即將滿足要求時(shí),消除了系統(tǒng)的滯后。因此系統(tǒng)超調(diào)會(huì)明顯減少。本例中采樣的抗積分飽和的方法是遇限削弱積分法。

    4.改進(jìn)PID算法(遇限削弱積分法)

    遇限削弱積分法的原理是
    當(dāng)u(k)>umaxu(k)>u_{max}u(k)>umax?時(shí),若e(k)>0即輸出值還未到達(dá)指定值,則認(rèn)為積分會(huì)帶來(lái)滯后,不再積分。
    當(dāng)u(k)<0u(k)<0u(k)<0時(shí),若e(k)<0即輸出值超過(guò)了指定值,則認(rèn)為積分會(huì)帶來(lái)滯后,不再積分。
    在本案例中認(rèn)為umax=r(k)u_{max}=r(k)umax?=r(k)
    改進(jìn)PID算法如下(需要些兩個(gè)循環(huán),當(dāng)然也可以用一個(gè)循環(huán),將其中的PID設(shè)為一個(gè)子過(guò)程調(diào)用):

    close all ts=0.005; %采樣時(shí)間=0.005s sys=tf(0.998,[0.021,1]); %建立被控對(duì)象傳遞函數(shù),即式4.1 dsys=c2d(sys,ts,'z'); %離散化 [num,den]=tfdata(dsys,'v'); % e_1=0; %前一時(shí)刻的偏差 Ee=0; %累積偏差 u_1=0.0; %前一時(shí)刻的控制量 y_1=0; %前一時(shí)刻的輸出 %PID參數(shù) kp=0.22; ki=0.13; kd=0; u=zeros(1,1000); time=zeros(1,1000); for k=1:1:1000time(k)=k*ts; %時(shí)間參數(shù)r(k)=1500; %給定量y(k)=-1*den(2)*y_1+num(2)*u_1+num(1)*u(k);e(k)=r(k)-y(k); %偏差u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1); Ee=Ee+e(k); u_1=u(k); y_1=y(k); e_1=e(k); end p1=plot(time,r,'-.');xlim([0,1]);hold on; p2=plot(time,y,'--');xlim([0,1]); hold on; a=1;%控制積分分離的二值數(shù) e_1=0;Ee=0;u_1=0.0;y_1=0;%重新初始化 for k=1:1:1000time(k)=k*ts; %時(shí)間參數(shù)r(k)=1500; %給定量y(k)=-1*den(2)*y_1+num(2)*u_1;e(k)=r(k)-y(k); %偏差u(k)=kp*e(k)+ki*Ee+kd*(e(k)-e_1); if ((u(k)>r(k)) && (e(k)>0))||((u(k)<0) && (e(k)<0))a=0;else a=1;end Ee=Ee+a*e(k); u_1=u(k); y_1=y(k); e_1=e(k); end p3=plot(time,y,'-');xlim([0,1]); title('含積分分離與不含積分分離的對(duì)比'); legend([p1,p2,p3],'指令信號(hào)','不含積分分離','含積分分離');

    輸出的曲線對(duì)比圖如下:

    可以發(fā)現(xiàn),系統(tǒng)的超調(diào)量明顯減少了,調(diào)節(jié)時(shí)間也減少了一點(diǎn)。原因在于我們采用了分段PID的手段,既消除了穩(wěn)態(tài)誤差還削弱了積分環(huán)節(jié)帶來(lái)的滯后影響。

    5.simulink仿真

    需要的模塊名稱(不區(qū)分大小寫(xiě))如下:

    • gain(參數(shù)分別為0.22和0.13/0.005)
    • sum(參數(shù)分別為"|±"和"|++")
    • integrator
    • scope
      注意:本文使用的是離散PID仿真,而simulink使用的是連續(xù)系統(tǒng)仿真,轉(zhuǎn)換PID參數(shù)時(shí)P參數(shù)不變,I參數(shù)應(yīng)該除以仿真間隔Ts=0.005,D參數(shù)應(yīng)該乘Ts。

    以表中第一組PI參數(shù)為例:

    得到的示波器曲線如下:

    希望本文對(duì)您有幫助,謝謝閱讀。

    總結(jié)

    以上是生活随笔為你收集整理的Matlab仿真PID控制(带M文件、simulink截图和参数分析)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。