mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Regler mit Matlab testen


Autor: Carol W. (carol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
%%

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn dein Regler aus?

Autor: Carol W. (carol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P=?
I=?
D=?

edit:
Wer soll denn diesen Code verstehen?

Autor: Carol W. (carol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Carol W. (carol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?


%% 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;
%%


%%
temp = (1:56);
 
 for i=1:56
       fwrite(serial1,pt2(i));
       temp(i) = fread(serial1,1,'uchar');
 end
hold on;
plot(temp);
grid on;
%%

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach es doch wie alle anderen (ohne HIL-System oder richtige analoge 
I/O-Hardware) und simuliere in Matlab.
regelstrecke=tf([ks],[T1,T2,1]);
regler=tf(Kr*[b0,b1,b2],[1,-a1,-a2],Abtastschrittweite);
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

Autor: Carol W. (carol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Carol W. (carol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal der Matlab code.
Der Fehler ist unten in der for Schleife.
Wie kann ich hier den Istwert richtig berechnen?
Jeamand eine Idee?
close all

%% 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 = uint8(pt2');
figure(1);
plot(pt2)
%%

%%
stellwert = (1:56);
istwert = (1:56);  
 
 for i=1:56
       fwrite(serial1,istwert(i));      % 1) Istwert an Regler senden%
                                                  % Regler berechnet
                                                  % Regelabweichung und
                                                  % Stellwert 
       stellwert(i) = fread(serial1,1,'uchar');   % 2) Stellwert lesen %  
       istwert(i) = pt2(i)*stellwert(i);          % 3) Istwert mit  
                                                  % Stellwert 
                                                  % und Regelstrecke 
                                                  % berechnen 
                                                                       
                                                                            end
hold on;
plot(istwert);
grid on;
%%

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.