Forum: Mikrocontroller und Digitale Elektronik Motorregelung


von Noppis (Gast)


Lesenswert?

Hallo Freunde,

ich habe eine H-Brücke - damit steuer ich 24V DC Motor - max. 3A.

Jetzt messe ich die gegen EMK - das klappt sehr gut und ich erhalte bei 
minimaler Drehzahl 10 und max. Drehzahl 450 als ADC Wert.

Ich messe mit ATmega644PA - 10 Bit ADC, 8 Bit PWM. Ich habe einen PI und 
PID Regler probiert (code siehe Anhang). Ich habe leider keine Erfahrung 
in Regelungstechnik und bin wirklich angewiesen das mir ein Profi hilft.

Folgendes Problem: Ich gebe einen Soll-Wert vor (0-255 der 8 Bit PWM). 
Darauf regelt der Motor ich denke erstmal ganz 0815. Alle 5ms 
unterbreche ich die PWM um die EMK zu messen. Das sind ca. 200 Hz.

Dem PID gebe ich als Sollwert die gewünschte PWM vor (bspw. 20 von 255 
Werten). Darauf regelt der PID dann irgendwie denn genau hier habe ich 
MAGIE.

1. irgendwie gefühlt scheint es egal zu sein ob ich PID oder PI nehme 
und welche Startwerte ich bei der Init setze. Ich habe jetzt mal 5 (P), 
5 (I), und 1 (D) genommen.

2. für kleine Geschwindigkeiten klapppt das schon per Zauberhand wie 
gewünscht. Bspw. ich gebe PWM 20/255 vor, er gegelt darauf, belaste ich 
den Motor regelt er nach usw. TOP

ABER: Es spielt irgendwie kaum eine Rolle was ich als Soll-Wert vorgebe. 
bis 50% (128/255) ist die Geschw. mininmal in der Änderung, 
darüberhinaus verändert sich gar nichts mehr der der Motor schwingt.


Was mache ich falsch?

Der Code in der loop
1
if (decoder.dcc.sysCond.systemBits.is_direction_forward)
2
          {
3
            set_regler_soll(decoder.engine.pwm_soll_regler_right);
4
            decoder.engine.pwm_soll_right = pid_regler(decoder.dcc_gegenEmk);
5
          }
6
          else
7
          {
8
            set_regler_soll(decoder.engine.pwm_soll_regler_left);
9
            decoder.engine.pwm_soll_left = pid_regler(decoder.dcc_gegenEmk);
10
          }



Der Regler itself. set_regler_parameter mache ich während der init 
einmal auf die genannten Werte (5,5,1). Ich fühle da aber keinen 
unterschied was ich eingebe. Habe auch mal 10,20,0 gemacht - verhält 
sich gleich
1
inline void set_regler_parameter(uint8_t _ki, uint8_t _kp, uint8_t _kd)
2
{
3
  kp = _kp;
4
  ki = _ki;
5
  kd = _kd;
6
}
7
8
inline void set_regler_soll(uint16_t _w)
9
{
10
  w = _w;
11
}
12
13
14
inline uint8_t pid_regler(uint16_t _x)
15
{
16
  e = w - _x;                        //Vergleich
17
  esum = esum + e;                    //Integration I-Anteil
18
19
  if (esum < -400) esum = -400;              //Begrenzung I-Anteil
20
  if (esum > 400) esum = 400;
21
22
  y = (kp * e) + (ki * 0.1 * esum);  //Reglergleichung
23
  y += ((kd * esum) / (kd * 10 * esum));
24
25
  if (y < 0)    y = 0;
26
  if (y > 0xFF)  y = 0xFF;
27
28
  return (y);                        //Übergabe Stellgröße
29
}
30
31
inline uint8_t pi_regler(uint16_t _x)
32
{
33
  e = w - _x;                        //Vergleich
34
  esum = esum + e;                    //Integration I-Anteil
35
36
  if (esum < -400) esum = -400;              //Begrenzung I-Anteil
37
  if (esum > 400) esum = 400;
38
39
  y = (kp * e) + (ki * 0.1 * esum);  //Reglergleichung
40
41
  if (y < 0)    y = 0;
42
  if (y > 0xFF)  y = 0xFF;
43
44
  return (y);                        //Übergabe Stellgröße
45
}

von Achim M. (minifloat)


Lesenswert?

Noppis schrieb:
> Alle 5ms unterbreche ich die PWM um die EMK zu messen. Das sind ca. 200
> Hz.

Kannst du dir irgendwie den Abtastzeitpunkt, die Spannung am ADC-Eingang 
und die am Motor anliegende Spannung bei händisch vorgesteuertem 
PWM-Tastgrad darstellen? Damit wüsstest du, dass ein Problem auf dem 
Messsignalpfad besteht. Ich vermute, dass es nach Abschalten einen 
Überschwinger auf der EMK-Messung gibt, den du sampelst und 
fälschlicherweise darauf (statt real EMK) regelst.

Vorschlag, das ganze mit einem separaten Drehzahlsensor zum laufen zu 
bekommen. Damit bist du erstmal die EMK-Messung los.
mfg mf

: Bearbeitet durch User
von Noppis (Gast)


Lesenswert?

Achim M. schrieb:
> Noppis schrieb:
>> Alle 5ms unterbreche ich die PWM um die EMK zu messen. Das sind ca. 200
>> Hz.
>
> Kannst du dir irgendwie den Abtastzeitpunkt, die Spannung am ADC-Eingang
> und die am Motor anliegende Spannung bei händisch vorgesteuertem
> PWM-Tastgrad darstellen? Damit wüsstest du, dass ein Problem auf dem
> Messsignalpfad besteht. Ich vermute, dass es nach Abschalten einen
> Überschwinger auf der EMK-Messung gibt, den du sampelst und
> fälschlicherweise darauf (statt real EMK) regelst.
>
> Vorschlag, das ganze mit einem separaten Drehzahlsensor zum laufen zu
> bekommen. Damit bist du erstmal die EMK-Messung los.
> mfg mf

Es ist keine Option und Möglichkeit für einen externen Sensor.

Ich kann ausschließen, dass dort ein falscher Sampler drin ist. Ich lege 
je nach Drehrichtung die jenige Low-Side gegen Masse , High Side wird 
abgeschaltet. Dann messe ich die Spannung dort. Die ist absolut sauber 
die schwankt nicht einmal. Ich habe dazu 10k 2x in reihe an die 
Motorkontakte. über den Spannungsteiler gehe ich dann auf einen 1nF zum 
ADC. Ich mache erst auch 20 Messungen die ich verwerfe und messe danach 
10 Messungen als Mittelwert. Ich habe mal testweise nur 1 Messung 
gemacht - die schwankt um 1er stelle im bereich 0-3. Das ist minimal 
würde ich sagen.

Mein Kernproblem ist, vrmtl. der Bezug zwischen EMK und PWM Wert. Ich 
glaube nicht das der PWM Wert dem EMK Wert entspricht. Wenn ich bei 
set_regler_soll den PWM wert (0-255) einfach mal 2 nehme und übergebe 
kann ich auch bis MAX regeln, aber irgendwie ist das logarithmisch - 
kein vergleich zur regulären 0-255 PWM Stellung ohne Regelung. Es muss 
da vrmtl. eine Art Umrechnung stattfinden

Wenn ich das per Osci mir angucke, ist die EMK auch sehr sauber.
Abtastzeitpunkt: Alle 5ms wird die PWM ausgesetzt, der Motor einseitig 
gegen Masse geschaltet und gemessen.

Ohne Regelung:
PWM Wert 30 => ca. 0,1V EMK => ca. ADC wert 30
PWM Wert 230 => ca. 2,3V EMK => ca. ADC Wert 450

von Noppis (Gast)


Lesenswert?

Ach, noch vergessen, die Datentypen:
uint8_t kp, ki, kd;
uint16_t w, count, buffer, buffer_old;
int16_t e, esum, buffer_diff, y;

von finbar (Gast)


Lesenswert?

Ich hab eine Gegen-EMK-Regelung mal für zwei Motoren auf einer Leitung 
gemacht, Halbwellensteuerung. Kennst du:

https://www.precisionmicrodrives.com/ab-021

Vielleicht findest du da noch Tipps, hat mir sehr geholfen.

Viele Grüße
finbar

von Achim M. (minifloat)


Lesenswert?

Noppis schrieb:
> Mein Kernproblem ist, vrmtl. der Bezug zwischen EMK und PWM Wert. Ich
> glaube nicht das der PWM Wert dem EMK Wert entspricht.

Das muss er nicht, dazu ist ein Regler auch da :)

Wichtig ist, dass dein Sollwert und der Messsignalpfad dieselbe 
Skalierung haben. Damit hast du ein error-Signal in Skalierung 
"Spannung". Das lässt sich leichter bewerten und macht vernünftige 
Regelung überhaupt möglich.

Um die Vorwärts-Rückwärts-Fallunterscheidung zu eliminieren, wäre es 
gut, wenn der Regler in positive und negative Richtung geht.

Noppis schrieb:
> Ohne Regelung:
> PWM Wert 30 => ca. 0,1V EMK => ca. ADC wert 30
> PWM Wert 230 => ca. 2,3V EMK => ca. ADC Wert 450

Mit mehr Punkten könnte man sehen, ob das EMK-zu-ADC einigermaßen linear 
ist :)

mfg mf

: Bearbeitet durch User
von Noppis (Gast)


Lesenswert?

finbar schrieb:
> Ich hab eine Gegen-EMK-Regelung mal für zwei Motoren auf einer
> Leitung
> gemacht, Halbwellensteuerung. Kennst du:
>
> https://www.precisionmicrodrives.com/ab-021
>
> Vielleicht findest du da noch Tipps, hat mir sehr geholfen.
>
> Viele Grüße
> finbar

Das klingt sehr kompliziert. Leider schreiben die über die eigentliche 
Regelung nichts, nur wie man Drehzahl in Spannung/strom umrechnung usw. 
Du wie hast du das denn gemacht?

von Achim M. (minifloat)


Lesenswert?

Noppis schrieb:
> nur wie man Drehzahl in Spannung/strom umrechnung usw. Du wie hast du
> das denn gemacht?

Hast du Angaben zur Motorkonstante, dann lässt sich das errechnen. Hast 
du einen Drehzahlsensor (nur zur Entwicklung, nicht nachher im 
"Feldeinsatz") dann könntest du auch messen.

mfg mf

PS...
Drehzahl korreliert grob mit Spannung
Drehmoment korreliert grob mit Strom

: Bearbeitet durch User
von Noppis (Gast)


Lesenswert?

Achim M. schrieb:
> Noppis schrieb:
>> Mein Kernproblem ist, vrmtl. der Bezug zwischen EMK und PWM Wert. Ich
>> glaube nicht das der PWM Wert dem EMK Wert entspricht.
>
> Das muss er nicht, dazu ist ein Regler auch da :)
>
> Wichtig ist, dass dein Sollwert und der Messsignalpfad dieselbe
> Skalierung haben. Damit hast du ein error-Signal in Skalierung
> "Spannung". Das lässt sich leichter bewerten und macht vernünftige
> Regelung überhaupt möglich.
>
> Um die Vorwärts-Rückwärts-Fallunterscheidung zu eliminieren, wäre es
> gut, wenn der Regler in positive und negative Richtung geht.
>
> Noppis schrieb:
>> Ohne Regelung:
>> PWM Wert 30 => ca. 0,1V EMK => ca. ADC wert 30
>> PWM Wert 230 => ca. 2,3V EMK => ca. ADC Wert 450
>
> Mit mehr Punkten könnte man sehen, ob das EMK-zu-ADC einigermaßen linear
> ist :)
>
> mfg mf

Na klar kein Problem. Ich habe jetzt mal gemessen (ohne Regelung) mit 
folgenden Werte des ADC. Der Motor dreht nicht konstant mit konstanter 
PWM - daher schwankt der Wert ich habe ihn gemittelt.

PWM | EMK
0   | 0
32  | 22
35  | 29
38  | 37
41  | 42
44  | 50
47  | 55
50  | 61
53  | 70
56  | 78
59  | 87
62  | 95
65  | 101
68  | 112
80  | 135
91  | 155
102 | 190
113 | 230
124 | 260
135 | 310
146 | 350
157 | 365
168 | 380
179 | 400
190 | 415
201 | 440
212 | 490
223 | 520

von Noppis (Gast)


Lesenswert?

Achim M. schrieb:
> Noppis schrieb:
>> nur wie man Drehzahl in Spannung/strom umrechnung usw. Du wie hast du
>> das denn gemacht?
>
> Hast du Angaben zur Motorkonstante, dann lässt sich das errechnen. Hast
> du einen Drehzahlsensor (nur zur Entwicklung, nicht nachher im
> "Feldeinsatz") dann könntest du auch messen.
>
> mfg mf
>
> PS...
> Drehzahl korreliert grob mit Spannung
> Drehmoment korreliert grob mit Strom

Strom messe ich, aber sehr ungenau (0,1A Auflösung). Mir gings da eher 
um überstrom. Mache ich mit 0,03R Widerstand.

Motorkonstante - gute Frage. Ist ein Bühler Spielzeugmotor. 7 polig.
Hilft das ? 
http://www.kaltenleitner.at/kaltenleitner/technik/modellbau/LGB-Motor/LGB-Motor.htm

von Achim M. (minifloat)


Lesenswert?

Noppis schrieb:
> Motorkonstante - gute Frage. Ist ein Bühler Spielzeugmotor. 7 polig.
> Hilft das ?
> 
http://www.kaltenleitner.at/kaltenleitner/technik/modellbau/LGB-Motor/LGB-Motor.htm

Jawoll, Tabelle ist auf der Seite:

Du willst ja eigentlich  eine Drehzahl regeln, nicht die EMK. Wenn du 
DC-Spannung an das Motörchen anlegst, welche Leerlaufdrehzahl ergibt 
sich bei welcher Spannung? Besser: Wenn du so einen Motor extern 
antreibt, bei welcher Drehzahl ergibt sich welche EMK?

Mehr ist da nicht dahinter.

mfg mf

von Noppis (Gast)


Lesenswert?

Achim M. schrieb:
> Noppis schrieb:
>> Motorkonstante - gute Frage. Ist ein Bühler Spielzeugmotor. 7 polig.
>> Hilft das ?
>>
> 
http://www.kaltenleitner.at/kaltenleitner/technik/modellbau/LGB-Motor/LGB-Motor.htm
>
> Jawoll, Tabelle ist auf der Seite:
>
> Du willst ja eigentlich  eine Drehzahl regeln, nicht die EMK. Wenn du
> DC-Spannung an das Motörchen anlegst, welche Leerlaufdrehzahl ergibt
> sich bei welcher Spannung? Besser: Wenn du so einen Motor extern
> antreibt, bei welcher Drehzahl ergibt sich welche EMK?
>
> Mehr ist da nicht dahinter.
>
> mfg mf

Dazu hatte ich ja oben die Tabelle geschickt. Eigentlich soweit so gut.
Ich übergebe jetzt den PWM-SOLL * 2.3 und habe i = 60, p = 5 und d = 10.
Damit ist die Regelung ganz nett - ich habe es jetzt nur auf dem Tisch 
getestet.

Wie genau verhalten sich die PID Werte genau? P macht gefühlt keinen 
Unterschied. P merke ich auch nichts. I größer als 60 schwingt sich auf 
255 - das wars. i kleiner regelt schneller nach - aber schwingt dann.

Die Werte verstehe ich auch noch nicht genau - muss ich jetzt die Pole 
ausrechnen ob das stabil ist oder nicht oder kann man logisch grob was 
dazu sagen?

von Achim M. (minifloat)


Lesenswert?

Noppis schrieb:
> Die Werte verstehe ich auch noch nicht genau - muss ich jetzt die Pole
> ausrechnen ob das stabil ist oder nicht oder kann man logisch grob was
> dazu sagen?

Es gibt mehrere Möglichkeiten, einen Regler auszulegen.
Du kannst die längste Zeitkonstante im System ausregeln, das bekommst du 
durch das Pole-Nullstellen-Diagramm. Oder den Empfehlungen von "Hrones, 
Reswick, Ziegler, Nichols" folgen. Oder eben empirisch.

Dass der P-Anteil fast nix tut, mag ich kaum glauben. Was passiert, wenn 
du nur P benutzt? Da erstmal nur mit P probieren. P ist proportional, 
lässt also einen statischen Regelfehler stehen. Den bekommt man mit dem 
I weg, da aber nicht zu viel geben, weil der Integrator auch Zeit 
braucht, nach großen error-Signal sich wieder zu erholen. Nur I-Anteil 
ist entweder langsam oder schwingt. Prinzipbedingt kann man mit I bei 
bestem Führungsverhalten einen Überschwinger beim Anregeln nicht 
vermeiden. Der aperiodische Grenzfall des Gesamtsystems ist dabei das 
schnellste, was theoretisch machbar ist. Bisschen mehr und es schwingt. 
Der D-Anteil ist bei händischer Einstellung meist ungenutzt. In der 
Praxis versucht man mit dem D in die Zukunft zu extrapolieren. Damit 
kann man ein Gesamtsystem einen Ticken schneller machen, als nur mit PI. 
Dadurch leidet aber das Störverhalten.
Bestes Führungsverhalten und bestes Störverhalten lassen sich bei 
klassischem PI(D) immer nur als Kompromiss zueinander einstellen. Und 
damit ... Gute Nacht

mfg mf

: Bearbeitet durch User
von Noppis (Gast)


Lesenswert?

Achim M. schrieb:
> Noppis schrieb:
>> Die Werte verstehe ich auch noch nicht genau - muss ich jetzt die Pole
>> ausrechnen ob das stabil ist oder nicht oder kann man logisch grob was
>> dazu sagen?
>
> Es gibt mehrere Möglichkeiten, einen Regler auszulegen.
> Du kannst die längste Zeitkonstante im System ausregeln, das bekommst du
> durch das Pole-Nullstellen-Diagramm. Oder den Empfehlungen von "Hrones,
> Reswick, Ziegler, Nichols" folgen. Oder eben empirisch.
>
> Dass der P-Anteil fast nix tut, mag ich kaum glauben. Was passiert, wenn
> du nur P benutzt? Da erstmal nur mit P probieren. P ist proportional,
> lässt also einen statischen Regelfehler stehen. Den bekommt man mit dem
> I weg, da aber nicht zu viel geben, weil der Integrator auch Zeit
> braucht, nach großen error-Signal sich wieder zu erholen. Nur I-Anteil
> ist entweder langsam oder schwingt. Prinzipbedingt kann man mit I bei
> bestem Führungsverhalten einen Überschwinger beim Anregeln nicht
> vermeiden. Der aperiodische Grenzfall des Gesamtsystems ist dabei das
> schnellste, was theoretisch machbar ist. Bisschen mehr und es schwingt.
> Der D-Anteil ist bei händischer Einstellung meist ungenutzt. In der
> Praxis versucht man mit dem D in die Zukunft zu extrapolieren. Damit
> kann man ein Gesamtsystem einen Ticken schneller machen, als nur mit PI.
> Dadurch leidet aber das Störverhalten.
> Bestes Führungsverhalten und bestes Störverhalten lassen sich bei
> klassischem PI(D) immer nur als Kompromiss zueinander einstellen. Und
> damit ... Gute Nacht
>
> mfg mf

Vielen Dank. Ich habe das mal so gemacht.

D wie gesagt merke ich keinen Unterschied. Ich habe es mal bei 10 
gelassen.


In der zwischenzeit bin ich auf den PI statt PID (verhälts cih genauso).
P ist ganz empfindlich. Kleine Änderung großes Schwingen. Mit dem P an 
sich schwingt es wirklich. Ohne I geht es gar nicht - das glättet. Da 
ist mehr mehr. Aktuelles verhältnis I = 60, P = 5

Allerdings für sehr langsames drehen nicht optimal. Es geht, aber es 
ruckt leicht. Wie kann man das in der Seite verbessern? Oder müsste man 
das ggf. adaptiv machen?

von Achim M. (minifloat)


Lesenswert?

Noppis schrieb:
> Allerdings für sehr langsames drehen nicht optimal.

Adaptive Reglerparameter, abhängig von der aktuellen Drehzahl, kannste 
mal probieren. Nicht hart umschalten, sondern in geeinetem Bereich 
linear Interpolieren.
Vielleicht hilft auch ein kleines bisschen D-Anteil.

mfg mf

: Bearbeitet durch User
von Rubimix (Gast)


Lesenswert?

Noppis schrieb:
> y = (kp * e) + (ki * 0.1 * esum);  //Reglergleichung
Woher stammt der Code? Komme ich überhaupt nicht klar!
Wenn y der neue PWM-Wert sein soll, würde ohne I-Anteil die PWM doch 
ohne Regelabweichung platt auf 0 gestellt.

von Noppis (Gast)


Lesenswert?

Rubimix schrieb:
> Noppis schrieb:
>> y = (kp * e) + (ki * 0.1 * esum);  //Reglergleichung
> Woher stammt der Code? Komme ich überhaupt nicht klar!
> Wenn y der neue PWM-Wert sein soll, würde ohne I-Anteil die PWM doch
> ohne Regelabweichung platt auf 0 gestellt.

Der Code stammt von mir ! Woher soll der denn sonst stammen?
Das ist erstmal 0815 P-I-D Regler Code wie man die Regelung auch in der 
uni in Regelungstechnik lernt, ich habe es nur in C umgesetzt als 
Ganzzahl.

von Forist (Gast)


Angehängte Dateien:

Lesenswert?

Noppis schrieb:
> Na klar kein Problem. Ich habe jetzt mal gemessen (ohne Regelung) mit
> folgenden Werte des ADC. Der Motor dreht nicht konstant mit konstanter
> PWM - daher schwankt der Wert ich habe ihn gemittelt.
>
> PWM | EMK
> 0   | 0
> ...

Ein Tabellenkalkulationsprogramm o.ä. besitzt du nicht, um die Daten 
graphisch darzustellen?
Sooh schwierig ist das doch nicht.

von Rubimix (Gast)


Lesenswert?

Noppis schrieb:
> Der Code stammt von mir ! Woher soll der denn sonst stammen?
> Das ist erstmal 0815 P-I-D Regler Code wie man die Regelung auch in der
> uni in Regelungstechnik lernt, ich habe es nur in C umgesetzt als
> Ganzzahl.
Zumindest sagt Dir an der Uni keiner, dass bei kP=5, kI=0, w=_x=100 die 
PWM einer Geschwindigkeitsregelung auf 0 zurückfallen darf.
Du nimmst doch auch nicht den Fuß komplett vom Gas, wenn Du auf die 
vorgeschriebenen 100 km/h beschleunigt hast.
Da passt also etwas an Deinem Programmierten nicht.
Vielleicht geht's besser mit z.B.: 
https://www.heise.de/ct/artikel/Steuermann-290434.html

von Noppis (Gast)


Lesenswert?

Rubimix schrieb:
> Noppis schrieb:
>> Der Code stammt von mir ! Woher soll der denn sonst stammen?
>> Das ist erstmal 0815 P-I-D Regler Code wie man die Regelung auch in der
>> uni in Regelungstechnik lernt, ich habe es nur in C umgesetzt als
>> Ganzzahl.
> Zumindest sagt Dir an der Uni keiner, dass bei kP=5, kI=0, w=_x=100 die
> PWM einer Geschwindigkeitsregelung auf 0 zurückfallen darf.
> Du nimmst doch auch nicht den Fuß komplett vom Gas, wenn Du auf die
> vorgeschriebenen 100 km/h beschleunigt hast.
> Da passt also etwas an Deinem Programmierten nicht.
> Vielleicht geht's besser mit z.B.:
> https://www.heise.de/ct/artikel/Steuermann-290434.html

In der Uni sagen die einem gar nichts außer wie man sowas berechnet - 
mal eine praktische Anwendung gibt es nie - nur elend lange berechnungen 
mit formeln und variablen. Das ist ja das Problem was ich habe.

Aber du hast Recht, das macht die Regelung. Wie müsste man das den 
besser umsetzen? Gibt es jmd. der einen alternativen Code für einen 
PI(D) Regler hat zum Vergleich?

von Wolfgang (Gast)


Lesenswert?

Noppis schrieb:
> In der Uni sagen die einem gar nichts außer wie man sowas berechnet -
> mal eine praktische Anwendung gibt es nie - nur elend lange berechnungen
> mit formeln und variablen. Das ist ja das Problem was ich habe.

In der Uni solltest du eigentlich lernen, die Formeln selber abzuleiten.

Hast du von deinem System bei offenem Regelkreis die 
Übertragungsfunktion an verschiedenen Arbeitspunkten bestimmt?

von Achim M. (minifloat)


Lesenswert?

Rubimix schrieb:
> Wenn y der neue PWM-Wert sein soll, würde ohne I-Anteil die PWM doch
> ohne Regelabweichung platt auf 0 gestellt.

Nur P-Anteil hat eben einen statischen Regelfehler, das hast du damit 
vollkommen richtig erkannt.

Das Auto-Gaspedal-Paradoxon hinkt leider dadurch, dass du das 
Beschleunigungsverhalten des Autos und die Gaspedalstellung für 
"Geschwindigkeit halten" durch Erfahrung vorher kennst, dadurch schon 
vorher weißt wie weit du das Pedal loslassen darfst. Und das lernt man 
nicht auf der Uni, sondern spätestens in der Fahrschule ;)

Wolfgang schrieb:
> Hast du von deinem System bei offenem Regelkreis die
> Übertragungsfunktion an verschiedenen Arbeitspunkten bestimmt?

Blöd, dass man das in der Praxis nicht an allen Systemen gefahrlos 
machen kann...

mfg mf

: Bearbeitet durch User
von Rubimix (Gast)


Lesenswert?

Noppis schrieb:
> Aber du hast Recht, das macht die Regelung. Wie müsste man das den
> besser umsetzen? Gibt es jmd. der einen alternativen Code für einen
> PI(D) Regler hat zum Vergleich?

Gefühlt könntest Du z.B.
y = (kp * e) ...
durch
y = (kp * w) ...
ersetzen und damit anerkennen, dass es eine direkte Proportionalität 
zwischen PWM und Geschwindigkeit gibt.
(siehe Bild von
Forist schrieb:
> Ein Tabellenkalkulationsprogramm
)
Sei bitte nicht enttäuscht: Das regelungstechnische (und mentale) 
Erlebnis dieser Maßnahme ist eher mickrig. Aber es geht zumindest 
tendenziell in allen Betriebszuständen in die richtige Richtung. Sieh es 
einfach so: Hier wäre der P-Anteil einfach so etwas wie eine 
Voreinstellung, die bei Sollwertänderung die Ausregelgeschwindigkeit 
etwas beschleunigt. Lastwechsel oder das Losbrechmoment des Motors 
bekommst Du damit allerdings nicht ausgeregelt. Das müssen dann I und D 
machen.

Alternativ dazu:
Unter https://www.heise.de/ct/artikel/Steuermann-290434.html steht auch 
ein Code (void speed_control())
Hier werden offensichtlich die errechneten Anteile von P,I,D auf den 
vorherigen Wert der Stellgröße addiert. Das ist damit pro forma schon 
eine Integration.

Damit scheint es also zumindest schon einmal mehrere Wege zum Ziel 
jenseits der baren Theorie zu geben...

... wobei allen Wegen zumindest gemeinsam seien sollte, dass jeder 
einzelne verwendete Regelanteil A) unabhängig von den Anderen in die 
richtige Richtung regelt und B) im Idealfall die anderen Anteile der 
Regelung im Zusammenhang unterstützt, den Regler also schneller oder 
genauer macht.


Achim M. schrieb:
> Nur P-Anteil hat eben einen statischen Regelfehler
Statischer Regelfehler? Also bitte!
Wenn Du unter der Dusche stehst und das Wasser im Wohlfühlpunkt auf kalt 
drehst, weil Deine Regelabweichung gleich null ist, kannst Du das kaum 
als statischen Regelfehler bezeichnen.

von donvido (Gast)


Angehängte Dateien:

Lesenswert?

Achim M. schrieb:
> Nur P-Anteil hat eben einen statischen Regelfehler, das hast du damit
> vollkommen richtig erkannt.

So nicht ganz richtig. Ob es einen statischen Regelfehler gibt oder 
nicht, hängt auch von der zu regelnden Strecke ab. Hat der offende 
Regelkreis ein integrierendes Verhalten, gibt es keinen statischen 
Regelfehler (siehe Anhang).

Rubimix schrieb:
> Statischer Regelfehler? Also bitte!
> Wenn Du unter der Dusche stehst und das Wasser im Wohlfühlpunkt auf kalt
> drehst, weil Deine Regelabweichung gleich null ist, kannst Du das kaum
> als statischen Regelfehler bezeichnen.

Würde ich so nicht unterschreiben, da der Mensch als Regler nicht 
unbedingt als P-Regler agiert.

von Noppis (Gast)


Lesenswert?

Rubimix schrieb:
> Noppis schrieb:
>> Aber du hast Recht, das macht die Regelung. Wie müsste man das den
>> besser umsetzen? Gibt es jmd. der einen alternativen Code für einen
>> PI(D) Regler hat zum Vergleich?
>
> Gefühlt könntest Du z.B.
> y = (kp * e) ...
> durch
> y = (kp * w) ...
> ersetzen und damit anerkennen, dass es eine direkte Proportionalität
> zwischen PWM und Geschwindigkeit gibt.
> (siehe Bild von
> Forist schrieb:
>> Ein Tabellenkalkulationsprogramm

Die Integration mache ich ja auch. Vrmtl. mit dem falschen Wert?
Okay, wenn ich das mache, nutze ich aber doch nicht mehr e als 
differenz?
Es bleibt alles wie es ist an meinem Code nur das e ersetze ich durch w?

von Rubimix (Gast)


Lesenswert?

donvido schrieb:
> Würde ich so nicht unterschreiben, da der Mensch als Regler nicht
> unbedingt als P-Regler agiert.
Der obenstehende Code
y = (kp * e) +...
tut aber offensichtlich genau das für den P-Anteil.
Entsprechend kommt der TO halt jenseits aller theoretischen Modelle auf 
kein praktisches Ergebnis für kp.

von Rubimix (Gast)


Lesenswert?

Noppis schrieb:
> Es bleibt alles wie es ist an meinem Code nur das e ersetze ich durch w?
Ich würde vorschlagen, Du probierst beide genannten Varianten aus und 
vergleichst die Ergebnisse.

von Wolfgang (Gast)


Lesenswert?

Achim M. schrieb:
> Blöd, dass man das in der Praxis nicht an allen Systemen gefahrlos
> machen kann...

Deswegen die Frage, ob der TO bei seinem System tun konnte?

von donvido (Gast)


Lesenswert?

Rubimix schrieb:
> Der obenstehende Code
> y = (kp * e) +...
> tut aber offensichtlich genau das für den P-Anteil.
> Entsprechend kommt der TO halt jenseits aller theoretischen Modelle auf
> kein praktisches Ergebnis für kp.

Ja, das ist, wenn ki=kd=0 ja auch ein P-Regler. Der funktioniert nunmal 
so.
Wenn der Regelfehler e Null ist, soll der P-Regler ja auch nichts 
machen.
Praktische Werte für kp ergeben sich zum Beispiel mit empirischen 
Einstellregeln (z.B. Ziegler-Nicols) oder bei Kompensation von 
Zeitkonstanten (Streckenübertragungsfunktion muss bekannt sein).

von uwe (Gast)


Lesenswert?

PWM output(unsigned und Sättigen)=PWM output(unsigned)+y(signed und 
skalieren und Sättigen)
Bei 8bit PWM Mittelpunkt PWM bei 128 festlegen
Und den sche** mit "is_direction_forward" sein lassen!

Skalieren könnte natürlich schnell unmöglich werden... selbst wenn Kp=5
schon bei 5 Iterationen und Mittelpunkt 128 + Ki +Kp ist der Regler 
schnell im Anschlag mit 8bit.
Besser wären 10-12 Bit PWM. dann kann man feiner Regeln...

Und wie gesagt der Zustand mit der Drehrichtung ändern...
stillstand 128
if (decoder.dcc.sysCond.systemBits.is_direction_forward)
          {
            set_regler_soll(decoder.engine.pwm_soll_regler_right);
            decoder.engine.pwm_soll_right = 
pid_regler(decoder.dcc_gegenEmk);
          }
          else
          {
            set_regler_soll(decoder.engine.pwm_soll_regler_left);
            decoder.engine.pwm_soll_left = 
pid_regler(decoder.dcc_gegenEmk);
          }

von Noppis (Gast)


Lesenswert?

Ich habe jetzt einmal die Zeile für y = (kp * e)... durch (kp * w) 
ersetzt. auf den ersten Blick - kein Unterschied.

Jetzt hierzu für mich: Das wäre aber technisch RICHTIG(ER) es so zu 
machen mit kp * w ODER?

von Noppis (Gast)


Lesenswert?

uwe schrieb:
> PWM output(unsigned und Sättigen)=PWM output(unsigned)+y(signed
> und
> skalieren und Sättigen)
> Bei 8bit PWM Mittelpunkt PWM bei 128 festlegen
> Und den sche** mit "is_direction_forward" sein lassen!
>
> Skalieren könnte natürlich schnell unmöglich werden... selbst wenn Kp=5
> schon bei 5 Iterationen und Mittelpunkt 128 + Ki +Kp ist der Regler
> schnell im Anschlag mit 8bit.
> Besser wären 10-12 Bit PWM. dann kann man feiner Regeln...
>
> Und wie gesagt der Zustand mit der Drehrichtung ändern...
> stillstand 128
> if (decoder.dcc.sysCond.systemBits.is_direction_forward)
>           {
>             set_regler_soll(decoder.engine.pwm_soll_regler_right);
>             decoder.engine.pwm_soll_right =
> pid_regler(decoder.dcc_gegenEmk);
>           }
>           else
>           {
>             set_regler_soll(decoder.engine.pwm_soll_regler_left);
>             decoder.engine.pwm_soll_left =
> pid_regler(decoder.dcc_gegenEmk);
>           }

Ich möchte es technisch verstehen und möchte entsprechend daher auch 
wissen wieso ich das nicht machen soll, DENN:

1. Ich habe eine H-Brücke für rechts/linkslauf
2. Ich brauche mind. 8 Bit PWM (7 bit geht NICHT)
3. Mehr als 8 BIT kann glaube der ATMEGA nicht, das müsste ich im 
Datenblatt nachgucken.


Aber jetzt die große Frage: Warum ist das scheiße mit der 
Fallunterscheidung? Kostet bisschen mehr Speicher okay aber technisch, 
was ist daran auszusetzen?

von Achim M. (minifloat)


Lesenswert?

Rubimix schrieb:
> Achim M. schrieb:
>
>> Nur P-Anteil hat eben einen statischen Regelfehler
>
> Statischer Regelfehler? Also bitte!
> Wenn Du unter der Dusche stehst und das Wasser im Wohlfühlpunkt auf kalt
> drehst, weil Deine Regelabweichung gleich null ist, kannst Du das kaum
> als statischen Regelfehler bezeichnen.

Meine Ausgangsgröße ist die Temperatur, die eine Summation der 
Winkeländerungen des Temperaturknopfes ist. Andererseits ist das ein 
Temperatur_regler_ im Duschhahn, ich drehe also zuerst auf ganz heiß, 
warte bis warmes Wasser kommt und drehe dann zurück auf 
halb-zwei-Stellung. Dort weiß ich dass es für mich passt. Den Rest macht 
der Regler in der Armatur. ;)

Man könnte die Istgeschwindigkeit (EMK) mit einem normierten Faktor 1 
auf den Reglerausgang addieren, damit deinem Genörgel mal ein Ende 
gesetzt wird und zumindest ein sinnvoller Lösungsvorschlag da ist.

Eine Geschwindigkeitsregelung ist keine Duschtemperaturregelung. 
Individuelle Probleme benötigen individuelle Lösungen. Gute Nacht.

mfg mf

von PanneImDenken? (Gast)


Lesenswert?

Noppis schrieb:
> PWM | EMK
> 0   | 0
---
> 223 | 520
kp ist ein uint8?

von MaWin (Gast)


Lesenswert?

Noppis schrieb:
> Ich möchte es technisch verstehen
> Mehr als 8 BIT kann glaube der ATMEGA nicht

Warum liest du das Datenblatt nicht, wenn du es verstehen willst, 
sondern bleibst beim kirchlichen Glauben ?

von Noppis (Gast)


Lesenswert?

MaWin schrieb:
> Noppis schrieb:
>> Ich möchte es technisch verstehen
>> Mehr als 8 BIT kann glaube der ATMEGA nicht
>
> Warum liest du das Datenblatt nicht, wenn du es verstehen willst,
> sondern bleibst beim kirchlichen Glauben ?

Wie schon vermutet, kann er nicht. Brauche ich auch nicht, mit 8 Bit 
sollte es auch gehen

von Noppis (Gast)


Lesenswert?

PanneImDenken? schrieb:
> Noppis schrieb:
>> PWM | EMK
>> 0   | 0
> ---
>> 223 | 520
> kp ist ein uint8?

ja

von uwe (Gast)


Lesenswert?

>2. Ich brauche mind. 8 Bit PWM (7 bit geht NICHT)
Also 8-Bit scheint nur gerade so zu gehen...
Log mal error, PWMout, korrekturwert bei Kp=1/2/3 sowie Kp=0,5/0,25...

von P-Regler (Gast)


Lesenswert?

Mal noch ein weiterer Input. Um den Regler zu entlasten kann man eine 
Vorsteuerung machen. Man baut dabei das vorhandene Wissen ein: welche 
EMK~Geschwindigkeit braucht ungefähr welchen PWM-Wert. Das kennst du aus 
deiner Messung oben. Damit wird ohne zutun des Reglers bereits fast das 
Richtige gemacht.
Den kleineren Fehler kann man nun mit dem Regler ausbügeln. Beim 
Inbetriebnehmen würde ich wie von anderen bereits gesagt, erst nur den 
P-Anteil schreittweise erhöhen, bis es beginnt zu schwingen. Dann eine 
gute Portion zurück nehmen (auf 50...70%) und den I-Anteil langsam 
erhöhen bis es wieder schwingt und wieder einiges zurück nehmen. Das 
wäre die Basis für weitere Optimierungen.

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.