ESP32-WROOM-32 PWD с миллисом

#arduino #esp32

Вопрос:

Новичку в Arduino и ESP-32 нужна помощь.

Здравствуйте вместе, я использую носитель драйвера двигателя Pololu — VNH5019 для управления двигателем 12 В с помощью ESP32. В следующем наброске я могу ускоряться и ускоряться по пандусу с задержкой();. Я попытался заархивировать тот же результат с помощью millis(), но до сих пор мне это не удавалось. Чего мне не хватает в моем коде.

Заранее спасибо.

 #define MOTOR_IN1         27
#define MOTOR_IN2         16
#define PWMPIN            14
#define frequency         40000
#define resolutionbit     8

const unsigned long eventInterval = 30;
unsigned long previousTime = 0;

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);
  pinMode(MOTOR_IN2, OUTPUT);
  ledcAttachPin(PWMPIN, 0);  // assign the speed control PWM pin to a channel
  ledcSetup(0, frequency, resolutionbit);
}

void loop() {
  //with_delay();
  with_millis();
}
//------------------------------------------
void with_delay() {
  // set direction
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);

  // ramp speed up
  for (int i = 0; i <= 255; i  ) {
    ledcWrite(0, i);
    delay(30);
  }
  // ramp speed down
  for (int i = 255; i >= 0; i--) {
    ledcWrite(0, i);
    delay(30);
  }
}
//-------------------------------------------
void with_millis() {
  unsigned long currentTime = millis();

  if (currentTime - previousTime >= eventInterval) {
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    for (int i = 0; i <= 255; i  ) {
      ledcWrite(0, i);
      previousTime = currentTime;
    }
  }
  if (currentTime - previousTime >= eventInterval) {
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    for (int i = 255; i >= 0; i--) {
      ledcWrite(0, i);
      previousTime = currentTime;
    }
  }
}

 

Ответ №1:

Ваша проблема в том, что программа застревает в for loop .

  • Вам также нужно создать direction переменную, чтобы программа знала, какую if statement из них выполнять.
  • Вам нужно создать какую-то другую логику, которая увеличит i переменную без остановки всей программы.

Код:

 //Initialize the i variable globaly:
int i = 0;
bool direction = 0;


//Your function:
void with_millis() {
  unsigned long currentTime = millis();

  if ((currentTime - previousTime >= eventInterval) amp;amp; direction == true) {
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    i  ;
    if (i <= 255) {
      ledcWrite(0, i);
      previousTime = currentTime;
    } elif (i > 255) {
      i = 0;
      direction = false;
    }
  }

  if ((currentTime - previousTime >= eventInterval) amp;amp; direction == false) {
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    i  ;
    if (i <= 255) {
      ledcWrite(0, i);
      previousTime = currentTime;
    } elif (i > 255) {
      i = 0;
      direction = true;
    }
  }
}
 

Комментарии:

1. Большое спасибо за ваш ответ и помощь . Это именно то, что я пытался выяснить.