Implement PID in ode45 code

64 visualizaciones (últimos 30 días)
Kashish Pilyal el 16 de Ag. de 2022
Comentada: Kashish Pilyal el 17 de Ag. de 2022
So, I have a ode45 function and I have an error defined in it which changes at different iterations of the solver. I was able to define the derivative part by just differentiating the error formula but I am unable to implement the integral part. The error expression is:
, where q represents position and v represents velocity. Is it possible to get the PID part in the ode function.
0 comentariosMostrar -2 comentarios más antiguosOcultar -2 comentarios más antiguos

Iniciar sesión para comentar.

Sam Chak el 16 de Ag. de 2022
Editada: Sam Chak el 17 de Ag. de 2022
If the error is defined as
then
P part is
I part is
D part is
and you can arrange then in the state-space form. For example, a Double Integrator system
can be rewritten in state-space as:
.
The PID has 3 terms, and the state-space is in differential form. So you have no issue with the P and the D part, because they are part of the state variables. The I part is in integral form, so you have to create an additional state variable. See Example below:
[t, x] = ode45(@DIsystem, [0 20], [0; 0; 0]);
plot(t, x(:,1), 'linewidth', 1.5)
grid on, xlabel('t'), ylabel('y(t)'), % ylim([-0.2 1.2])
function dxdt = DIsystem(t, x)
dxdt = zeros(3, 1);
% construction of PID
r = 1; % reference signal
e = x(1) - r; % error signal
Kp = 1 + sqrt(2); % proportional gain
Ki = 1; % integral gain
Kd = 1 + sqrt(2); % derivative gain
u = - Kp*e - Ki*x(3) - Kd*x(2); % the PID thing
% the dynamics
A = [0 1; 0 0]; % state matrix
B = [0; 1]; % input matrix
dxdt(1:2) = A*[x(1); x(2)] + B*u; % the Double Integrator system
dxdt(3) = e; % for integral action in PID
end
3 comentariosMostrar 1 comentario más antiguoOcultar 1 comentario más antiguo
Sam Chak el 17 de Ag. de 2022
I have provided an example in the Answer using a Double Integrator system:
You will get the idea of how to implement that. Hope it works out for your system.
Kashish Pilyal el 17 de Ag. de 2022
Thanks I got the idea, in my case I have the error:
e_1=x(1)-( x(4)+(h_i*x(5)) );
So, If I am right I need to introduce a new state which I will be equal to this error at the end of every iteration like you did with dxdt=x(3) and in the next iteration use this state as the integral of the error.

Iniciar sesión para comentar.

Categorías

Más información sobre PID Controller Tuning en Help Center y File Exchange.

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by