Skocz do zawartości

Arduino + L293D - PWM działa niepoprawnie poprzez ENABLE 2


Pomocna odpowiedź

Napisano

Cześć,

montuję układ za pomocą Arduino + L293D. Do tego podłączam 2 silniki DC 3-6V.

Aktualnie układ do silników posiada zewnętrzne zasilanie z koszyczka 4 x 1.5V. Arduino w tej fazie zasilam z USB podczas testowania projektu.

Mój problem polega na tym, że chcę użyć pinów ENABLE 1 oraz ENABLE 2 do sterowania napięciem wyjściowym do silników.

używam do tego pinów 5 (ENABLE 1) i 6 (ENABLE 2) + 4 pinów I/O:

int circuitOneEnablePin = 5; // PWM pin
int circuitOneInput1Pin = 2; // HIGH/LOW pin
int circuitOneInput2Pin = 4; // HIGH/LOW pin

int circuitTwoEnablePin = 6; // PWM pin
int circuitTwoInput3Pin = 12; // HIGH/LOW pin
int circuitTwoInput4Pin = 13; // HIGH/LOW pin

Napisałem prosty program do testowania, który co 50 ms zmienia mi wartość PWM co 1 w przedziale 0-255 i po przekroczeniu przedziału silniki zmieniają kierunek prądu:

delay(50);

if (debugPwmInc) {
  if (debugPwm < 255) {
    debugPwm++;
  } else {
    debugPwmInc = false;
  }
} else {
  if (debugPwm > 0) {
    debugPwm--;
  } else {
    debugPwmInc = true;
    debugMotorInverted = !debugMotorInverted;
  }
}

Następnie oba silniczki ustawiam identycznie, czyli oba silniczki chodzą w tym samym kierunku i z tym samym wypełnieniem PWM:

// circuit DEBUG
  digitalWrite(circuitOneInput1Pin, debugMotorInverted ? LOW : HIGH);
  digitalWrite(circuitOneInput2Pin, debugMotorInverted ? HIGH : LOW);
  analogWrite(circuitOneEnablePin, debugPwm);

  digitalWrite(circuitTwoInput3Pin, debugMotorInverted ? LOW : HIGH);
  digitalWrite(circuitTwoInput4Pin, debugMotorInverted ? HIGH : LOW);
  analogWrite(circuitTwoEnablePin, debugPwm);

Efekt tego jest taki, że silniczek pod INPUT 1/2 i ENABLE 1 dziala bez zarzutu, prędkość obrotowa zmienia się zgodnie z podaną wartością PWM oraz silniczek kręci się w odpowiednim kierunku. Podczas pomiaru napięcia na OUTPUT1/2 widzę zmianę wartości napięcia z 6V do 0V następnie do -6V i tak w kółko.

Problem występuje z układem pod INPUT 3/4 i ENABLE 2. Wartość napięcia wyjściowego jest non stop 6V i zmienia się tylko wtedy, gdy zmienia się kierunek prądu (z + na - na mierniku). Tak jakby w ogóle ten ENABLE 2 nie działał i nie wypływał na napięcie dla drugiego silnika.

Dodam tez, że układ ten zmontowałem jakiś czas temu. Następnie rozmontowałem go całkowicie i złożyłem ponownie, wykorzystując dla testów jednak INPUT1/2 i 3/4 jako PWM (widziałem, że niektórzy też tak robią) i tym sterowałem napięcie - działało bez zarzutu, ale niestety potrzebuję do mojego układu poza silniczkami pozostałe 4 piny PWM, więc na silniczki mogę wykorzystać tylko 2 (5 i 6). Złożyłem więc z powrotem układ z wykorzystaniem ENABLE 1 i 2 i problem jest ten sam co na początku. Czy ktoś spotkał się z takim przypadkiem, że ENABLE 1 działał poprawnie, zaś ENABLE 2 nie? Dodam, że mam kilka L293D i wymieniałem go w układzie myśląc, że może się spalił, niestety pudło.

@ArturKon, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 11.02.2019 o 20:09, ArturKon napisał:

Problem występuje z układem pod INPUT 3/4 i ENABLE 2. Wartość napięcia wyjściowego jest non stop 6V i zmienia się tylko wtedy, gdy zmienia się kierunek prądu (z + na - na mierniku). Tak jakby w ogóle ten ENABLE 2 nie działał i nie wypływał na napięcie dla drugiego silnika.

Pokaż cały program, bo takie pokazywanie kawałków utrudnia znalezienie błędu. Twój problem może leżeć w zupełnie innym miejscu np. jakaś inna biblioteka może blokować wykorzystanie PWM na danym pinie.

(edytowany)

Witaj Treker, dziękuję za ciepłe przyjęcie.

Rozłączyłem wszystko, podłączyłem tylko i wyłącznie część układu odpowiedzialną za drugi obieg w L293D (INPUT 3/4 + ENABLE 2). Napisałem też nowy program (poniżej cały kod):

///// simple PWM L293D tester

const int PIN_INPUT_A = 12;
const int PIN_INPUT_B = 13;
const int PIN_ENABLE_PWM = 6;

const int DELAY_LENGTH = 4000;

void setup() {
  // put your setup code here, to run once:

  pinMode(PIN_INPUT_A, OUTPUT);
  pinMode(PIN_INPUT_B, OUTPUT);
  pinMode(PIN_ENABLE_PWM, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  // LEFT - HALF POWER
  engineDirection(PIN_INPUT_A, PIN_INPUT_B, 'L');
  writePwm(PIN_ENABLE_PWM, 128);
  Serial.println("L - 128");
  delay(DELAY_LENGTH);  
  
  // LEFT - FULL POWER
  engineDirection(PIN_INPUT_A, PIN_INPUT_B, 'L');
  writePwm(PIN_ENABLE_PWM, 255);
  Serial.println("L - 255");
  delay(DELAY_LENGTH);
  
  // STOP
  engineDirection(PIN_INPUT_A, PIN_INPUT_B, 'S');
  writePwm(PIN_ENABLE_PWM, 0);
  Serial.println("S");
  delay(DELAY_LENGTH);
  
  // RIGHT - HALF POWER
  engineDirection(PIN_INPUT_A, PIN_INPUT_B, 'R');
  writePwm(PIN_ENABLE_PWM, 128);
  Serial.println("R - 128");
  delay(DELAY_LENGTH);
  
  // RIGHT - FULL POWER
  engineDirection(PIN_INPUT_A, PIN_INPUT_B, 'R');
  writePwm(PIN_ENABLE_PWM, 255);
  Serial.println("R - 255");
  delay(DELAY_LENGTH);
  
  // STOP
  engineDirection(PIN_INPUT_A, PIN_INPUT_B, 'S');
  writePwm(PIN_ENABLE_PWM, 0);
  Serial.println("S");
  delay(DELAY_LENGTH);
}

void writePwm(int pin_pwm, int value) {
  analogWrite(pin_pwm, value);
}

void engineDirection(int pin_a, int pin_b, char direction) {
  switch (direction) {
    case 'L':
      digitalWrite(pin_a, HIGH);
      digitalWrite(pin_b, LOW);
      break;
    case 'R':
      digitalWrite(pin_a, LOW);
      digitalWrite(pin_b, HIGH);
      break;
    default:
      digitalWrite(pin_a, LOW);
      digitalWrite(pin_b, LOW);
      break;
  }
}

Efekt ten sam: niezależnie czy podaję na PIN ENABLE '128' czy '255' - napięcie wyjściowe jest to samo. Co najciekawsze, jeśli przepnę te przewody pod pierwszy obieg L293D (INPUT 1/2 + ENABLE 1) wszystko działa poprawnie.

Edytowano przez ArturKon

@ArturKon spróbuj całkiem wyrzucić mostek i podłącz do tych PWM zwykłe diody świecące. Zobacz czy zmiana wypełnienia PWM w programie wpływa na jasność świecenia diod. Pamiętaj tylko o rezystorach przy diodach 😉 Wykluczymy wtedy uszkodzenie Arduino.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...