PID control simulation code improvement

I’m trying to simulate the roll angle dynamics using the PID controller. I just would like to know if this code iw well-written or can be improved?
Any help will be appreciated.

%% Parameters
J = 0.03; % moment of inertia (kg*m^2)
Kp = 2;
Ki = 1;
Kd = 0.5;

dt = 0.01; % time step
T = 3; % total time
t = 0:dt:T;
N = length(t);

phi_ref_deg = 5;
phi_ref = deg2rad(phi_ref_deg);

phi = zeros(1, N);
omega = zeros(1, N);
u = zeros(1, N);
e = zeros(1, N);

I = 0;
prev_e = phi_ref – phi(1);

for k = 1:N-1

e(k) = phi_ref – phi(k);

I = I + e(k)*dt;
D = (e(k) – prev_e)/dt;

% PID control
u(k) = Kp*e(k) + Ki*I + Kd*D;

% Dynamics: J*phi_ddot = u
phi_ddot = u(k)/J;

omega(k+1) = omega(k) + phi_ddot*dt;
phi(k+1) = phi(k) + omega(k+1)*dt;

prev_e = e(k);
end

e(end) = phi_ref – phi(end);

phi_deg = rad2deg(phi);

peak_val = max(phi_deg);
overshoot = max(0, peak_val – phi_ref_deg);

fprintf(‘Overshoot: %.3f degn’, overshoot);

figure;
subplot(2,1,1)
plot(t, phi_deg, ‘LineWidth’, 1.4); hold on;
yline(phi_ref_deg, ‘–r’, ‘Ref’);
xlabel(‘Time (s)’);
ylabel(‘Roll angle (deg)’);
title(‘Roll Angle Response’);
grid on;

subplot(2,1,2)
plot(t, u, ‘LineWidth’, 1.4);
xlabel(‘Time (s)’);
ylabel(‘u (N*m)’);
title(‘Control Torque’);
grid on;I’m trying to simulate the roll angle dynamics using the PID controller. I just would like to know if this code iw well-written or can be improved?
Any help will be appreciated.

%% Parameters
J = 0.03; % moment of inertia (kg*m^2)
Kp = 2;
Ki = 1;
Kd = 0.5;

dt = 0.01; % time step
T = 3; % total time
t = 0:dt:T;
N = length(t);

phi_ref_deg = 5;
phi_ref = deg2rad(phi_ref_deg);

phi = zeros(1, N);
omega = zeros(1, N);
u = zeros(1, N);
e = zeros(1, N);

I = 0;
prev_e = phi_ref – phi(1);

for k = 1:N-1

e(k) = phi_ref – phi(k);

I = I + e(k)*dt;
D = (e(k) – prev_e)/dt;

% PID control
u(k) = Kp*e(k) + Ki*I + Kd*D;

% Dynamics: J*phi_ddot = u
phi_ddot = u(k)/J;

omega(k+1) = omega(k) + phi_ddot*dt;
phi(k+1) = phi(k) + omega(k+1)*dt;

prev_e = e(k);
end

e(end) = phi_ref – phi(end);

phi_deg = rad2deg(phi);

peak_val = max(phi_deg);
overshoot = max(0, peak_val – phi_ref_deg);

fprintf(‘Overshoot: %.3f degn’, overshoot);

figure;
subplot(2,1,1)
plot(t, phi_deg, ‘LineWidth’, 1.4); hold on;
yline(phi_ref_deg, ‘–r’, ‘Ref’);
xlabel(‘Time (s)’);
ylabel(‘Roll angle (deg)’);
title(‘Roll Angle Response’);
grid on;

subplot(2,1,2)
plot(t, u, ‘LineWidth’, 1.4);
xlabel(‘Time (s)’);
ylabel(‘u (N*m)’);
title(‘Control Torque’);
grid on; I’m trying to simulate the roll angle dynamics using the PID controller. I just would like to know if this code iw well-written or can be improved?
Any help will be appreciated.

%% Parameters
J = 0.03; % moment of inertia (kg*m^2)
Kp = 2;
Ki = 1;
Kd = 0.5;

dt = 0.01; % time step
T = 3; % total time
t = 0:dt:T;
N = length(t);

phi_ref_deg = 5;
phi_ref = deg2rad(phi_ref_deg);

phi = zeros(1, N);
omega = zeros(1, N);
u = zeros(1, N);
e = zeros(1, N);

I = 0;
prev_e = phi_ref – phi(1);

for k = 1:N-1

e(k) = phi_ref – phi(k);

I = I + e(k)*dt;
D = (e(k) – prev_e)/dt;

% PID control
u(k) = Kp*e(k) + Ki*I + Kd*D;

% Dynamics: J*phi_ddot = u
phi_ddot = u(k)/J;

omega(k+1) = omega(k) + phi_ddot*dt;
phi(k+1) = phi(k) + omega(k+1)*dt;

prev_e = e(k);
end

e(end) = phi_ref – phi(end);

phi_deg = rad2deg(phi);

peak_val = max(phi_deg);
overshoot = max(0, peak_val – phi_ref_deg);

fprintf(‘Overshoot: %.3f degn’, overshoot);

figure;
subplot(2,1,1)
plot(t, phi_deg, ‘LineWidth’, 1.4); hold on;
yline(phi_ref_deg, ‘–r’, ‘Ref’);
xlabel(‘Time (s)’);
ylabel(‘Roll angle (deg)’);
title(‘Roll Angle Response’);
grid on;

subplot(2,1,2)
plot(t, u, ‘LineWidth’, 1.4);
xlabel(‘Time (s)’);
ylabel(‘u (N*m)’);
title(‘Control Torque’);
grid on; code improvement MATLAB Answers — New Questions

​

Leave a Reply

Your email address will not be published. Required fields are marked *