Forum: Mikrocontroller und Digitale Elektronik Regler mit Matlab testen


von Carol W. (carol)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Wie sieht denn dein Regler aus?

von Carol W. (carol)


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;

von Oliver J. (skriptkiddy)


Lesenswert?

P=?
I=?
D=?

edit:
Wer soll denn diesen Code verstehen?

von Carol W. (carol)


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.

von Carol W. (carol)


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?


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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Carol W. (carol)


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?

von Carol W. (carol)


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?
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
Noch kein Account? Hier anmelden.