Hab da wirklich gerade nochmal ein wenig mit herumgespielt und an den Reglerparametern gedreht. Hab auch mal einen Anti-Windup für den Integratoranteil wie bei mir eingebaut. Mir ist auch aufgefallen, warum du keinen D-Anteil brauchst: du hast deinen Regler auf Drehzahlebene aufgebaut, ich hingegen auf Positionsebene. Jedenfalls hab ich jetzt folgende Parameter verwendet:
Kp=50
Ki=3
Kd=1
Der Regler funktioniert jetzt schön zackig und ohne Überschwinger![]()
![]()
![]()
Hier nochmal der ganze Code:
Code:clear all; close all; clc; if 0 % sprünge soll = [zeros(1, 100) ... ones(1, 200)*20 ... zeros(1, 100) ... ones(1, 200)*-40 ... zeros(1, 100) ... ones(1, 200)*60 ... zeros(1, 100) ... ones(1, 200)*80 ... zeros(1, 100)]; else % rampen soll = [-80:2:80 ... -80:1:80 ... -80:0.5:80 ... -80:0.25:80]; end % streckeneigenschaften v = 0.38; T1 = 13; % PID parameter Kp = 50; Ki = 3; Kd = 1; Ta = 1; % entspr. 2.048 ms % init u=0; y = 0; eSum = 0; eOld = 0; yOld = 0; for i = 1:length(soll) w = soll(i); %% PID e = w - y; if abs(u)<208 %Anti-Windup, Integrator abschalten wenn Ausgang in Begrenzung eSum = eSum + e; end P = Kp*e; I = Ki * Ta * eSum; D = Kd/Ta*(e - eOld); u = P+I+D; eOld = e; u(u>208) = 208; % max. stellwert u(u<-208) = -208; %% PT1 strecke y = yOld + 1/T1 * (v * u - yOld); yOld = y; %% doku y_(i) = y; u_(i) = u; w_(i) = w; e_(i) = e; P_(i) = P; I_(i) = I; D_(i) = D; end % darstellung disp(['Summenfehler: ' num2str(eSum)]) subplot(2, 1, 1) plot(soll, 'LineWidth', 2) hold on plot(y_, 'r', 'LineWidth', 2) set(gca, 'XLim', [0 length(y_)]) xlabel('Zeit [Ticks]') ylabel('Drehzahl') legend('soll', 'ist') subplot(2, 1, 2) plot(P_, 'LineWidth', 2) hold on plot(I_, 'g', 'LineWidth', 2) plot(u_, 'r', 'LineWidth', 2) set(gca, 'XLim', [0 length(y_)]) xlabel('Zeit [Ticks]') ylabel('Wert') legend('P', 'I', 'Stellwert')







Zitieren

Lesezeichen