Forum: Mikrocontroller und Digitale Elektronik Arduino DUE echtzeitregelung 84 MHz ausreichend?


von KimWi (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von kokoz (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Kaj (Gast)


Lesenswert?

Immer dasselbe...

KimWi schrieb:
> in Echtzeit läuft?
Definiere doch bitte erstmal Echtzeit, und dann kann man weiter reden...

von W.A. (Gast)


Lesenswert?

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.

von KimWi (Gast)


Lesenswert?

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.

von kokoz (Gast)


Lesenswert?

>Nutzt du dazu Waijung?
Wir essen eigentlich selten asiatisch. Ich vertrage das scharfe nicht 
so.

von 0815 (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von KimWi (Gast)


Lesenswert?

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.

von Rudolph (Gast)


Lesenswert?

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.

von KimWi (Gast)


Lesenswert?

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