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

XMega - System zdarzeń, timery a sterowanie silnikiem krokowym

04 Sty 2017 22:21 762 4
  • Poziom 14  
    Witam

    W moim projekcie występuje silnik krokowy, którym steruję z zewnętrznym sterownikiem.
    Potrzebuję więc jedynie generować sygnały DIRection i PULse.
    //Będzie to odwrócone wahadło.

    Nie mam sprzężenia zwrotnego od silnika.
    Silnik będzie przesuwał liniowy wózek.
    Będę chciał zaimplementować rozpędzanie i zwalnianie silnika.

    Do celu generacji PULSE wykorzystuję timer w trybie generacji częstotliwości TC_WGMODE_FRQ_gc .
    Generację częstotliwości wyłączam zerując preskaler taktowania licznika TC_CLKSEL_OFF_gc.

    Problem:
    Potrzebne jest mi jeszcze liczenie ile impulsów wysłałem do sterownika.
    Muszę liczyć np. zbocza opadające pinu wysyłającego sygnał PULSE.
    Na razie rozwiązałem to tak, że mam dodatkowy licznik. Jest taktowany w ogóle osobnym pinem, ZEWNĘTRZNIE ZWARTYM do pinu pulse.
    Zdaję sobie sprawę, że nie jest to najlepsze rozwiązanie.

    Czy można jakoś wychwycić systemem zdarzeń zbocze pinu kiedy jest on wyjściem, w dodatku jest kontrolowany przez timer w trybie FRQ GEN?
    Jak inaczej liczyć wykonane kroki?


    __
    Czy w ogóle takie podejście do sterowania krokowcem ma sens? Może są jakieś inne sposoby?
    Trochę się w tym pomotałem.
    W jednym liczniku chcę mieć aktualną pozycję. Do zadawania nowej chcę wpisywać nową do compare, włączać gen. cz. i wyłączać gdy aktualne położenie =compare= nowe położenie.

    Z góry dzięki za wszelkie wypowiedzi
  • Moderator Mikrokontrolery Projektowanie
    Skoro to silnik krokowy to nie dajesz mu zwykłego PWM, tylko na STEP musisz podaćokreśloną liczbę impulsów. W dodatku niezbyt szybko. Więc zamiast timera można wykorzystać przerwania, w których wysyłasz impuls i zmieniasz zmienną, ktora wskazuje ile impulsów wysłałeś. Można to też zrobić sprzętowo. Jeden timer generuje impulsy STEP, przez event system podpięty do wyjścia tego timera przekazujesz impulsy zwrotnie na inny timer, który je zlicza. Ustawiasz np. w PER do ilu ma zliczyć, przepełnienie generuje event zerujący timer generujący impulsy STEP. W ten sposób można całkowicie sprzętowo wygenerować zadaną liczbę impulsów.
  • Poziom 14  
    No mam podobne właśnie rozwiązanie (poza tym, że zaproponowałeś coś w stylu inkrementalnego podawania ilości impulsów, a ja absolutnego, ale to nie takie istotne).
    Nie używam PWM tylko właśnie FREQ GEN (Szkoda, że nie wspomniałeś o tym trybie w swej książce. Znalazłem to w pdf AVR1306 / doc8045 p. 3.8.2. Podobny efekt można uzyskać w normalnym trybie, lecz tutaj nie trzeba przerwania do machania stanem nóżki).

    Powiem jeszcze tak: próbowałem taktować licznik kroków właśnie eventem z licznika impulsów.
    Licznik kroków liczy absolutnie, nigdy go nie zeruję poza początkiem i ma dwie wartości COMPARE.
    Program działa tak, że najpierw jedzie w prawo, po osiągnięciu compare jest przerwanie, zatrzymanie silnika, zmiana kierunku obrotów, zmiana kierunku liczenia kroków, włączenie silnika.
    Podobnie przy dolnej wartości compare.
    Ustawiłem te wartości compare tak, że matematycznie wychodzi jeden obrót w lewo, jeden obrót w prawo - w nieskończoność.
    Niestety, silnik w takiej konfiguracji silnik zamiast obracać się o 360* raz w tą raz w tą, obrót pokrywa trochę ponad 300* i jest to wszystko bardzo nieregularne, nie powtarzalne.
    Silnik nie gubił na pewno kroków, zerowe obciążenie, bardzo niska częstotliwość. Sprawdzałem dla różnych częstotliwości.

    Kiedy przy tej samej konfiguracji zwarłem pin PULSE do innego pinu ustawionego jako wejście i z niego (licząc tylko zbocza opadające) taktowałem licznik kroków to chodziło idealnie.

    Myślę, że ma to jakiś związek z tym, że timer PULSE generuje dwa przerwania/zdarzenia na jeden krok (pojedyncze 'przepełnienie' zmienia stan pinu tylko raz / lub \, a sterownik silnika reaguje tylko na co drugi sygnał - zbocze opadające \). Chociaż nadal nie mogę tego zrozumieć, bo mimo tej małej nieścisłości (kwestia dzielenia na dwa) powinno być to powtarzalne (a z mojego rozumowania dla parzystej ilości kroków zadanych - wręcz dokładne). A błąd powinien być 1 kroku, a jest przynajmniej 10x większy.

    W sumie głównym moim pytaniem było czy da się event system karmić zboczem pinu, kiedy ten pin jest wyjściem. Próbowałem, ale z moich doświadczeń wychodzi, że nie. Pytam bo jeszcze mocno się gubię, dopiero parę dni z xmegą.

    Podsumowując - taktując licznik kroków zdarzeniami PULSE coś się nie zgadza ze sterowaniem, a kiedy zewrę sobie nóżkę PULSE do pinu wejścia i odczytuję zbocza pinu wejścia to działa elegancko.
    Nie jest to eleganckie, tak zwierać piny, dlatego właśnie chciałem to zrobić jakoś inaczej, choć mogę pozostać i przy tym. Nie mogę też zrozumieć tego nieprzewidywalnego zachowania przy taktowaniu zdarzeniami timera PULSE.
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Oczywiście, że event system może reagować na zbocza - robi to analogicznie jak system przerwań. Czyli musisz skonfigurować poziom/zbocze i podłączyć pod event system.
  • Poziom 14  
    Wstyd.
    Mój błąd i to w dodatku banalny - błąd w podłączeniu.
    Wykryłem dopiero eksperymentując z czytaniem zboczy dla innego pinu gdy jest on wyjściem.

    Sygnał step wysyłam z xmegi przez tranzystor. Na płytce stykowej połączyłem pin z bazą tranzystora z pominięciem rezystora.. ehh
    Tranzystor się włączał normalnie. W stanie niskim 0V, w stanie wysokim 0,6V na pinie. Zamiast 3,3V, dlatego event system nie działał. Widział ten pin ciągle w stanie niskim.
    Połączenie przez rezystor rozwiązuje problem.

    Więc odpowiedź - tak, można generować eventy jeśli pin jest ustawiony jako wyjście.
    A szukałem tak na około.

    Dzięki za zainteresowanie i podsunięcie pomysłu.