Elektroda.pl
Elektroda.pl
X
BotlandBotland
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino Mega2560 - robot, sterowanie przerwaniami silnikami DC

20 Maj 2015 21:52 1821 22
  • Poziom 10  
    Przygotowałem układ oparty na Arduino Mega 2560 sterujący poprzez mostek H L298N dwoma silnikami DC. Pracujące silniki przez transoptory generują impulsy które z kolei wywołują przerwania, licznik w programie zlicza te impulsy i przez zadany okres silniki pracują, następnie się zatrzymują. Dodatkowo na wyświetlaczu widzę impulsy zadane i aktualnie zliczane. Program wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Działa wszystko "prawie" idealnie. Kłopot z którym nie mogę sobie poradzić polega na tym, że silniki startują dopiero kiedy ręcznie wywołam przerwanie. Chciałbym aby najpierw startował silnik "A" odliczył 50 impulsów, następnie silnik "B" odliczył 10 impulsów i ta sekwencja powinna się powtarzać w pętli ale np z inną ilością impulsów czy kierunkiem obrotów. Będę wdzięczny za wszelką pomoc bo mojej wiedzy nie wystarcza.
  • BotlandBotland
  • Poziom 25  
    1. Schemat.
    2. Stosuj w programie nazwy które coś znaczą.
    3. W przerwaniu chciałeś liczyć impulsy a obsługujesz w nim silnik, wyświetlacz itd.
    4. Program wklejaj w znacznikach.
  • Poziom 10  
    Rysowanie schematu było by pewnie trochę kłopotliwe, a cały układ sprowadza się - pomijając wyświetlacz LCD - do wyjść na dwa silniki i dwóch wejść na przerwania. i Tak : Piny 23, 24 wyjście silnik A +Pin 8 wyjście PWM dla tego ślinika. Piny 25, 26 wyjście silnik B +Pin 9 wyjście PWM dla tego ślinika.
    Piny 2 i 3 są to wejścia sygnałów do przerwań z transoptorów. Jestem świadom, że nie jest to poprawnie napisane i właśnie w tej kwestii chciałem uzyskać jakaś podpowiedź od specjalistów.
  • Poziom 25  
    1. Kolego pomóż sobie i innym i stosuj się do porad. Jeśli nie chcesz/nie umiesz/nie możesz narysować schematu to koniecznie zmień nazwy zmiennych których używasz z np. in1 na taką jaką ma rolę czyli np. silnik_A_start. Zrób to dla wszystkich zmiennych a od razu będzie się to lepiej czytać.
    2. Usuń wszystko z obsługi przerwania poza liczeniem impulsów enkodera. Cała reszta powinna być w pętli głównej.
    3. Przygotuj program do obsługi tylko jednego silnika - jak zadziała to wstawisz drugi.
  • Specjalista - Mikrokontrolery
    Na moje oko funkcja loop nie robi nic, a w każdym razie nie wywołuje żadnej procedury.
  • Poziom 10  
    Trochę przerobiłem jak Kolega podpowiadał. Przeniosłem licznik do oddzielnej funkcji wywoływanej przerwaniem, zmieniłem nazwy zmiennych, ale w innych miejscach coś musiałem skopać bo licznik "pulsuje" a silnik nie rusza. Składnia przerwania jest w/g instrukcji to raczej tak powinno być. Nie mam pojęcia jak to rozgryźć.
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 25  
    Wgraj poniższy program, otwórz monitor portu, kręć silnikiem który ma eknoder podpięty do pinu 2(lub impulsuj ręcznie) i patrz co się dzieje. Jak zrozumiesz jak to działa to reszta programu to pestka.
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • BotlandBotland
  • Poziom 10  
    Nie wiem też dlaczego pomimo jednego impulsu licznik zlicza po kilkadziesiąt naraz? W transoptorze nie ma odbicia styków to raczej powinien zliczać pojedynczo.
    Arduino Mega2560 - robot, sterowanie przerwaniami silnikami DC
  • Poziom 25  
    Zmień
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    na
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Ten rezystor podciągający przy enkoderze najprawdopodobniej przeszkadza(przy zadawaniu impulsów z "palca" jest niezbędny).
  • Poziom 10  
    Po zmianie jest chyba gorszy efekt. Transoptor przy wolnej zmianie stanu w ogóle nie reaguje, cały czas wyświetlane jest "0" na monitorze szeregowym. Przy szybkim generowaniu impulsów z uruchomionego silnika, liczy z kolei bardzo wolno, jakby sekundy i dioda nie reaguje. Jak przełączę na impulsy z "palca" to już zupełnie nie wiadomo co zlicza. Nawet nie dotykam przełącznika, a zlicza setki. Podobny efekt miałem kiedy próbowałem zrobić licznik nie na przerwaniach, tylko zaczytując "stan wysoki" z jakiegoś pinu, to też bardzo niestabilnie zliczało mi nie wiadomo co. Pozmieniałem też parametr w przerwaniach na LOW, HIGH i RISING, ale to jeszcze gorzej. Już mnie głowa boli :(
  • Poziom 25  
    Jeśli podajesz impulsy z palca to musi być INPUT_PULLUP.
  • Poziom 10  
    Z "palca" tylko przy testach, docelowo będą sygnały z transoptorów. Nadal jednak nie wiem co jest nie tak, może koncepcja jest niewłaściwa i nie da się tego tak zrobić?
  • Poziom 25  
    A jest lepiej gdy podajesz z palca i masz ustawiony PULLUP?
    Generalnie jeśli częstotliwość impulsów jest duża to lepiej zliczać je na timerach i przerwanie generować od przepełnienia timera.
  • Poziom 10  
    Może trochę lepiej z palca ale i tak zalicza po kilkadziesiąt impulsów.
    Arduino Mega2560 - robot, sterowanie przerwaniami silnikami DC
  • Poziom 25  
    Pierwotna wersja pięknie liczy bo założyłeś "kaganiec" na zliczanie(Twoja "korekta odbicia styków"). Drganie styków filtruje się w przypadku urządzeń mechanicznych(przycisk, styk). Oczywiście można to tutaj też zastosować ale lepiej wyjaśnić skąd się bierze tak dużo impulsów i dopiero zastosować jakieś lekarstwo. Tylko do tego potrzebny jest schemat.
  • Poziom 10  
    Mam nadzieje, że schemat trochę rozjaśni temat. Na schemacie są dwa transoptory a faktycznie jest jeden mikrowyłacznik, ale docelowo będą transoptory.

    Arduino Mega2560 - robot, sterowanie przerwaniami silnikami DC



    Edytuj
  • Poziom 25  
    Kolego jaja sobie robisz czy chcesz pomocy? Problem masz teraz a więc podaj aktualny schemat a nie docelowy.
    Impulsy na diodę idą z zasilania!!!!????
  • Poziom 10  
    Zasilanie na mostku L298N może być na inny pin (nie znalazłem odpowiedniego w bibliotece) ale to chyba nie ma znaczenia.
    Arduino Mega2560 - robot, sterowanie przerwaniami silnikami DC
    Teraz już tak jak powinno być.
  • Poziom 25  
    Przejrzyj schematy i odpowiedz na pytanie czego brakuje przy diodzie?
    Mostek zasilasz z tego samego napięci co arduino? Jeśli tak to tu może być problem.
    I narysuj ten schemat tak jak jest w rzeczywistości bo z tego nie wynika skąd przychodzą impulsy.
    Na znanym portalu aukcyjnym za ~40zł można kupić analizator stanów logicznych. Może on coś pomoże wyjaśnić co dzieje się z impulsami.
  • Moderator Mikrokontrolery Projektowanie
    namok napisał:
    Przejrzyj schematy i odpowiedz na pytanie czego brakuje przy diodzie?

    lub przeczytaj: http://mikrokontrolery.blogspot.com/2011/03/Dioda-LED-obliczanie-rezystora-kalkulator.html


    namok napisał:
    Na znanym portalu aukcyjnym za ~40zł można kupić analizator stanów logicznych. Może on coś pomoże wyjaśnić co dzieje się z impulsami.

    ... a z Chin z darmową dostawą za około 24zł.
  • Poziom 10  
    Dziękuję za uwagi, poprawiłem schemat i myślę że teraz już jest dobrze. Mostek jest zasilany z oddzielnego źródła więc nie obciąża kontrolera. Transoptor jest połączony jak w rysunku poniżej z tym, że na piny 2 i 3. W kreatorze schematów nie znalazłem takiego jak mam w układzie. Działa on tak, że zwiera pin 2 (3) z masą.
    Arduino Mega2560 - robot, sterowanie przerwaniami silnikami DC

    Zakup analizatora pewnie mija się z celem, ponieważ z moim elektronicznym doświadczeniem musiałbym tygodniami "przepytywać forum" zanim ogarnę o co w tym chodzi, a i tak mam wrażenie, że porwałem się z motyką na słońce.
  • Poziom 10  
    Trochę to trwało, popełniałem wiele podstawowych błędów ale i sporo się nauczyłem. Ale jak mawiał Owidiusz "Fi­nis co­ronat opus". Okazało se, że zdecydowanie więcej problemów było, mechanicznych niż programowych. W programie w liczniku, po wielu próbach właściwym okazało się rozwiązanie:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Całość działa jak na filmie.