arduino multitasking mit freeRtos

Gast #4492350
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?
Gast #4492358
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.
Gast #4492373
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.
Gast #4492387
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.
Gast #4492402
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.
Gast #4492476
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren