Hallo Leute, und zwar möchte ich einen Synchronmotor regeln. Dazu baue ich das Modell in Simulink auf, um dann den Regler direkt von Simulink auf mein DUE zu flashen. Zum Ablauf: 1) Istwert vom ADC einlesen jede 1ms. 2) Mit Sollwert vergleichen und die Differenz dem Regler zuführen 3) Ausgangsgröße des Reglers zum DAC weiterleiten. Nun meine Frage: Wie kann ich berechnen, ob denn der Algorithmus auf meinem Arduino in Echtzeit läuft? Gibt es da Begriffe, die man im Internet suchen kann? Ich mein, was ist wenn ich ein Zustandsbeobachter habe, einen komplexen Regler und nehme einen sehr langsamen µC, der es nicht schafft in einer bestimmten Zeit all dies zu erledigen. Freue mich auf eure Antworten.
KimWi schrieb: > Wie kann ich berechnen, ob denn der Algorithmus auf meinem Arduino in > Echtzeit läuft? Dazu müsstest Du im (Dis-)Assembler die Instruktionen zählen, was ziemlich aufwändig ist. Einfacher ist folgendes: - Pin High Setzen - Algorithmus mit Testwert füttern und laufen lassen - Pin Low Setzen Dann sieht man am Oszilloskop die Laufzeit relativ genau. KimWi schrieb: > Ich mein, was ist wenn ich ein Zustandsbeobachter habe, einen komplexen > Regler und nehme einen sehr langsamen µC, der es nicht schafft in einer > bestimmten Zeit all dies zu erledigen Dann ist die Reaktion des µC offensichtlich verzögert. Inwieweit das ein Problem darstellt, kommt ganz auf den konkreten Anwendungsfall an - hier also wie der Steuercode genau aussieht. Ein falsch angesteuerter Motor könnte durchaus Schaden nehmen oder anrichten.
ich hab auf nem STM32F4 mit doppelter Taktfrequenz: 1) Istwert vom ADC einlesen jede 1ms. 2) Mit Sollwert vergleichen und die Differenz dem Regler zuführen (PI-Regler mit Begrenzung) 3) Ausgangsgröße des Reglers zum PWM weiterleiten. laufen. In einer 1µs Task. Einen Synchronmotor wirst Du wahrscheinlich in einer 100us oder 1ms Task regeln. Da wäre bei Dir also alles 50x bis 500x entspanter.
Jim M. schrieb: > Dann ist die Reaktion des µC offensichtlich verzögert. Verzögert ist die Reaktion des µC immer, da das Rechenergebniss immer erst zum nächsten Prozesstakt rauskommt. Wenn der µC zu langsam ist, kann er Eingangswerte nicht prozessieren und es komme Unfug raus.
Immer dasselbe... KimWi schrieb: > in Echtzeit läuft? Definiere doch bitte erstmal Echtzeit, und dann kann man weiter reden...
Kaj schrieb: > Definiere doch bitte erstmal Echtzeit, und dann kann man weiter reden... Die Eingangswerte kommen offenbar mit 1kSa/s rein und sollen offenbar bis zum nächsten Zeitschritt verarbeitet sein. Siehst du in der Beschreibung irgendetwas von externen Ereignissen, auf die in "Echtzeit" reagiert werden müßte. Bevor du solche Standardeinwürfe machst, solltest du prüfen, ob die Frage irgendwie relevant ist.
Jim M. schrieb: > Einfacher ist folgendes: > - Pin High Setzen > - Algorithmus mit Testwert füttern und laufen lassen > - Pin Low Setzen Das ist ein guter Hinweis, nur wie setze ich Pin High bzw. Low ? Dh. wenn ich mein Regler als Blackbox mit einem Input und einem Output betrachte, wann soll genau ein High bzw. Low gesetzt werden? kokoz schrieb: > ich hab auf nem STM32F4 mit doppelter Taktfrequenz: > > 1) Istwert vom ADC einlesen jede 1ms. > 2) Mit Sollwert vergleichen und die Differenz dem Regler zuführen > (PI-Regler mit Begrenzung) > 3) Ausgangsgröße des Reglers zum PWM weiterleiten. Der STM32F4 ist auch sehr leistungsstark. Nutzt du dazu Waijung? Kaj schrieb: > KimWi schrieb: >> in Echtzeit läuft? > Definiere doch bitte erstmal Echtzeit, und dann kann man weiter reden... Z.b. das alles in einer bestimmten Zeitspanne abläuft? Dh. wenn ich weiß ich brauche 1ms zum einlesen, 1ms zum verarbeiten und 1ms zum ausgeben, das alles unter 3ms abläift.
>Nutzt du dazu Waijung?
Wir essen eigentlich selten asiatisch. Ich vertrage das scharfe nicht
so.
"Echtzeit" ist aber in der Regelungstechnik ein normierter Fachbegriff. Bedeutet: Man kann ein Zeitfenster angeben, in dem die Antwort sicher (vom Prozessor) kommt. Der Arduino Due ist für Regelungsaufgaben super. Andere schnelleren Arduino Boards haben schon Linux drauf. Das merks Du, wenn ein PIN-Set und Reset ca 1 ms brauchen.
@kokoz (Gast) >ich hab auf nem STM32F4 mit doppelter Taktfrequenz: >1) Istwert vom ADC einlesen jede 1ms. >2) Mit Sollwert vergleichen und die Differenz dem Regler zuführen >(PI-Regler mit Begrenzung) >3) Ausgangsgröße des Reglers zum PWM weiterleiten. >laufen. In einer 1µs Task. 1us? Kaum zu glauben. Zumal deine PWM wohl eher nicht mit 1 MHz läuft. Und dann wäre eine Regelung mit 1us sinnlos, wenn das Stellglied nicht so schnell reagieren kann.
0815 schrieb: > Andere schnelleren Arduino Boards haben schon Linux drauf. Was hat Arduino mit Linux zu tun? IMHO ist das Arduino Due Board das schnellste Arduino Board und Arduino hat kein Betriebssystem, dass im Hintergrund läuft. KimWi schrieb: > Z.b. das alles in einer bestimmten Zeitspanne abläuft? Wenn das nicht erfüllt ist, ist der Prozessor zu langsam. Echtzeitfähigkeit im Regelungstechnische Sinn dagegen ist eine Frage, die in Zusammenhang mit Multitasking und Betriebssystem auftaucht. Wie lange braucht das System höchstens, um auf ein Ereignis zu reagieren, d.h. wie lange braucht das Betriebssystem des Rechners maximal, um sich darum zu kümmern. Wenn ein Board 1ms braucht, um einen Pin zu setzten, ist das bedauerlich, hat aber mit echtzeitfähig oder nicht erstmal gar nichts zu tun. Auch die Mondautos der Russen wurden per Fernsteuerung von der Erde aus gesteuert und da hatte man als Reaktionszeit (z.B. Hindernis vom Fahrer erkannt -> Steuerbefehl zum Anhalten beim Rover) eine Zeitspanne von mehr als 1 Sekunden durch die Laufzeit der Funkwellen. Aber man konnte sich drauf verlassen, dass gut eine Sekunde, nachdem ein Kommando von der Erde losgeschickt wurde, sich da oben etwas tat. Nicht echtzeitfähig ist, wenn z.B. ein Windows Betriebssystem normalerweise "sofort" auf einen Tastendruck reagiert, manchmal aber derartig mit sich selbst und irgendwelcher Haushaltsführung beschäftigt ist, dass ein Tastendruck gefühlt "endlos" braucht, um abgearbeitet zu werden, das Zeitverhalten im Rahmen des Prozessablaufs also unkalkulierbar wird.
KimWi schrieb: > Jim M. schrieb: >> Einfacher ist folgendes: >> - Pin High Setzen >> - Algorithmus mit Testwert füttern und laufen lassen >> - Pin Low Setzen > > Das ist ein guter Hinweis, nur wie setze ich Pin High bzw. Low ? > Dh. wenn ich mein Regler als Blackbox mit einem Input und einem Output > betrachte, wann soll genau ein High bzw. Low gesetzt werden? Hallo, leider hab ich bis heute keine Rückmeldung. Weis jmd. wie ich in Simulink dies entsprechend umsetzen könnte? Weil den Regler entwickel ich ja in Simulink. Und irgendwie muss ich vor dem Eingang noch ein High-Setzen und nach dem Eingang ein Low.
Einfach mal den fragen, der Dir das Target aufgesetzt hat? Das wird doch wohl normale I/Os bedienen können. Zur Not eben von Hand in den erzeugten Code schreiben:
1 | setup() |
2 | { |
3 | ... |
4 | pinMode(8, OUTPUT); // test! |
5 | ... |
6 | } |
7 | |
8 | loop() |
9 | { |
10 | ... |
11 | digitalWrite(8, HIGH); // test! |
12 | ... |
13 | digitalWrite(8, LOW); // test! |
14 | ... |
15 | } |
Oder welcher I/O auch immer auf dem Teil frei ist. Ich habe hier übrigens gerade was wage ähnliches laufen. Ich lese 5 12 Bit AD-Werte ein, bilde recht stumpf einen Mittelwert über die letzten 32 Werte, berechne da diverse Werte draus in Floating Point, werfe einen Paramter direkt auf einen DAC raus (mit Umrechnung von Float auf Integer) und mache über einen zweiten DAC eine primitive Regelung. Ach ja, ein Drehimpulsgeber für die manuelle Einstellung hängt da auch noch dran. Das ganze braucht so 1,2 ms - auf einem Arduino mini mit 16 MHz! Dabei sind ADC und DAC extern per SPI angebunden, die laufen mit 4 MHz. Dazu noch nen 5" TFT mit FT800 an SPI mit 8 MHz und ich lande bei 1,4ms im Schnitt für den Umlauf.
Vielen lieben Dank für deine Antwort! Ich hätte es zwar direkt gerne mal in Simulink gemacht, aber zur Not in Code.
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.