Forum: Mikrocontroller und Digitale Elektronik arduino multitasking mit freeRtos


von sutance (Gast)


Lesenswert?

Hi ich habe eine Frage.
Mein Ziel ist es während ich einen Motor steuere gleichzeitig einen 
Sensor zu messen. Dafür brauche ich ja eine Multitasking system.
wenn ich auf einen Arduino FreeRtos installiere könnte das doch klappen 
oder?

freundliche Grüße
sutance!

von MrLausH (Gast)


Lesenswert?

Hi,

kommt auf deinem Steueralgorithmus an.

Wenn du den zB mit nem FOC-Algorithmus versuchst hast du ja quasi einen 
PWM Takt zeit dein Reglung zu berechnen.

Was für einen Sensor willst du denn auslesen oder abfragen?

von Marc S. (marc_s86)


Lesenswert?

das ist völlig übertrieben. programmier es einfach in c und fertig.

von Peter II (Gast)


Lesenswert?

Marc S. schrieb:
> das ist völlig übertrieben. programmier es einfach in c und fertig.

auch freeRtos wird in C programmiert.

> Dafür brauche ich ja eine Multitasking system.
nein. Auch ein Multitasking-System macht dinge nacheinander wenn nur 
eine CPU vorhanden ist. Das gleiche kannst du auch ohne Multitasking 
erreichen.

> ich auf einen Arduino FreeRtos installiere könnte das doch klappen
> oder?
vermutlich, aber der aufwand wird wohl recht groß sein.

von sutance (Gast)


Lesenswert?

Luftdurchflussmessung muss gemessen werden

von sutance (Gast)


Lesenswert?

Also wenn ich dann zum Beispiel einen Raspberry mit mehreren Kernen 
nehmen kann der gleichzeitig den Motor steuern und Sensordaten lesen?
Danke

von MrLausH (Gast)


Lesenswert?

Also wie meine Vorredner schon erwähnt wird es ja eh alles nach einander 
ausgeführt.

Je nach PWM Frequenz und Taktfrequenz des Prozessors müsste es aber 
locker hinhauen so nen Luftmengen Sensor zB via SPI auszulesen.

von Peter II (Gast)


Lesenswert?

sutance schrieb:
> Also wenn ich dann zum Beispiel einen Raspberry mit mehreren Kernen
> nehmen kann der gleichzeitig den Motor steuern und Sensordaten lesen?

klar kann man das, aber das kann man auch ohne mehre Kerne.

von MrLausH (Gast)


Lesenswert?

Ich mach mal ein sehr grobes Beispiel.

Sagen wa mal du hast ne 20 kHz PWM und du willst mit ner FOC regeln.
Dh. du musst sehr oft den Strom messen am besten in jedem PWM Takt alle 
drei Phasenströme. Dafür hast du dann 1 /20kHz Zeit. und jetzt rechne 
mal wie viele Instruktions du da zwischen bekommst.

von Stefan F. (Gast)


Lesenswert?

FreeRTOS lässt sich vermutlich nur mit erheblichem Aufwand in das 
Ardunio System einbringen. Ich denek, dass du diese simple Aufgabe auch 
selbst erledigen kannst.

Zum Beispiel so:
1
unsigned long interval;
2
3
void setup
4
{
5
    interval=millis()/10 +1;
6
}
7
8
void loop() 
9
{
10
    query_my_sensors();
11
    control_the_motor();
12
13
    // wait until end of interval
14
    while (millis()/10 < interval) {};
15
    interval++;
16
}

In der Setup Routine holst du dir die Systemzeit, teilst sie durch 10 
und addierst 1. Das nächste Intervall ist dann in 10ms.

In der Hauptschleife fragst du zuerst die Sensoren ab und speicherst 
ihre Zustände in irgendwelchen Variablen.

Dann rufst du die Motorsteuerung auf. Sie reagiert womöglich auf die 
Werte in den Sensor-Variablen.

Dann wartest du auf das Ende des ersten Intervalls.
Dann incrementierst du den Intervall-Zähler und wiederholst die 
Hauptschleife.

Diese Art von Intervall-Berechnung stellt sicher, dass die Hauptschleife 
exakt alle 10ms wiederholt wird. Vorgesetzt ist natürlich, dass die 
beiden aufgerufenen Funktionen selbst nicht mehr als 10ms in Anspruch 
nehmen.

Die Motorsteuerung würde ich als Zustandsautomat (google danach) 
entwickeln. Ein PID Algorithmus ist damit relativ geradlinig umsetzbar.

von Marc S. (marc_s86)


Lesenswert?

Peter II schrieb:
> Marc S. schrieb:
>> das ist völlig übertrieben. programmier es einfach in c und fertig.
>
> auch freeRtos wird in C programmiert.

ich habe ja nicht gesagt nimm etwas was in C programmiert ist, sondern 
programmier es in C.

ich glaube ein OS macht nur unnötigen overhead bei so einer simplen 
aufgabe.

von Sascha (Gast)


Lesenswert?

Das schreit nach normaler Interruptprogrammierung, nicht nach nem OS.

Das wichtige (Echtzeit) Zeug wird in einer hoch priorisierten 
Interruptroutine ausgeführt, der Rest in main(). Interruptreihenfolge 
steht im Datenblatt.

Ggf. kann man sich noch n void* Array machen und das der Reihe nach 
durchgehen. Aber die Aufgabe hört sich dafür eigentlich nicht 
kompliziert genug an.

von Uwe (Gast)


Lesenswert?

Arduino, multitasking.... Sowas kann nur von einem Arduinolaner 
kommen...

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.