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

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