Skocz do zawartości

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


ArturKon

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

@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.

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

@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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.