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')
Lesezeichen