1.軟體版本
matlab2017b
2.系統概述
·PID控制器:
PID控制器(比例-積分-微分控制器),由比例單元 P、積分單元 I 和微分單元 D 組成。通過Kp, Ki和Kd三個參數的設定。PID控制器主要适用于基本線性和動态特性不随時間變化的系統。
PID 控制器的方塊圖PID 控制器是一個在工業控制應用中常見的回報回路部件。這個控制器把收集到的資料和一個參考值進行比較,然後把這個差别用于計算新的輸入值,這個新的輸入值的目的是可以讓系統的資料達到或者保持在參考值。和其他簡單的控制運算不同,PID控制器可以根據曆史資料和差别的出現率來調整輸入值,這樣可以使系統更加準确,更加穩定。可以通過數學的方法證明,在其他控制方法導緻系統有穩定誤差或過程反複的情況下,一個PID回報回路卻可以保持系統的穩定。
PID控制的基本原理和常用形式及數學模型:
具有比例-積分-微分控制規律的控制器,稱PID控制器。這種組合具有三種基本規律各自的特點,其運動方程為:
PID控制的結構圖為:
由此可見,當利用PID控制器進行串聯校正時,除可使系統的型别提高一級外,還将提供兩個負實零點。與PI控制器相比,PID控制器除了同樣具有提高系統的穩态性能的優點外,還多提供一個負實零點,進而在提高系統動态性能方面,具有更大的優越性。是以,在工業過程控制系統中,廣泛使用PID控制器。PID控制器各部分參數的選擇,在系統現場調試中最後确定。通常,應使積分部分發生在系統頻率特性的低頻段,以提高系統的穩态性能;而使微分部分發生在系統頻率特性的中頻段,以改善系統的動态性能。
·H無窮控制器:
H∞控制是一種具有很好魯棒性的設計方法,具有設計思想明确、控制效果好等優點,尤其适用于模型攝動的多輸入多輸出(MIMO)系統。H∞控制在控制理論、設計方法及應用等方面,經過多年不斷發展和完善,已成為一種具有較完整體系的魯棒控制理論。為适應控制系統穩定性、自适應性、智能化及工程化的更高要求,基于線性矩陣不等式(LMI)的H∞控制、非線性H∞控制以及H∞控制與神經網絡和模糊控制結合,成為近年來H∞控制研究的熱點。随着H∞控制研究的深入,其存在的諸如理論複雜、計算量大和參數攝動範圍有限等問題将會逐漸得到解決,适用範圍也會更廣、應用前景會更好。
3.部分程式
程式設計部分主要分為四個部分:
第一個是伺服電機
第二個是H無窮控制器
第三個是用來對對比的PID控制器
第四個是GUI界面(封裝之後成toolkit進行調用)
最後編寫的m檔案一共分如下幾個部分:
基于PID控制的伺服電機系統
基于H無窮控制的伺服電機系統
封裝後成為toolkit之後的GUI界面系統。
一個伺服系統,其主要涉及到的對象參數為:
Ku:功率放大器的放大系數
R:電樞電阻
Km:電動機力矩系數
Ce:電壓回報系數
J:轉動慣量
theta:轉速
r:指令信号
u:控制輸入
F:驅動力
完整的伺服模型如下所示:
clc;
clear all;
close all;
warning off;
%步驟一:定義模型
ts = 0.001;
J = 0.05;
q = 0.1;
sys = tf(1,[J,q,0]);
dsys = c2d(sys,ts,'z');
[num,den] = tfdata(dsys,'v');
%步驟二:權值函數的選擇
G = sys/10000000;
%權重函數1
nw1 = [0.25,1 ,0.5];
dw1 = [0.9 ,1.7,0.4];
[m1,p1,w1]= bode(tf(nw1,dw1));
%權重函數2
nw2 = [1,0,0];
dw2 = [0,0,300];
[m2,p2,w2]= bode(tf(nw2,dw2));
figure;
subplot(211);
semilogx(w1,20*log10(m1(:)));
title('Weight function 1');
subplot(212);
semilogx(w2,20*log10(m2(:)));
title('Weight function 2');
%步驟三:H無窮最優選擇
[a,b,c,d] = tf2ss(num,den);
s = mksys(a,b,c,d);
w1 = [nw1;dw1];
w2 = [nw2;dw2];
Tss = augtf(s,w1,[],w2);
[gg,cFopt,ccL] = hinfopt(Tss);
disp('the opt gamma value:');
gg
[af,bf,cf,df] = branch(cFopt);
Gc = zpk(ss(af,bf,cf,df));
G0 = G*Gc;
Gc1 = feedback(G0,1);
%步驟四:測試
t = 0:0.1:100;
y = step(Gc1,t);
figure;
time = 1/length(t):1/length(t):1;
plot(time,y);
grid on;