Forum: Mikrocontroller und Digitale Elektronik ESP32 S2 mini mit regelmäßiger Verzögerung im loop


von Jörn G. (jrn_g)


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!

von Eduard I. (eiten)


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?

von Harald K. (kirnbichler)


Lesenswert?

Timingkritische Dinge sollte man mit einem Timerinterrupt auslösen, 
statt mit "delay" zu warten.

Siehe auch die Diskussion hier:

Beitrag "Arduino - zeitkritische Signale"

von Steve van de Grens (roehrmond)


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.

von Jörn G. (jrn_g)


Lesenswert?

Vielen lieben Dank Euch Dreien! Ich habe verstanden was das Problem war 
und gelernt wie man Hardware Timer nutzt. Das hat etwas gedauert. Falls 
noch jemand mit so wenig Vorkenntnissen Hardware Timer nutzen möchte, 
empfehle ich https://www.youtube.com/watch?v=LONGI_JcwEQ zu schauen und 
auch die code snippets von pcbreflux auf github zu studieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.