⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pidp96.m

📁 一个模糊pid算法的源程序
💻 M
字号:
%可以运行, 但结果图好像不对


%Expert PID Controller
clear all;
close all;
ts=0.001;

sys=tf(5.235e005, [1, 87.35, 1.047e004, 0]);
dsys=c2d(sys, ts, 'z'); %怎么Help出来的没有z, 只有一个zoh- 零阶保持器
[num, den] = tfdata(dsys, 'v'); %以降序得到离散系统的分子分母

u_1=0.0; u_2=0.0; u_3=0.0;
y_1=0;   y_2=0;   y_3=0;

x=[0,0,0]';

x2_1=0;

kp=0.6; ki=0.03; kd=0.01; 		%PID参数

error_1=0;
for k=1:1:500
	time(k)=k*ts;

rin(k)=1.0; 					%Tracing Jieyue Signal

u(k) = kp*x(1) + kd*x(2) + ki*x(3); %PID Controller

%Expert control rule
if abs(x(1)) > 0.8 				%Rule1: Unclosed control firstly
	u(k) = 0.45; 
elseif abs(x(1)) > 0.40
	u(k) = 0.40;
elseif abs(x(1)) > 0.20
	u(k) = 0.12;
elseif abs(x(1)) > 0.01
	u(k) = 0.10;
end

if x(1) * x(2) > 0 | (x(2) == 0) %Rule2
	if abs(x(1)) >= 0.05
		u(k) = u_1 + 2*kp*x(1);
	else
		u(k) = u_1 + 0.4*kp*x(1);
	end
end

if (x(1) *x(2) < 0&x(2) * x2_1 > 0) | (x(1) == 0) %Rule3
	u(k) = u(k);
end

if x(1)*x(2) < 0&x(2)*x2_1 < 0 	%Rule4
	if abs(x(1)) >= 0.05
		u(k) = u_1 +2*kp*error_1
	else
		u(k) = u_1 + 0.6*kp*error_1;
	end
end

if abs(x(1)) <= 0.001 			%Rule5: Integration separation PI control
	u(k) = 0.5*x(1) + 0.010*x(3);
end


%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 PID 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
x2_1 = x(2);

x(2) = (error(k) - error_1)/ts; %Calculatin D
x(3) = x(3) + error(k)*ts; 		%Calculation I

errro_1 = error(k);
end

figure(1);
plot(time, rin, 'b', time, yout, 'r');
xlabel('time(s)'); ylabel('rin, yout');

figure(2);
plot(time, rin-yout, 'r');
xlabel('time(s)'); ylabel('errro');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -