Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

AVR ATmega32 Problem - ATMega 32A Sterowanie potencjometrem silnika krokowego

ProLogicTechnology 26 Feb 2015 00:54 3147 11
NDN
  • #1
    ProLogicTechnology
    Level 8  
    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ń:
    Code: c
    Log in, to see the code

    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 :)
  • NDN
  • Helpful post
    #2
    Kuniarz
    Moderator of Designing
    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).
  • #3
    tobiasz54
    Level 13  
    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.
  • NDN
  • #4
    ProLogicTechnology
    Level 8  
    Quote:
    Na pierwszy strzał wymieniłbym ten potencjometr montażowy skatowany ogromnym wkrętakiem na dobry osiowy

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

    Tak
    Quote:
    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.

    Code: c
    Log in, to see the code

    Dziękuję :)
  • Helpful post
    #5
    BlueDraco
    MCUs specialist
    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
    ProLogicTechnology
    Level 8  
    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 ?
  • Helpful post
    #7
    Anonymous
    Anonymous  
  • #8
    BlueDraco
    MCUs specialist
    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
    Anonymous
    Anonymous  
  • #10
    tobiasz54
    Level 13  
    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
    Anonymous
    Anonymous  
  • #12
    ProLogicTechnology
    Level 8  
    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 ?