我不确定为什么这段代码不起作用:
if true
%% PID Test file
% Start the script
clear
clc
kp = 180;
kI = 3200;
kD = 1;
start_time = 0;
step_time = 1;
end_time = 2;
Ts = 0.1;% Sample Time
step_value = 1;
initial_value = 0;
Fn = 50;
W = 2*pi*Fn;
Phase = 0;
Amp = 1;
steps = 1;
if steps
[t,y] = step_fun(start_time,step_time,end_time,Ts,step_value,initial_value);
sim('PID_Test_sim.mdl')
else
t = start_time:Ts:end_time;
y = sin(W*t);
sim('PID_Test_sim.mdl')
end
x_min = start_time;
x_max = end_time;
y_min = initial_value - 1;
y_max = step_value + 1;
figure();
subplot(2,1,1);
stairs(t,y);grid on;hold on; stairs(ScopeData.time,ScopeData.signals(1,2).values,'--r');hold off;%y([y_min y_max]);xlim([x_min x_max]);
subplot(2,1,2);
plot(t,y);grid on;hold on; plot(ScopeData.time,ScopeData.signals(1,2).values,'--r');hold off;%y([y_min y_max]);xlim([x_min x_max]);
Input = y;
time = t;
dt = diff(time);
D = [0,diff(Input.*kD) ./ dt]';
I = [cumtrapz(time,(Input.*kI))]';
%I = [0;(I(1:end-1)+I(2))];
I_test = I;
I_test(I_test>0) = (I(find(I>0,1,'first'))) + I(I>0);
I_test = [0,I_test(1:end-1)];
P = [Input*kp]';
Compare = ScopeData1;
figure();
subplot(3,1,1);
stairs(time,P);grid on;hold on; stairs(Compare.time,Compare.signals(1,1).values,'--r');hold off
subplot(3,1,2);
plot(time,I);grid on;hold on; plot(Compare.time,Compare.signals(1,2).values,'--r');hold off
subplot(3,1,3);
plot(time,D);grid on;hold on; plot(Compare.time,Compare.signals(1,3).values,'--r');hold off
Test = [I ScopeData1.signals(1,2).values time'];
[time,Output] = PID_fun(kp,kI,kD,Input,time,ScopeData1);
figure();
subplot(2,1,1);
stairs(t,y);grid on;hold on; stairs(ScopeData.time,ScopeData.signals(1,2).values,'--r');hold off;
subplot(2,1,2);
plot(time,Output);grid on;hold on; plot(ScopeData.time,ScopeData.signals(1,1).values,'--r');hold off;
Test = [I ScopeData1.signals(1,2).values I_test P ScopeData1.signals(1,1).values D ScopeData1.signals(1,3).values time' Output ScopeData.signals(1,1).values];
这是一个非常简单的代码,它生成一个步进信号(在step_fun中),并且sfterword运行模拟mdl,它是一个带有阶跃函数作为输入的PID控制器。然后我正在运行我的PID函数,稍后将通过变量(P,I,D)进行解释,并且在集成中我会在模拟和mfile之间产生不同的结果?你能帮我这个吗?结果是:
% code
% My integration results of the input signal when kI = 3200;
mfile simulation
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
160 0
480 320
800 640
1120 960
1440 1280
1760 1600
2080 1920
2400 2240
2720 2560
3040 2880
3360 3200
这里有一些数字与结果:
最好的问候和thx提前
答案 0 :(得分:1)
在没有看到Simulink模型的情况下很难分辨,但我怀疑在Simulink中你使用的是可变步长求解器,它可以比你的MATLAB文件花费更小的时间步长,为你提供更多准确的结果。
如果您有控制系统工具箱,我建议您使用pid
命令在MATLAB中创建PID,然后使用step
或lsim
命令来计算步骤响应而不是你的手动尝试。我的猜测是结果会更接近。
答案 1 :(得分:0)
所以最后我确实回答了我自己的问题:)
模拟采用积分点上当前的t(i-1),而cumtrapz采用当前点t(i)的积分,即不同。
作为结果我将我的cumtrapz更改为cumtrapzt,其中我计算了给定数据集(t(end-1))的diff(t)直到t(i-1)
无论如何,这是帮助