ESP32 S2 mini mit regelmäßiger Verzögerung im loop

OP #7491671

Hallo, ich steuere mit einem ESP23 S2 mini und einem DRV8825 einen Nema 17 an. Ca. alle 4 Sekunden kommt es zu einer Störung/Verzögerung im loop-Ablauf, und der Lauf des Motors ändert sich für einen ganz kurzen Moment hörbar. Dieses Verhalten zeigt sich auch, wenn der ESP nicht seriell verbunden ist. Der Code sieht folgendermaßen aus:

1
const byte MOTOR_DIR_PIN = 11;
2
const byte MOTOR_STEP_PIN = 9;
3
const byte MOTOR_PAUSE_PIN = 1;
4
int actual = 20;
5

6
void setup() {
7
    pinMode(MOTOR_PAUSE_PIN,OUTPUT);
8
    pinMode(MOTOR_STEP_PIN,OUTPUT);
9
    pinMode(MOTOR_DIR_PIN, OUTPUT);
10
    digitalWrite(MOTOR_DIR_PIN,LOW);
11
    digitalWrite(MOTOR_PAUSE_PIN,HIGH);
12
}
13

14
void loop() {
15
    pump();
16
}
17

18
void pump() {
19
//  for ( ;; ) {
20
    digitalWrite(MOTOR_STEP_PIN,HIGH);
21
    delayMicroseconds(actual);
22
    digitalWrite(MOTOR_STEP_PIN,LOW);
23
    delayMicroseconds(actual);
24
//  }
25
}

Wenn ich die for-Schleife in der pump Funktion auskommentiere, läuft der Motor wie erwartet ganz gleichmäßig.

Da ich gerne mit TCmenu arbeite, ist die for-Schleife keine gangbare Lösung.

Kann mir jemand sagen, woran die beobachtete Störung/Verzögerung liegt und ob es eine Möglichkeit diese zu unterbinden, wenn der Motor direkt aus dem loop heraus angesteuert wird.

Vielen Dank und beste Grüße!

Das liegt wohl daran, wie in der Main die Loop aufgerufen wird:

1
void loopTask(void *pvParameters)
2
{
3
    setup();
4
    for(;;) {
5
#if CONFIG_FREERTOS_UNICORE
6
        yieldIfNecessary();
7
#endif
8
        if(loopTaskWDTEnabled){
9
            esp_task_wdt_reset();
10
        }
11
        loop();
12
        if (serialEventRun) serialEventRun();
13
    }
14
}

Hast du schon mal versucht, Dein pump() als eigenen Task laufen zu lassen?

Gast

Eduard I. schrieb:

Das liegt wohl daran, wie in der Main die Loop aufgerufen wird

Genau. In der Main Loop wird nämlich auch noch das "Betriebssystem" des ESP ausgeführt, welches Zeit zur Bedienung der WLAN Schnittstelle braucht. Das gilt auch, wenn man gerade gar nichts aktiv sendet oder empfängt.

Für ungestörtes Timing wirst du wohl Hardware-Timer benutzen müssen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 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.