arduino multitasking mit freeRtos

Gast #4492341
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!
Gast
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.