W poprzednim poście o czołgu (zob. CZOŁG (ARDUINO + LM298 + BLUETOOTH) miałem problem z ustawianiem prędkości obrotowej silników. Moduł, który używam z Arduino, posiada 6 wejść sterujących:
- IN1 i 2 – dla pierwszego silnika, włączające go, zatrzymujące i wymuszające kierunek,
- IN3 i IN4 – dla drugiego silnika,
- EN1 i EN2 sterujące prędkościami silników.
Problemy pojawiły się przy wykorzystaniu pinów EN1 i EN2. Dopóki były zwarte do płytki – wszystko było ok. Ale wtedy silniki obracały się z pełną szybkością. Wszelkie próby sterowania PWM kończyły się… dziwnym zachowaniem. Silniki nie obracały się, albo obracały się – ale bardzo nieregularnie.
Więcej o budowie czołgu?
Seria tekstów o budowie czołgu składa się z:
- Czołg (Arduino + lm298 + Bluetooth)
- Czołg: zarządzanie prędkością (ten tekst)
- Czołg: zarządzanie zasilaniem (w trakcie)
- Czołg: nawigacja w przestrzeni (w trakcie)
- Czołg: aplikacja Android (w trakcie)
W teorii na piny EN1 i EN2 można podać sygnał PWN. Szybkość obracania się silników będzie zależała wtedy od stopnia wypełnienia sygnału (duty). W Ardunio UNO sygnał PWM generowany jest na piny:
- 3, 9, 10, 11: 490 Hz
- 5 i 6: 980 Hz
Niestety ani kombinacje częstotliwości ani inne czary nie działały.
Ale o co chodzi?!
Podłączyłem EN1 i EN2 do generatora sygnału (Siglent 810). I tu sytuacja się nie zmieniła – różne częstotliwości, czasy narastania przebiegów, wypełnienia – w żadnej kombinacji nie działało.
Dopóki…
Obniżyłem napięcie generowanych przebiegów do 3.3v. I nagle – wszystko zaczęło działać jak należy. Trochę zbity z tropu i zaskoczony zmierzyłem napięcie na pinie, do którego zwiera się EN1 i EN2 – i wyniosło… 3.8v. Ok, mimo że instrukcja mówi o tym, że moduł pracuje z Arduino i posługuje się logiką 5v – czyżby to nie była prawda?
Rozwiązanie
W końcu znalazłem dokumentację modułu:) Problem leżał w sposobie, w jaki zasiliłem układ. Silniki w wanience wytrzymują tylko 5v. Stąd ubec ustawiony na 5v. Tu pasuje. Ale lm298 ma osobny pin Vss zasilający logikę. W module podłączony jest do bloku 5v (wtedy należy usunąć jumper „5v enable”) lub z VCC (zasilanie silników) do regulatora 7805 – wtedy 5v jest wyjściem, nie wejściem (jumper włożony). 7805 'kradnie’ trochę napięcia – stąd 3.8v na logice gdy zasilam ją z 5v ubec. 3.8v to za mało do zasilenia logiki – lm298 wymaga 4.5 – do max 7v na pinie Vss. Co więcej, Arduino podawało logikę na poziomie 5v. I to niedopasowania mogło również sprawiać kłopoty.
Rozwiązanie? Wystarczy wyjąć jumper J8 (5v Enable) i podłączyć zasilanie z UBEC na port 5v oraz silników – oznaczony 12v. Logika i silniki zasilane są bezpośrednio z ubec.
Testy
No wreszcie silniki zaczęły pracować jak powinny:) 490HZ z pinów Arduino wystarcza w zupełności. Oczywiście wypełnienie PWM musi być odpowiednio dobrane – poniżej pewnego poziomu silniki nie ruszą. U mnie było to 160%, czyli:
1 2 |
analogWrite(EN1, 160); analogWrite(EN2, 160); |
100% oznacza maksymalną moc.
1 2 |
analogWrite(EN1, 255); analogWrite(EN2, 255); |
Wnioski?
Warto czytać dokumentację:)
Źródła
- http://www.handsontec.com/dataspecs/L298N%20Motor%20Driver.pdf