motor harde stop vs uitlopen

Ik gebruik dit motorstuurprogramma met 2 van deze motoren om een ​​schroevendrobot te besturen. Om de robot tot stilstand te brengen, gebruik ik deze code:

  analogWrite(MotLPWM, 0);  //coast to stop
  analogWrite(MotRPWM, 0);
  digitalWrite(MotL1, HIGH);
  digitalWrite(MotL2, HIGH);
  digitalWrite(MotR1, HIGH);
  digitalWrite(MotR2, HIGH);

om de robot te laten stoppen, gebruik ik deze code:

analogWrite(M1PWM, 0);
analogWrite(M2PWM, 0);
digitalWrite(M1INA, LOW);
digitalWrite(M2INA, LOW);
digitalWrite(M1INB, LOW);
digitalWrite(M2INB, LOW);

Ik zou graag willen dat de robot stopt en/of remt met iets ertussen, dus het is niet zo moeilijk voor de versnellingen. Het volgende fragment van de hele schets is bedoeld om de motoren 1/4 seconde te laten uitlopen en vervolgens hard te stoppen. Helaas gaat het niet weg en gaat het meteen naar de harde stop. Om het even welke ideeën om het te bevestigen?

    void allStop() {
//COAST
  analogWrite(MotLPWM, 0);  //coast for 1/4 second before fast stop
  analogWrite(MotRPWM, 0);
  digitalWrite(MotL1, HIGH);
  digitalWrite(MotL2, HIGH);
  digitalWrite(MotR1, HIGH);
  digitalWrite(MotR2, HIGH);
//HARD STOP
  if ((millis() - previousCoastMillis) > 250) {
  analogWrite(MotLPWM, 0);  
  analogWrite(MotRPWM, 0);
  digitalWrite(MotL1, LOW);
  digitalWrite(MotL2, LOW);
  digitalWrite(MotR1, LOW);
  digitalWrite(MotR2, LOW);
    previousCoastMillis = millis();
  }
}

De volledige schets is hier:

int ledB = 5;

int MotL1 = 8;
int MotL2 = 7;
int MotLPWM = 9;

int MotR1 = 11;
int MotR2 = 12;
int MotRPWM = 10;

unsigned long previousCoastMillis = 0;
const int coastInterval = 500;

void setup() {
  pinMode(MotL1, OUTPUT);
  pinMode(MotL2, OUTPUT);
  pinMode(MotLPWM, OUTPUT);
  pinMode(MotR1, OUTPUT);
  pinMode(MotR2, OUTPUT);
  pinMode(MotRPWM, OUTPUT);
  pinMode(ledB, OUTPUT);
}

void loop() {
  go();
  allStop();
}


void allStop() {
//COAST
  analogWrite(MotLPWM, 0);  //coast for 1/4 second before fast stop
  analogWrite(MotRPWM, 0);
  digitalWrite(MotL1, HIGH);
  digitalWrite(MotL2, HIGH);
  digitalWrite(MotR1, HIGH);
  digitalWrite(MotR2, HIGH);
//HARD STOP
  if ((millis() - previousCoastMillis) > 250) {
  analogWrite(MotLPWM, 0);  
  analogWrite(MotRPWM, 0);
  digitalWrite(MotL1, LOW);
  digitalWrite(MotL2, LOW);
  digitalWrite(MotR1, LOW);
  digitalWrite(MotR2, LOW);
    previousCoastMillis = millis();
  }
}

void go() {
  analogWrite(MotLPWM, 150);
  analogWrite(MotRPWM, 150);
  digitalWrite(MotL1, HIGH);
  digitalWrite(MotL2, LOW);
  digitalWrite(MotR1, HIGH);
  digitalWrite(MotR2, LOW);
  digitalWrite(ledB, HIGH);
  delay(1000);

}
1

2 antwoord

You are trying to use a mix of delay and millis

In plaats daarvan wilt u een goede toestandsmachine:

void loop(){

    switch (state){
    case GOING: go(); 
       state = WAIT_FOR_COAST; 
       transition = millis();break;

    case WAIT_FOR_COAST: if(millis()-transition > 1000){
            allStop(false);
            state = WAIT_FOR_STOP; transition = millis();
        }
        break;
    case WAIT_FOR_STOP: if(millis()-transition > 250){
            allStop(true);
            state = WAIT_FOR_GO; transition = millis();
        }
        break;
    case WAIT_FOR_GO: if(millis()-transition > 1000){
            allStop(true);
            state = WAIT_FOR_GO; transition = millis();
        }
        break;

    }

}

Verwijder de vertraging in go en gebruik een eenvoudige if-else in de allStop waar parameter == true betekent harde stop en false betekent kust.

Een andere optie is om een ​​extra mosfet te gebruiken om een ​​weerstand over de motor te plaatsen in plaats van deze te kortsluiten (wat de harde stop zal doen). Dat zal het breekmoment verminderen maar verslaat de isolatie van het bord.

1
toegevoegd
Ik vergat commentaar te geven op de vertraging in de go-functie toen ik de code naar dit forum overdroeg. Administratieve fout.
toegevoegd de auteur Harty, de bron

Dit werkt. Wanneer allStop wordt gebeld, wordt previousCoastMillis opnieuw ingesteld. Vervolgens loopt de motor uit terwijl hij 150ms lang in de while-lus vastzit. Dan stopt het hard.

void allStop() {
  previousCoastMillis = millis();
  while (millis() - previousCoastMillis < 150) {
    analogWrite(enA, 0);
    analogWrite(enB, 0);
    digitalWrite(in1, HIGH);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, HIGH);
  }

  analogWrite(enA, 0);
  analogWrite(enB, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}
0
toegevoegd