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.
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.
"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.