%PID Controller

clear all;

close all;

ts=0.001; %采样时间=0.001s 

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]'; %PID的3个参数Kp Ki Kd组成的数组

error_1=0; %初始误差 

for k=1:1:500

time(k)=k*ts; % 仿真时间500ms

S=3;

if S==1

kp=0.50;ki=0.001;kd=0.001;

yd(k)=1; %Step Signal 指令为阶跃信号

elseif S==2

kp=0.50;ki=0.001;kd=0.001;

yd(k)=sign(sin(2*2*pi*k*ts)); %Square Wave Signal 指令为方波信号

elseif S==3

kp=1.5;ki=1.0;kd=0.01; %Sine Signal 指令为正弦信号

yd(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

y(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)=yd(k)-y(k);

%Return of parameters %返回pid参数 

u_3=u_2;u_2=u_1;u_1=u(k);

y_3=y_2;y_2=y_1;y_1=y(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,yd,'r',time,y,'k:','linewidth',2);

xlabel('time(s)');ylabel('yd,y');

legend('Ideal position signal','Position tracking');

ts=0.001;采样时间=0.001s sys=tf(400,[1,50,0]);建立被控对象传递函数 dsys=c2d(sys,ts,'z');把传递函数离散化(问题1) [num,den]=tfdata(dsys,'v');离散化后提取分子、分母

rin=1.0;输入为阶跃信号 u_1=0.0; u_2=0.0; 什么东西的初始状态(问题2) y_1=0.0; y_2=0.0; 是不是输出的初始状态 error_1=0;初始误差 x=[0 0 0]';PID的3个参数Kp Ki Kd组成的数组 p=100;仿真时间100ms

for k=1:1:p r(k)=rin; u(k)=kpidi(1)*x(1)+kpidi(2)*x(2)+kpidi(3)*x(3)

if u(k)>=10 u(k)=10; end

if u(k)<=-10 u(k)=-10; end

yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;(问题3) error(k)=r(k)-yout(k);

%返回pid参数 u_2=u_1;u_1=u(k); y_2=y_1;y_1=yout(k);

x(1)=error(k); x(2)=(error(k)-error_1)/ts; x(3)=x(3)+error(k)*ts;

error_2=error_1; error_1=error(k); end 问题1:把传递函数离散化[SYSD,G]=C2D(SYSC,Ts,METHOD)这里面的method有好多种,而且用的method不一样得出的结果也不一样,这些参数究竟有什么区别? 问题2:这些是不是PID控制器输出的初始状态,“rin--①--PID控制器--②--被控对象--③---”是不是就是上面②的地方的信号值? 问题3(关键问题):这个式子是怎么得出来的?从传递函数得出差分方程是个什么步骤,要具体点的或者给本参考书。 又如:在《先进PID控制MATLAB仿真(第二版)》P146有 被控对象G(s)=133/(s^2+25s),采样时间为1ms,采用z变换进行离散化,经过z变换后的离散化对象为yout(k)=-den(2)yout(k-1)—den(3)yout(k-2)十num(2)u(k-1)+num(3)u(k-2)(实在是搞不明白怎么来的) 问题4:不是线性的对象可不可以写成差分方程的形式,比如G(s)=20e^(-0.02s)/(1.6s^2+4.4s+1)带了个纯延迟的该怎么弄。或者换成个3阶对象怎么写成差分方程 最佳答案 1、c2d:假设在输入端有一个零阶保持器,把连续时间的状态空间模型转到离散时间状态空间模型。 [SYSD,G]=C2D(SYSC,Ts,METHOD)里面的method包括: zoh 零阶保持, 假设控制输入在采样周期内为常值,为默认值。 foh 一阶保持器,假设控制输入在采样周期内为线性。 tustin 采用双线性逼近。 matched 采用SISO系统的零极点匹配法 2、只有U_1是2处的初始状态值,而U_2是用来传递U(k)的,所以U_2是U_1在下一个ts时间内的值 3、从差分方程获取传递函数: y(k)+a1y(k-1)+……+any(k-n)=b0x(k)+b1x(k-1)+……+bmx(k-m)在零初始条件下对,对方程两边进行Z变换,得到该系统的脉冲传递函数G(Z)=Y(Z)/X(Z)=[b0z^m+b1z^(m-1)+……+bm]z^n/[z^n+a1z^(n-1)+……an]z^m 其中m《n 或等效形式G(Z)=Y(Z)/X(Z)=[b0+b1z^(-1)+……+bmz^(-m)]/[1+a1z^(-1)+……anz^(-n)] 其中m《n

从脉冲传递函数到差分方程 G(Z)=Y(Z)/X(Z)=[b0+b1z^(-1)+……+bmz^(-m)]/[1+a1z^(-1)+……anz^(-n)] 其中m《n,交叉相乘得Y(Z)[1+a1z^(-1)+……anz^(-n)]=X(Z)[b0+b1z^(-1)+……+bmz^(-m)]对X(z)和Y(z)进行z逆变换得到差分方程y(k)+a1y(k-1)+……+any(k-n)=b0x(k)+b1x(k-1)+……+bmx(k-m) http://218.6.168.52/wlxt/ncourse/jsjkzjs/web/ppt/ch4.files/frame.htm 4、纯延迟系统G(s)=20e^(-0.02s)/(1.6s^2+4.4s+1) num=[20]; den=[1.6 4.4 1]; sys=tf(num,den,'inputdelay',0.02)

离散模糊控制MATLAB程序

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: