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
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
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
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
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
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
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?
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
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
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
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
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?
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
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?
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
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.
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.
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.
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
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?
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?
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
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.
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.
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?
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.
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.
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?
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).
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 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?
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?
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
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 ?
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
>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...
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.