logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Arduino: Jak sterować silnikiem DC z enkoderem o zadany kąt?

RozgrzanyAndrzej 08 Kwi 2018 16:18 4083 13
  • #1 17156199
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    Dzień dobry,

    postanowiłem utworzyć ten temat, gdyż nie mogłem znaleźć na forum rozwiązania swojego problemu z jakim przyszło mi się zmierzyć. Jeśli okaże się, że po prostu źle szukałem to z góry przepraszam za zajęty czas i niepotrzebny spam.

    Wracając do meritum. Chciałbym wysterować silnik prądu stałego z enkoderem oraz przekładnią zakupiony na pewnej krajowej stronie z elektroniką.
    Moim celem było zaprogramowanie platformy arduino tak, by móc obracać wał silnika o konkretny zadany kąt.

    W pierwszej kolejności postanowiłem sprawdzić czy umiem wykrywać zbocze opadające na jednym z kanałów enkodera, aby ustalić w którą stronę kręci mój silnik. W tym celu napisałem prosty program z przerwaniem na jednym z pinów enkodera.
    Kod: Text
    Zaloguj się, aby zobaczyć kod

    Niestety, tu pojawia się problem, bo dane na porcie szeregowym pojawiają się dopiero po zakończeniu ruchu( domyslam się, że to przez funkcję delay) i to w "bliżej nieokreślonym" języku. Tak jakbym pomylił się w określeniu prędkości w Serial. begin .

    Drugą częścią komplikacji jest to, że nie ma mam pojęcia ( gdy uda mi się rozgryźć enkoder ) jak opisać ograniczenie obrotu. Silnik jest sterowany przez układ LM293D. Czy ktoś spotkał się z takim zadaniem ? Proszę o jakiś materiał dydaktyczny, wskazówki lub zwykłą pomoc.
    Dziękuję i życzę miłego dnia.

    Pozdrawiam RA.
  • Pomocny post
    #2 17156757
    kacpo1
    Poziom 33  
    Posty: 1698
    Pomógł: 273
    Ocena: 156
    Pierwszy błąd który rzucił mi się w oczy, to to, że korzystasz z Serial'a i jednocześnie wykorzystujesz pin 1 (TX ! ).

    Poza tym jakie Arduino posiadasz? W przypadku Uno, do przerwań można użyci tylko 2 i 3 pinu (nie mówię o PCINT), chyba, że posiadasz Leonardo.
  • Pomocny post
    #3 17156870
    Konto nie istnieje
    Konto nie istnieje  
  • #4 17157166
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    kacpo1

    Racja, głupi błąd ! Już wszystko działa, a wartości pojawiają się tak jak chciałem. Bardzo dziękuję.

    nowyARM

    Bardzo pomocny i merytoryczny post, za który dziękuję. Jeśli chodzi o serial to tak, działa w przerwaniu normalnie.
    Hamowanie przez LM293? Chodzi o to, że muszę sprawdzić o jaki kąt obróci się wał przez siłę bezwładności i zadać obrót w przeciwnym kierunku, żeby to zniwelować?
  • Pomocny post
    #5 17157194
    Konto nie istnieje
    Konto nie istnieje  
  • #7 17158603
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    Zastosowałem się do wskazówek nowyARM i na tą chwilę wygląda, że wszystko działa.

    Wielkie dzięki za szybką i merytoryczną odpowiedź również kacpo1.
  • #8 17183253
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    Witam ponownie.

    Zdecydowałem się ponownie otworzyć temat ponieważ napotkałem kolejny problem.
    Myślę, że jest to czas by przybliżyć docelowy sposób działania układu.

    -Silnik DC będzie napędzać śrubę z nakrętką.
    -Enkoder kwadraturowy na silniku ma ograniczać zakres jego pracy.
    -Silnik sterowany ma być przez UART

    Problem polega na tym, że gdy załączę mostek H i enkoder zacznie zliczać kroki, tkwi cały czas w przerwaniu i przeskakuje maksymalną wartość opisaną w kodzie.
    Myślałem o zastosowaniu jakiegoś licznika CMOS, ale wolałbym zrobić to programowo.

    Macie jakieś wskazówki ?
  • #9 17183381
    krzysiek_krm
    Poziom 40  
    Posty: 4612
    Pomógł: 716
    Ocena: 598
    Wychodzi na to, że musisz motor wyłączać właśnie w przerwaniu.
  • #10 17184790
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    Dobra, już jest lepiej.
    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Niestety program działa tylko raz i to w jedną stronę. Z tego co przeczytałem to "return" w przerwaniu nie może zwracać żadnej wartości, więc jak rozwiązać ten problem ?
  • #11 17184800
    NoweMillennium
    Poziom 17  
    Posty: 192
    Pomógł: 23
    Ocena: 10
    RozgrzanyAndrzej napisał:
    Z tego co przeczytałem to "return" w przerwaniu nie może zwracać żadnej wartości, więc jak rozwiązać ten problem ?

    Użyj zmiennej globalnej z atrybutem volatile.
  • #12 17184824
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    Kod: Text
    Zaloguj się, aby zobaczyć kod

    Cały czas jej używam

    Kod: Text
    Zaloguj się, aby zobaczyć kod

    W dalszym ciągu jest problem z pojedynczym i jednostronnym załączeniem pętli przerwania sum().
  • #13 17184988
    krzysiek_krm
    Poziom 40  
    Posty: 4612
    Pomógł: 716
    Ocena: 598
    Szczerze mówiąc, nie rozumiem
    RozgrzanyAndrzej napisał:
    last = digitalRead(PinA);
    if ((PinAlast == HIGH) && (last == LOW))

    last nigdy nie będzie LOW w przerwaniu, przerwanie jest "RISING".
  • #14 18667283
    RozgrzanyAndrzej
    Poziom 5  
    Posty: 52
    Ocena: 3
    Wykorzystałem inny typ silnika.

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na sterowanie silnikiem DC z enkoderem, aby obracać wał o zadany kąt. W trakcie dyskusji zwrócono uwagę na błędy w kodzie, takie jak użycie pinu TX do komunikacji szeregowej oraz niewłaściwe zarządzanie przerwaniami. Użytkownik został poinstruowany, aby używać zmiennej volatile dla zmiennej count oraz przenieść sterowanie silnikiem do przerwań. Po zastosowaniu wskazówek, użytkownik zdołał poprawić działanie programu. Pojawił się nowy problem związany z ograniczeniem zliczania kroków przez enkoder, co skłoniło do rozważań nad programowym rozwiązaniem. W końcu użytkownik zmienił typ silnika, co wpłynęło na dalsze postępy w projekcie.
Wygenerowane przez model językowy.
REKLAMA