Hi,
ich habe den Regelkreis jetzt doch mal als ganz simples Modell in Matlab nachgebaut. Falls jemand Interesse hat, hier der Code. Das ist ausdrücklich kein guter Matlab-Code!
Die Abhängigkeit der Drehzahl von der PWM wurde wie oben gesagt als PT1 angenommen, für Zeitkonstante und Streckenverstärkung wurden die empirisch ermittelten Werte verwendet. Um die Nichtlinearität durch die Schwelle wegzubekommen habe ich den PWM Wert einfach verschoben, die tatsächliche Aktivierung von 47 bis 255 sieht der Regler als 0 bis 208. Ich habe dann per Hand mit den Parametern gespielt, bis das Regelverhalten gut aussah. Es stellte sich schnell heraus, dass der D-Anteil keine wesentliche Verbesserung des Regelverhaltens bringt, ich habe ihn dann rausgeschmissen. Es war wohl nicht anders zu erwarten als dass der PID sehr gut mit einer perfekt linearen Regelstrecke funktioniert, die Frage ist also, wie gut das Ganze dann noch am realen Objekt funktioniert. Auch den Vergleich mit dem Modell finde ich dann nochmal spannend. Hier mal zwei Bilder des Regelverhaltens, einmal Sollwertsprünge, einmal Rampen:Code:clear if 1 % 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 = 6; Ki = 0.35; Kd = 0; Ta = 1; % entspr. 2.048 ms % init y = 0; eSum = 0; eOld = 0; yOld = 0; for i = 1:length(soll) w = soll(i); %% PID e = w - y; eSum = eSum + e; 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')
![]()
![]()
Fortsetzung folgt ...![]()
Gruß
Malte







Zitieren

Lesezeichen