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

OP #7491671
Lesenswert?
• ▲
▼

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!

#7491679
Lesenswert?
• ▲
▼

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 #7491784
Lesenswert?
• ▲
▼

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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.