Как применить метод Эйлера для ODE 1-го порядка в реальной системе с h = dt? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть 2 ODE для вычисления в реальном времени:

x1_est'=-l1*x1_est-(Kmi*Ko/Kt)*x2_est + 0*u +l1*x1
x2_est'=-l2*x1_est-(1/Tm)*x2_est +(Km*Kt/Tm)*u +l2*x1

, где x1 считывается из arduino, и мне нужно вычислить x1_est и x2_est, чтобы

x1_est -> x1 and
x2_est -> x2

, когда я комментируюстрока >> x1old = x1new оценочное значение для x1: x1new (= x1_est), наблюдатель работает для x1_est, но никогда не работает для x2_est

ПРИМЕЧАНИЕ. Это реализация наблюдателя в теории управления, где l1, l2 даны в соответствии с тем, чтобы сделать наблюдателя достаточно быстрым (в соответствии с a1 и a2)

function [x1] = lab41(u,a1,a2)

%OBSERVER
%This function is applied to arduino
%Observer implementation assuming y,u is known
%Give u(=7), a1, a2 so as s^2 +a1*s+a2 is the desired poly of A-L*C
%Run  lab4(7,60,900)

Tm=0.507;
Kmi=1/36;
Km=306;
Kt=0.003;
Ko=0.24;

l1=a1-1/Tm
l2=((l1/Tm -a2)*(Kt)) / (Kmi*Ko)

V_7805=5.48;
Vref_arduino=5;

a=arduino('COM3');

% OUTPUT ZERO CONTROL SIGNAL TO STOP MOTOR  %
analogWrite(a,6,0);
analogWrite(a,9,0);

positionData = [];
velocityData = [];
positionEstData = [];
velocityEstData = [];
timeData = [];

timeData = [timeData 0];
positionEstData = [positionEstData 0]; %INITIAL VALUE = 0
velocityEstData = [velocityEstData 0]; %INITIAL VALUE = 0

close all
disp(['Connect cable from Arduino to Input Power Amplifier and then press enter to start controller']);
pause()

%START CLOCK RUN THE LOOP FOR 5sec
t=0;
tic
%------------------------------------------START LOOP-------------------------------------------------------
while(t<5)

velocity=analogRead(a,3);
position=analogRead(a,5);
t=toc;
x1=3*Vref_arduino*position/1024; %REAL POSITION & OUTPUT y
x2=2*(2*velocity*Vref_arduino/1024- V_7805); %REAL VELOCITY
y=x1;

x1_est=(t-timeData(end)) * (-l1*positionEstData(end) - Kmi*Ko*velocityEstData(end)/Kt + 0*u + l1*y) + positionEstData(end);       %POSITION ESTIMATION VIA EULERS METHOD
x2_est=(t-timeData(end)) * (-l2*positionEstData(end) - velocityEstData(end)/Tm + Km*Kt*u/Tm + l2*y) + positionEstData(end);      %VELOCITY ESTIMATION VIA EULERS METHOD

%Write u to arduino u=7 >0
analogWrite(a,6,0);
analogWrite(a,9,min(round(u/2*255/ Vref_arduino) , 255));


timeData = [timeData t];
positionData = [positionData x1]; %REAL X1
velocityData = [velocityData x2]; %REAL X2
positionEstData = [positionEstData x1_est]; %ESTIMATED X1
velocityEstData = [velocityEstData x2_est]; %ESTIMATED X2

end
%---------------------------------------END LOOP-------------------------------------------------------

disp(['End of control Loop. Press enter to see diagramms']);
pause()

% OUTPUT ZERO CONTROL SIGNAL TO STOP MOTOR  %
analogWrite(a,6,0);
analogWrite(a,9,0);

figure
plot(timeData,positionData,'-r',   timeData,positionEstData,':b');
legend('x1','x1_{est}')
xlabel('Time(sec)')

figure
plot(timeData,velocityData,'-r',   timeData,velocityEstData,':b');
legend('x2','x2_{est}')
xlabel('Time(sec)')


disp('Disonnect cable from Arduino to Input Power Amplifier and then press enter to stop controller');
pause();

ПРИМЕЧАНИЕ2: у меня есть дополнительные переменные, которые не нужны для того, чтобы сделать мой код читабельным

...