Hallo, ich habe auf einem ATMega16 einen PID Regler implementiert. Ich würde jetzt gerne mit Matlab testen ob der Regler auf dem Controller funktioniert. Die Simulink Blocks "To Instrument" und "From Instument" funktionieren bei mir leider nicht. Über die serielle Schnittstelle in Matlab Daten einzulesen und auszugeben funktioniert. Wie kann ich die Sprungantwort des geschlossenen Regelkreises mit dem implementierten Regler darstellen? meine Regelstrecke sieht so aus: %% Regelstrecke ks = 1; T1 = 15; T2 = 5; Z_strecke = ks; N_strecke = [T1 1]; N_strecke = conv(N_strecke,[T2 1]); figure(1); pt2 = 200*step(Z_strecke,N_strecke); pt2 = pt2'; figure(1); plot(pt2) grid on; %%
Der C Code für den PID Regler: 21 int32_t temp = 0; 22 uint8_t u_neu = 0; 23 24 25 temp = (int32_t) b0 * (int32_t)e_neu; 26 temp -= (int32_t) b1 * (int32_t)e_alt1; 27 temp += (int32_t) b2 * (int32_t)e_alt2; 28 temp += (int32_t) a1 * (int32_t)u_alt1; 29 temp += (int32_t) a2 * (int32_t)u_alt2; 30 temp /= (32); //Skalierung mit 32 31 32 if (temp < 0) 33 { 34 u_neu = 0; 35 } 36 else if (temp > 255) 37 { 38 u_neu = 255; 39 } 40 else 41 { 42 u_neu = temp; 43 } 44 45 //Umspeichern 46 e_alt2 = e_alt1; 47 e_alt1 = e_neu; 48 u_alt2 = u_alt1; 49 u_alt1 = u_neu;
Realer PID-Regler:
Z Transformation:
Annäherung eines digitalen Regler 2. Ordnung:
Durch Gleichsetzen kommt man zu folgender Gleichung:
Der Code des Reglers den ich oben gepostet habe ist nichts anderes als die Umsetzung der Gleichung Y(z) in C Code. Das spielt aber für mein Problem keine große Rolle. Wie kann ich die Sprungantwort des geschlossenen Regelkreises mit dem implementierten Regler mit Matlab darstellen? Als Regelstrecke würde ich die oben beschriebene Pt2 Strecke nutzen. Mit "fwrite()" und "fread()" kann ich in Matlab Daten senden und empfangen.
Das ist mein bisheriger Matlab Code. Dem Regler einfach die Werte der Pt2 Strecke zu senden ist natürlich falsch. Der Regler benötigt den jeweils aktuellen "Istwert". Wie kann ich diesen am besten berechnen?
1 | %% Regelstrecke |
2 | ks = 1; |
3 | T1 = 15; |
4 | T2 = 5; |
5 | Z_strecke = ks; |
6 | N_strecke = [T1 1]; |
7 | N_strecke = conv(N_strecke,[T2 1]); |
8 | |
9 | figure(1); |
10 | pt2 = 200*step(Z_strecke,N_strecke); |
11 | pt2 = pt2'; |
12 | figure(1); |
13 | plot(pt2) |
14 | grid on; |
15 | %% |
16 | |
17 | |
18 | %% |
19 | temp = (1:56); |
20 | |
21 | for i=1:56 |
22 | fwrite(serial1,pt2(i)); |
23 | temp(i) = fread(serial1,1,'uchar'); |
24 | end |
25 | hold on; |
26 | plot(temp); |
27 | grid on; |
28 | %% |
Mach es doch wie alle anderen (ohne HIL-System oder richtige analoge I/O-Hardware) und simuliere in Matlab.
1 | regelstrecke=tf([ks],[T1,T2,1]); |
2 | regler=tf(Kr*[b0,b1,b2],[1,-a1,-a2],Abtastschrittweite); |
3 | step(feedback(series(regeler,regelstecke),1)); |
Wenn das Führungsverhalten passt, dann den Regler im Atmega implementieren und an der realen Regelstecke testen. Wenn du dir aber unbedingt das leben schwer machen willt, dann könnte das eventuell hilfreich sein: In Simulink 2 S-Funktion-Blöcke die mit dem Atmega (fread fwrite) kommunizieren. Dazwischen deine Reglestecke. Gruß Skriptkiddy
Das mit den S-Funktion-Blöcken klingt gut, klappt aber bei mir leider nicht. Irgendwas klappt mit der Kommuikation in Simulink über die Serielle Schnittstelle nicht. Gibt es nicht die Möglichkeit alles in einem m file darzustellen? Der Controller berechnet die Regeldifferenz und daraus den aktuellen Stellwert. Wie kann ich aus dem aktuellen Stellwert und der Regelstrecke den aktuellen Istwert berechnen?
Hier nochmal der Matlab code. Der Fehler ist unten in der for Schleife. Wie kann ich hier den Istwert richtig berechnen? Jeamand eine Idee?
1 | close all |
2 | |
3 | %% Regelstrecke |
4 | ks = 1; |
5 | T1 = 15; |
6 | T2 = 5; |
7 | Z_strecke = ks; |
8 | N_strecke = [T1 1]; |
9 | N_strecke = conv(N_strecke,[T2 1]); |
10 | |
11 | figure(1); |
12 | pt2 = 200*step(Z_strecke,N_strecke); |
13 | pt2 = uint8(pt2'); |
14 | figure(1); |
15 | plot(pt2) |
16 | %% |
17 | |
18 | %% |
19 | stellwert = (1:56); |
20 | istwert = (1:56); |
21 | |
22 | for i=1:56 |
23 | fwrite(serial1,istwert(i)); % 1) Istwert an Regler senden% |
24 | % Regler berechnet |
25 | % Regelabweichung und |
26 | % Stellwert |
27 | stellwert(i) = fread(serial1,1,'uchar'); % 2) Stellwert lesen % |
28 | istwert(i) = pt2(i)*stellwert(i); % 3) Istwert mit |
29 | % Stellwert |
30 | % und Regelstrecke |
31 | % berechnen |
32 | |
33 | end |
34 | hold on; |
35 | plot(istwert); |
36 | grid on; |
37 | %% |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.