%% Exercice 12 - Régulateur P + Smith + Feed-Forward + Saturation clear; clc; close all; %% 1. Paramètres de simulation Ts = 0.001; % Période d'échantillonnage Ts = 1 ms[cite: 38] Kp = 10; % Gain du régulateur P[cite: 37] N = 100; % Durée de simulation (100 ms) % Consigne W(k) : échelon de 1V à t = 5ms w = [zeros(1, 5), ones(1, N - 5)]; %% 2. Initialisation des variables y = zeros(1, N); u = zeros(1, N); Up = zeros(1, N); UFF = zeros(1, N); Ups = zeros(1, N); % Variables de mémoire Wold = 0; Upsold1 = 0; Upold1 = 0; Upold2 = 0; Upold3 = 0; %% 3. Boucle temps réel for k = 5:N-1 % Lecture de la mesure y_k = y(k); % 1. Action Feed-Forward UFF(k) = (w(k) - 0.9048 * Wold) / 0.4758; Wold = w(k); % 2. Signal du prédicteur de Smith Ups(k) = 0.9048 * Upsold1 + 0.4758 * Upold1 - 0.4758 * Upold3; % 3. Action Proportionnelle (avec retouches sur l'erreur) e = Wold - y_k - Ups(k); Up_val = Kp * e; Up(k) = Up_val; % 4. Somme et saturation (+/- 10V) u_total = Up_val + UFF(k); if u_total > 10.0, u_total = 10.0; end if u_total < -10.0, u_total = -10.0; end u(k) = u_total; % 5. Équation du procédé réel : F(z) = 0.4758/(z - 0.9048) * z^-2[cite: 38] y(k+1) = 0.9048 * y(k) + 0.4758 * u(k-2); % 6. Mise à jour des mémoires Upsold1 = Ups(k); Upold3 = Upold2; Upold2 = Upold1; Upold1 = Up_val; end %% 4. Tracé des courbes t_ms = (0:N-1) * Ts * 1000; figure('Name', 'Exercice 12 - Simulation'); subplot(2,1,1); plot(t_ms, y, 'b-', 'LineWidth', 1.5); hold on; plot(t_ms, w, 'k--', 'LineWidth', 1.2); grid on; title('Réponse temporelle y(t) du système réglé'); xlabel('Temps [ms]'); ylabel('Sortie y(t) [V]'); legend('Sortie réelle y', 'Consigne W'); subplot(2,1,2); plot(t_ms, u, 'r-', 'LineWidth', 1.5); hold on; plot(t_ms, UFF, 'g--', 'LineWidth', 1.2); grid on; title('Signal de commande saturé u(t)'); xlabel('Temps [ms]'); ylabel('Commande [V]'); legend('Commande globale u(t)', 'Action Feed-Forward UFF');