|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
用matlab编了一个微分先行的PID控制,我理解是PI对偏差作用,D只对输出起作用,PID的参数整定,我使用ZN整定4:1得到PID参数,结果得到的控制效果比普通的PID控制差。而且将输入延时时间由2改为5后,效果也是相当差,鲁棒性很差。
. f$ t4 d0 |- F# \! A
2 @3 }3 G7 \' R2 |, A%清除变量,关闭其它窗口6 B: }$ C% N. r& @
clear all;. C6 }$ E4 l% X2 R0 A6 ~
%close all;9 `, O! S% A3 M& F) W- N
%定义对象与取样时间2 z. c! ^" E$ W8 i- Y
ts=1; %定义取样时间
. y9 K8 n! m4 ]2 |* N6 {3 O zsys=tf(4*[2.6,1],conv([34.3,1],[6.5,1]),'inputdelay',2); %被控对象模型
}$ L% ~# L I4 E1 Xdsys=c2d(sys,ts,'zoh'); %离散化
3 s. ^$ w( i& C8 r: l' ]6 _5 }[num,den]=tfdata(dsys,'v'); %取出对象的模型参数# K- Y# y2 n0 y P. }% O
%初始化变量5 q. Q6 o% d& T- D' z* ^
u_1=0;u_2=0;u_3=0;u_4=0;8 i. q1 p7 W& O( Z# M' X% v
u_5=0;u_6=0;u_7=0;' G1 O& ^/ O3 I- a# y; i" x4 |
ud_1=0;$ V+ s8 {0 Z( n9 ~* K
y_1=0;y_2=0;# e, O# ?5 m/ O1 C: I
sum_err=0;, R4 J1 e& `8 @
rin=0.98;
7 Z, S1 |' p* \7 H' B$ O% p* d%参数给定
) F' U5 h- a/ Ikm=5.29;wm=17;; u1 C; I+ I& ^7 b) Q# `; u
kp=km/1.7;ki=2*kp/wm-0.22;kd=kp*0.13*wm; %此处由于超调较大,把ki减小了
( h0 Q% h6 j" E3 k) O4 T%进入仿真0 d* `( L! E8 p: F. W7 y! r1 |- o
for k=1:1:400
* F1 b: R/ K8 w, c* ]% P time(k)=k*ts;
- S4 o7 {9 `! B8 u+ F yout(k)=-den(3)*y_2-den(2)*y_1+num(2)*u_3+num(3)*u_4;
, Q3 D% \+ U# G: Z% Y8 J! m% r0 @3 b error(k)=rin-yout(k);
/ ]) z1 K2 {1 b6 \# t H sum_err=sum_err+error(k)*ts;
) `2 v! a- q9 F' @, k- Y8 l + K8 g% n/ k' c7 y1 y+ c
%计算控制器输出值u
+ D- s7 u: y4 }/ [, m' y ud(k)=kd*(yout(k)-y_1)/ts; %计算D作用输出后的输出9 y3 h K8 S: g1 w: [+ W( O/ |* o
u(k)=kp*error(k)+ki*sum_err-ud(k);
: J7 w! D; Q$ C%限制控制器的输出值
* \9 L# U' x3 } |5 v if u(k)>=110% [8 r' f' S6 }2 h( ]- i$ ^
u(k)=110;$ v8 e0 K/ E& _' J' ~3 F+ X
end5 V: i1 g' D+ `, k: z
if u(k)<=-110
9 I, z% U! m% X' u2 o, s u(k)=-110;
% Y" X7 a( V4 Z6 T, x/ A end* a6 N3 q- v* ?; v( H
$ t' f* \1 G( `$ `" Q% b; @+ _%更新参数
6 a- D5 U$ L8 J1 p5 ^1 `: K2 O+ Vy_2=y_1;y_1=yout(k); | n& b7 V4 L/ w9 A: o
u_7=u_6;u_6=u_5;u_5=u_4;& I6 q& F3 c) }5 B, u- U7 y' V
u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);
; m' h0 G3 e7 v# {end
2 K- q, N! n( c6 \2 [4 A9 H/ Cfigure(1);
7 t7 q5 T" c; u, ]5 Tplot(time,rin,'r',time,yout,'b');
1 {5 L' t8 S# `2 ]$ U/ Zxlabel('时间');ylabel('设定值,输出值');0 V" ~# f. f7 V& _$ C2 [
|
|