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

AVR ATmega32 Problem - ATMega 32A Sterowanie potencjometrem silnika krokowego

ProLogicTechnology 26 Lut 2015 00:54 3408 11
  • #1 14478519
    ProLogicTechnology
    Poziom 9  
    Posty: 11
    Witam,
    mam mały problem ze sterowaniem silnika krokowego za pomocą potencjometru.
    Postaram się szerzej opisać mój problem.
    Podczas działania programu wartość ADC dość mocno skacze mimo zrobionego zabezpieczenia. Silnik gubi kroki.
    Do celów testowych używam płytki prototypowej z procesorem ATMega32 i sterownika silników krokowych na układzie scalonym DRV8825. Analogicznym do tego sterownika https://www.pololu.com/product/2133
    Wrzucam schemat połączeń:
    AVR ATmega32 Problem - ATMega 32A Sterowanie potencjometrem silnika krokowego
    Wrzucam także kod programu który posiada komentarze więc raczej nie będę musiał dokładnie opisywać i dodawać bardzo rozbudowanego schematu połączeń:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zależy mi właśnie na współpracy w działaniu (przekręceniu) potencjometru i obrotu silnika o podobny kąt obrotu potencjometru.
    Zależy mi także na szybkości działania. Jak szybko przekręcę potencjometrem tak szybko musi wykonać obrót silnik. U mnie to za bardzo nie chce działać.
    I teraz prośba czy mógłby mi ktoś sprawdzić ten kod i poprawić, podpowiedzieć co zrobiłem źle.
    Film z efektów działania (tutaj chciałem przeprosić za tą "herezję" czyli to okablowanie, które wisi w powietrzu. Ale wszystko jest podłączone zgodnie ze schematem, który podałem wyżej:




    A dążę to uzyskania dokładnie takiego efektu:




    Dziękuję i pozdrawiam :)
  • Pomocny post
    #2 14478658
    Kuniarz
    Moderator Projektowanie
    Posty: 4520
    Pomógł: 371
    Ocena: 825
    FollowFocus ? :) Myślę, że na początek trzeba zająć się pływającym ADC. Na pierwszy strzał wymieniłbym ten potencjometr montażowy skatowany ogromnym wkrętakiem na dobry osiowy (nie chińczyk za 1PLN tylko np. Telpod za 5-7 PLN).
    Pomogłem? Kup mi kawę.
  • #3 14480851
    tobiasz54
    Poziom 13  
    Posty: 89
    Pomógł: 2
    Ocena: 4
    Schemat który podałeś jest identyczny do drivera na A4988. Czy Twój sterownik ma regulację prądu na silnik? Ostatnio jestem bardzo zaawansowany w sterowaniu silników krokowych i najpierw sprawdzam, czy sterownik prawidłowo steruje.
    Z Twojego schematu:
    -mostki M0,M1,M2 - to mikrokroki - jeżeli nie zmieniasz programowo w czasie działania programu mikrokroków to zrób na stałe i nie steruj tym. Driver ma podciągnięcie do masy przez rezystory te wejścia(ja mam zwarte i do + przez 10k na 1/16)
    -sleep i reset - jeżeli programowo nie zmieniasz/wykorzystujesz to po prostu wystarczy je zmostkować i nie obciążac tym kodem.
    -enable - zależy od koncepcji.
    Jak zaczynałem to też mi warczały krokowce. Ustawienia prądu na sterowniku i jw.napisałem.
  • #4 14481786
    ProLogicTechnology
    Poziom 9  
    Posty: 11
    Cytat:
    Na pierwszy strzał wymieniłbym ten potencjometr montażowy skatowany ogromnym wkrętakiem na dobry osiowy

    Wymieniony na Telpod 4,7k
    Cytat:
    Czy Twój sterownik ma regulację prądu na silnik?

    Tak
    Cytat:
    najpierw sprawdzam, czy sterownik prawidłowo steruje.

    No wydaje mi się, że dobrze steruje dlatego, że obraca się prawidłowo tylko gubi kroki. Nie mogę sprawdzić przebiegu przed sterownikiem na STEP'ie ani na wyjściu sterownika bo w tej chwili nie mam oscyloskopu. Będę w posiadaniu w poniedziałek to sprawdzę oscylogramy. Ale mimo wszystko wydaje mi się, że ogólnie sterownik działa prawidłowo.

    Film po poprawie kodu i po ogarnięciu płytki stykowej z tej "herezji" :




    Czy jest ktoś w stanie poprawić mi kod, żeby silnik reagował szybko. Po gwałtownym przekręceniu silnik dopiero doskakuje do swojej pozycji. A ja chce zrobić żeby od razu reagował na ruchy potencjometru.
    Wrzucam jeszcze poprawiony odrobine kod i prosiłbym o sprawdzenie dokładne i przeanalizowanie mojego kodu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dziękuję :)
  • Pomocny post
    #5 14482264
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Treść Twojego programu nie odpowiada założonej funkcjonalności. Podobno chcesz, żeby silnik śledził położenie potencjometru, a tymczasem robisz coś zupełnie innego - wykonujesz pewną liczbę kroków w zależności od różnicy dwóch kolejnych pomiarów ADC.

    Zacznij od przerwania timera, zgłaszanego z okresem kroku. W nim odczytaj ADC i przefiltruj (obecnie tego nie robisz!) - pokazałem to kilka dni temu. Przefiltrowana i przeskalowana wartość ADC określa zadaną pozycję. Wprowadź histerezę np. jednego kroku, żeby silnik nie drżał. W zależności od różnicy zadanej i bieżącej pozycji wykonaj jeden krok w odpowiednim kierunku. Na koniec zapuść następny pomiar ADC- żadnych while() ani delay(). Łącznie wyjdzie jakieś 15 linii kodu w jedynym przerwaniu timera.
  • #6 14486399
    ProLogicTechnology
    Poziom 9  
    Posty: 11
    Jak przefiltrować ADC ? Szukałem ale nigdzie tego na forum nie znalazłem. Prosiłbym o pomoc w tej sprawie.
    I nie rozumiem czyli najpierw robię przerwanie co jakiś tam czas. W przerwaniu odczytuje ADC i filtruje. I to jest niby pozycja zadana. Jak wprowadzić histerezę ? Czyli mam cofać silnik ciągle o jeden krok czy jak ?
  • Pomocny post
    #7 14486559
    Konto nie istnieje
    Konto nie istnieje  
  • #8 14486703
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Filtrowanie, które pokazałem NIE wymaga ani mnożenia, ani dzielenia, dlatego działa kilkaset razy szybciej niż rozwiązanie z mnożeniem przez 19 i dzieleniem przez 5 czy 20.
  • #9 14486737
    Konto nie istnieje
    Konto nie istnieje  
  • #10 14486889
    tobiasz54
    Poziom 13  
    Posty: 89
    Pomógł: 2
    Ocena: 4
    Na filmiku zobaczyłem, że jak wolno kręcisz potencjometrem to silnik chodzi dobrze.
    Przy szybkim, tak jakby silnik nie "zdanżał" (nie wydaje mi się że gubi kroki). Może za dużo tych odczytów z ADCdo przetworzenia. Żeby silnik chodził szybciej musisz ustawić sterownik na pełny krok.
    Może zmniejsz częstotliwość odczytu z ADC?
    Dodam:
    zmierz przy nieruchomym potencjometrze czy Ci pływa i ile, lub do czego Ci to potrzebne - wartość początkowa z potencjometru - wartość końcowa i silnik niech zrobi odpowiednią ilość kroków. Czasy - czasy.
  • #11 14486947
    Konto nie istnieje
    Konto nie istnieje  
  • #12 14488187
    ProLogicTechnology
    Poziom 9  
    Posty: 11
    Jak przefiltrować ADC ? Szukałem ale nigdzie tego na forum nie znalazłem. Prosiłbym o pomoc w tej sprawie.
    I nie rozumiem czyli najpierw robię przerwanie co jakiś tam czas. W przerwaniu odczytuje ADC i filtruje. I to jest niby pozycja zadana. Jak wprowadzić histerezę ? Czyli mam cofać silnik ciągle o jeden krok czy jak ?

Podsumowanie tematu

✨ Użytkownik ma problem z kontrolą silnika krokowego za pomocą potencjometru, gdzie wartości ADC skaczą, co prowadzi do gubienia kroków. Wykorzystuje płytkę prototypową z procesorem ATMega32 oraz sterownik DRV8825. Odpowiedzi sugerują wymianę potencjometru na lepszy model, sprawdzenie ustawień prądu w sterowniku oraz zastosowanie filtracji odczytów ADC. Proponowane jest użycie przerwań do odczytu ADC oraz wprowadzenie histerezy, aby silnik nie drżał. Użytkownik pyta o konkretne metody filtracji ADC oraz implementację histerezy w kodzie.
Wygenerowane przez model językowy.
REKLAMA