智慧控制基礎實驗3:數字PID控制
一、實驗目的
1.掌握數字PID控制的程式設計方法
2.實現連續系統與離散系統PID控制的MATLAB程式設計
二、實驗原理
PID控制器是一種線性控制器,它根據給定值r(t)與實際輸出值c(t)構成偏差:e(t)=r(t)-c(t)。將偏差的比例§、積分(I)和微分(D)通過線性組合構成控制量,對受控物件進行控制。PID控制系統結構框圖下圖所示。
PID控制系統結構框圖
為系統的輸入訊號,為系統的輸出,控制器的輸出訊號。
其控制規律為:
KP是比例係數,KI是積分常數,KD是微分常數。
PID控制器由比例(P)環節、積分(I)環節和微分(D)環節組合而成。比例(P)環節:將控制系統的給定輸入與系統反饋所形成的偏差訊號成比例的放大,偏差一旦產生,控制器立即產生控制作用,以減少偏差。比例環節能夠提高控制系統的響應速度,增大比例係數KP,可以加快調節,但KP過大,控制系統會產生較大的超調,甚至導致系統不穩定。積分(I)環節:主要是消除系統的靜態誤差,提高系統的無差度,同時提高控制系統的響應速度。積分作用的強弱取決於積分常數KI,積分常數KI越大,積分作用越強,反之則越弱。微分(D)環節:反映偏差訊號的變化率,調節誤差的微分輸出,能夠在系統誤差突變時,在系統中引入一個有效的早期修正訊號,以加快系統的動作速度,減少調節時間,從而改善系統的動態效能。
三、實驗內容
1.連續系統的數字 PID 控制模擬:
假設被控物件為電機模型,其傳遞函式為,其中 。輸入訊號為,採用PID控制,請根據如下程式碼選擇合適的KP、KD引數,使得跟蹤曲線誤差儘可能小,並記錄最小誤差情況下的KP和KD值。
2.設被控物件為
取樣時間為1ms,對其進行離散化。針對離散系統的階躍訊號、正弦訊號和方波訊號的位置響應,設計離散PID控制器。其中S為訊號選擇變數,S=1是階躍跟蹤,S=2是方波跟蹤,S=3是正弦跟蹤。請根據如下程式碼選擇合適的Kp、Ki、Kd引數,觀察三組訊號跟蹤曲線響應速度、超調量和穩態誤差的變化,選擇最好的一組跟蹤效果最好階躍跟蹤、方波跟蹤和正弦跟蹤曲線,並記錄下各自對應的Kp、Ki、Kd值。
四、實驗過程
1.數字PID控制模擬
(1)首先新建函式檔案,用於建立連續函式物件的微分方程函式
(2)初始化介面如圖
(3)將指導書中提供的程式碼貼上到檔案中
function dy=chap1_1f(t,y,flag,para)
u=para;
J=0.0067;B=0.1;
dy=zeros(2,1);
dy(1) = y(2);
dy(2) = -(B/J)*y(2) + (1/J)*u;
(4)儲存,檔案型別為m檔案,注意需要放到環境路徑資料夾,或者將資料夾路徑設定為環境路徑
(5)將指導書中的主程式程式碼複製到命令列視窗中並執行
% chap1_1.m
%Discrete PID control for continuous plant
clear all;
close all;
ts=0.001; %Sampling time
xk=zeros(2,1);
e_1=0;
u_1=0;
for k=1:1:2000
time(k) = k*ts;
rin(k)=0.50*sin(1*2*pi*k*ts);
para=u_1; % D/A
tSpan=[0 ts];
[tt,xx]=ode45('chap1_1f',tSpan,xk,[],para);
xk = xx(length(xx),:); % A/D
yout(k)=xk(1);
e(k)=rin(k)-yout(k);
de(k)=(e(k)-e_1)/ts;
u(k)=KP*e(k)+KD*de(k);
%Control limit
if u(k)>10.0
u(k)=10.0;
end
if u(k)<-10.0
u(k)=-10.0;
end
u_1=u(k);
e_1=e(k);
end
figure(1);
plot(time,rin,'r',time,yout,'b');
xlabel('time(s)'),ylabel('rin,yout');
figure(2);
plot(time,rin-yout,'r');
xlabel('time(s)'),ylabel('error');
(6)產生如圖報錯
(7)修改程式碼中KP,KD的值,令KP=20,KD=0.5
(8)執行後得到影像如圖,此時KP=20,KD=0.5
(9)分析:輸出跟隨輸入,PD控制中,微分控制可以改善動態效能,調節時間縮短,允許加大比例控制,使穩態誤差減小,提高了控制精度
2.被控物件
(1)在主程式中新增KP,KI,KD的具體數值
(2)令KP=1.5,KI=2,KD=0.05
% chap1_1.m
%Discrete PID control for continuous plant
clear all;
close all;
ts=0.001;
sys=tf(5.235e005,[1,87.35,1.047e004,0]);
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]';
error_1=0;
for k=1:1:1500
time(k)=k*ts;
%S=input('?s= ');%
S=1;
if S==1
kp=1.5;ki=2;kd=0.05;
rin(k)=1; %Step Signal
elseif S==2
kp=1.5;ki=2;kd=0.05;
rin(k)=sign(sin(2*2*pi*k*ts)); %Square Wave Signal
elseif S==3
kp=1.5;ki=2;kd=0.05; %Sine Signal
rin(k)=0.5*sin(2*2*pi*k*ts);
end
u(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller
%Restricting the output of controller
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Linear model
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;
error(k)=rin(k)-yout(k);
%Return of parameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
x(1)=error(k); %Calculating P
x(2)=(error(k)-error_1)/ts; %Calculating D
x(3)=x(3)+error(k)*ts; %Calculating I
error_1=error(k);
end
figure(1);
plot(time,rin,'k',time,yout,'k');
xlabel('time(s)'),ylabel('rin,yout');
(3)執行主程式,結果如下
相關文章
- 智慧控制基礎實驗2:根軌跡分析法
- PID 控制詳解
- pid 控制演算法演算法
- Flutter第3天--基礎控制元件(上)Flutter控制元件
- C#實驗3--基本控制結構C#
- Java核心基礎第3篇-Java流程控制Java
- flutter初體驗之基礎控制元件知識Flutter控制元件
- 基於GA遺傳最佳化的PID控制器最優控制引數整定matlab模擬Matlab
- Oracle控制檔案基礎Oracle
- Flex的數字控制元件Flex控制元件
- TCP擁塞控制之基礎TCP
- Java基礎之邏輯控制Java
- 【Java基礎】:執行緒控制Java執行緒
- javascript基礎(控制流程(if,switch))(十一)JavaScript
- 基礎控制元件詳解控制元件
- 廣告成本控制-PID演算法演算法
- Unity3D 基礎自學學習筆記(二) Unity3D 基礎控制元件Unity3D筆記控制元件
- HTML input number 數字控制元件HTML控制元件
- Java基礎 - 流程控制語句Java
- Go 基礎教程--5 控制語句Go
- Linux基礎命令---sysctl核心控制Linux
- WIN32 控制元件基礎Win32控制元件
- 09-JavaScript基礎-流程控制-ifJavaScript
- Rails控制器及路由基礎AI路由
- .NET基礎之DataList控制元件控制元件
- QML::自繪基礎控制元件控制元件
- java基礎_05_流程控制Java
- Python基礎篇(流程控制)Python
- 基礎實驗
- oracle實驗記錄 (恢復-關於控制檔案(3))Oracle
- jmeter基礎邏輯控制器之ForEach控制器JMeter
- JS控制input僅能輸入數字JS
- js控制只允許輸入數字JS
- matlab模糊控制工具箱使用和模糊控制pid例項參考Matlab
- 【Java基礎知識】Java流程控制Java
- Thinkphp5基礎——08 控制器PHP
- 二.JS基礎-流程控制-xmind圖JS
- Go基礎系列:流程控制結構Go