Skocz do zawartości
ArturKon

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

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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

Sprawdziłem użycie pinu 6 w połączeniu z diodą. PWM bezproblemowo steruje napięciem na diodzie.

Udostępnij ten post


Link to post
Share on other sites

@ArturKon wychodzi na to, że w takim razie jakoś uszkodziłeś mostek H - mało prawdopodobne, ale możliwe 😞

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...