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.

[mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.

02 Lut 2012 14:14 1573 18
  • Poziom 10  
    Witam,
    Mam układ silniczka prądu stałego, który może się obracać w prawo lub w lewo.
    Steruje nim odpowiednimi stanami na nóżkach procesora. Na ośce silnika jest tarcza z ząbkami sprzężona z transoptorem, który to jest podpięty do procka (przez przerzutnik schmitta) dzięki czemu mogę liczyć impulsy w trakcie działania i w ten sposób go pozycjonować.

    Potrzebuję zaimplementować obsługę takiego układu w ten sposób abym mógł mu mówić "otwórz się na 10 impulsów(od zera)" "otwórz się na 5 impulsów" itp.

    Tyle słowem wstępu. Potrzebuję teraz koncepcje jak to zrealizować.
    Tak na prawdę już mam to zrobione i działa fajnie....tyle że czasami się "rozjeżdża" tj. np. punkt zero już nie jest zerem, tylko zatrzymuje się troszkę przed.

    Obecne rozwiązanie:
    1. Kalibracja.
    Program kalibruje silnik, czyli znajduje punkt zero całkowicie się zamykając, aż trafi na blokadę mechaniczną (taka krańcówka).

    2. Działanie - OTWIERANIE
    program dostaje "ustaw się na 10 impulsów", ma w pamięci że aktualnie jest na 0 impulsie - zostaje obliczana różnica.
    diff = aktPos - zadanaPos;

    dostaję diff = -10 czyli tyle impulsów ma przejechać od aktualnej pozycji aby ustawić się na 10 impulsie. Włączam silnik w odpowiednią stronę (bazując na znaku diffa, - to otwieranie, + to zamykanie) i jeśli dostane impuls z transoptora dodaje do diff'a +1. I tak kręcę silnikiem aż diff będzie ZERO.

    3. Działanie - ZAMYKANIE
    Uznajmy ze jestem na 10 impulsie. Dostaje "otwórz się na 5 impulsów". Znowu obliczam diffa
    diff = aktPos - zadanaPos
    dostaje diff = 5, znowu sprawdzam znak, jest dodatni więc trzeba zamykać. Włączam silnik, odejmuje od diffa 1 jak dostane impuls i tak kręce aż diff będzie ZERO.

    Generalnie taki sposób działania wymyśliłem, ale nie chce mi to działać perfekcyjnie i juz po kilkunastu minutach ciągłego otwierania i zamykania się rozkalibrowywuje.
    Oglądałem na oscylku sygnał impulsów, jest ładny, zrobiłem filtr zakłóceń impulsów - nie pomogło. I nie mam już pomysłów.

    Piszę bo może ktoś robił już coś podobnego i zna jakieś pułapki o których nie pomyślałem.
  • Poziom 1  
  • Poziom 10  
    Impulsy są odczytywane z pina, są wolne, cały okres trwa prawie 500ms.

    Mam to wejście też podłączone na przerwanie zew. ale z niego zrezygnowałem, gdyż nie mogłem tego doprowadzić do porządku, jakieś dziwne akcje miałem, jakby przerwanie samo się wywoływało. Myślałem że zakłócenia, ale mam pullup 10k.

    W tej chwili nie mogę załączyć kodu, jutro może załatwię jakieś pozwolenie.

    Tymczasem czekam na sugestie, czy taki sposób realizacji jak opisałem ma sens, bo może coś mi umyka.
  • Poziom 1  
  • Poziom 10  
    Cytat:
    To w takim razie jeszcze mam pytanie w jaki sposób jest wykrywany sam impuls? Czy jest pętla oczekująca na zmianę stanu?

    Impuls wykrywam w przerwaniu 1000/sec, mierzyłem na oscylku, opóźnienie wykrycia impulsu waha się w granicach 0,5-2ms. Dla zwiększenia rozdzielczości oba zbocza sygnału traktuję jako impuls.

    Cytat:
    Jest gwarancja, że silnik zatrzyma się zawsze na określonym poziomie impulsu? Tzn. czy nie ma ryzyka, że przy którymś razie zbyt wolno się zatrzyma i przeskoczy połówkę impulsu (impuls nie zostanie wykryty, ale sterowanie się już rozjedzie).

    Nie ma gwarancji rzecz jasna :) po wyłączeniu napięcia na silniczku jest spora bezwładność. Przy pracy silnika wysoki stan sygnału transoptora wynosi ok 200ms a niski 150ms. Biorąc pod uwagę czynniki opóźniające interpretacje impulsu (opóźnienie wykrycia + 15ms pracy filtra) i tak powinien zatrzymać się dosyć blisko za zboczem - jednak on potrafi nawet przelecieć na następne zanim wyhamuje...
    Moje zabezpieczenie polega na tym że po wyłączeniu napięcia silnika, jeszcze przez 1s słucham czy wystąpią jakieś impulsy, jeśli tak to dodaje je do aktualnej pozycji (lub odejmuje, zależy z którego kierunku hamował) - zmienna aktPos z 1 postu. Przy następnym rozkazie to odchylenie już ginie. Zdarza się to rzadko, ale zdarza. Wydaje mi się ze to powinno złatawiać ten problem.
  • Poziom 30  
    Nie wiem jak wygląda pętla główna Twojego programu ale wykrywania impulsu w przerwaniu bym nie robił. Czasem przekazywanie parametrów z przerwania powoduje różne nieoczekiwane sytuacje o jakich się ostatnio mogłem przekonać - ustawiałem w przerwaniu znacznik co jednostkę czasu i na jego podstawie cyklicznie wykonywał się fragment programu badając ten znacznik i po wykonaniu sam go zerował. Jakież było moje zdziwienie gdy co kilka takich impulsów (w miarę regularne odcinki) po prostu gubił znacznik i fragment się nie wykonywał (mimo, że jednostka czasowa na pewno była zliczona). Kiedy odliczanie robiłem innym sposobem (w pętli głównej) wszystko się poprawiło.
    Jeśli Twoim zdaniem algorytm jest ok to może dodaj coś co będzie spowalniać silnik przy końcu odliczania żeby nie przeleciał za daleko, bo być może późniejsza korekta (np. z wspomnianego zabezpieczenia) ma wpływ na prawidłowe pozycjonowanie.
  • Poziom 10  
    Tak, wiem przerwania mogą dać popalić, też mi się zdarzały takie akcje - oczywiście miałeś tą zmienna którą ustawiałeś w przerwaniu jako volatile?

    Anyway. Pętla główna jest dosyć mocno obciążona, a CPU chodzi chodzi tylko na 2MHz, ale sprawdzę z ciekawości - i tak nie mam pomysłów.

    Cytat:
    Jeśli Twoim zdaniem algorytm jest ok to może dodaj coś co będzie spowalniać silnik przy końcu odliczania żeby nie przeleciał za daleko, bo być może późniejsza korekta (np. z wspomnianego zabezpieczenia) ma wpływ na prawidłowe pozycjonowanie.


    Mam spowalnianie, tak naprawdę to mam 4 stopnie prędkości, które się zmieniają dynamicznie w zależności od tego ile impulsów zostało do końca. Przed wyjściem jeszcze spowolniłem ten ostatni i zostawiłem na noc. Zobaczymy co będzie rano ;)
  • Poziom 30  
    Hehe, nie wiem co to jest volatile :) Programuję w bascom i na razie spełnia w 99% moje oczekiwania chociaż robię przymiarki do assemblera...

    Przychodzi mi do głowy jeszcze jedna rzecz związana z gubieniem impulsów. Piszesz, że badanie robisz przy każdym zboczu dla zwiększenia rozdzielczości (nawet sam tak miałem na początku w sowim projekcie pozycjonera) - może zapominasz gdzieś o znaczniku początkowym, w zależności od którego zależy jaki pierwszy impuls będzie zliczony.

    Ja w bascomie robiłem to w taki sposób:


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Zwróć uwagę jak ważne jest ustawienie Z_imp. W zasadzie powinno się go ustawiać tylko raz na samym początku programu i zapomnieć o jego istnieniu :)
    Dla dekrementacji oczywiście podobny fragment w pętli głównej tylko dla innego pinu.
  • Poziom 10  
    Tak, o tym także pamiętam, robię tak że po kalibracji odczytuje stan sygnału i odpowiednio wyrównuje obie flagi. Jednak nawet gdybym tego nie robił, powinien zgubi co najwyżej 1 impuls - a on działa dobrze przez np. pół godziny czy godzinę i potem coś się dzieje.

    skończy się to tak że będę przez godzinę wpatrywał się w oscyloskop :/

    Tak czy tak, dzięki za sugestię :)
  • Poziom 38  
    A jak się zabezpieczyłeś przed zakłóceniami od silnika?
    Jak daje duże zakłócenia to od razu widać że coś nie tak.
    Ale jak daje małe- to tylko co jakiś czas coś źle działa.
  • Poziom 10  
    To niewielki silniczek, przyznaje że na razie jest słabo zabezpieczony, przyjże się temu.
  • Poziom 30  
    Właśnie! Sprawa zakłóceń jest bardzo istotna. W pewnym moim układzie wystarczył jeden kondensator 0,1u (o którym zapomniałem po prostu, a elektrolit oczywiście był i to mnie zmyliło) na głównym zasilaniu silnika aby z kompletnie głupkowatego zachowania się elektroniki wszystko zaczęło działać jak należy :)
  • Poziom 38  
    Jeszcze jedno- transoptor szczelinowy potrafi działać dość podstępnie.
    Jeśli na element foto padnie dużo światła to się nasyca i nie reaguje na żadne sygnały.
    Dobrze jest poza tym wysyłać do elementu nadającego sygnał zmodulowany- choćby falę prostokątną o określonej częstotliwości.
    Odbiornik powinien reagować tylko na sygnał o tej właśnie częstotliwości.
    Znakomicie to zwiększa odporność na zakłócenia.
    No i znakomicie rozbudowuje program- ale coś za coś.
  • Poziom 10  
    Transoptor jest zamknięty w obudowie, mało światła z zewnątrz do niego dociera.

    Cytat:
    Dobrze jest poza tym wysyłać do elementu nadającego sygnał zmodulowany- choćby falę prostokątną o określonej częstotliwości.
    Odbiornik powinien reagować tylko na sygnał o tej właśnie częstotliwości.

    Przyznaje że nie wiem o co chodzi - możesz napisać dokładniej?
  • Poziom 38  
    To jest tak- teraz badasz czy jest stan wysoki czy niski na wejściu.
    Czyli stosujesz co co 1/1000s odpytywanie stanu pinu.
    Pewnie timerem to ustawiasz.
    Teraz- jeśli pojawi się zakłócenie- traktujesz to jako impuls- pojawia się błąd.
    A można zrobić tak- na nadajnik wysyłasz sygnał o jakiejś częstotliwości- kilkadziesiąt kHz a przy odczycie sprawdzasz czy to jest ta częstotliwość.
    Jak wkradnie się jakiś obcy impuls- to wiesz że to nie twój sygnał.
  • Poziom 10  
    Poprawka, rozmawiałem z projektantem pcb, mówi że na wyjściach tranzystorów sterujących silnikiem są diody.

    Cytat:
    Teraz- jeśli pojawi się zakłócenie- traktujesz to jako impuls- pojawia się błąd.

    Po wykryciu zmiany stanu, przez 30ms co 0,5ms sprawdzam czy stan na nóżce impulsów się nie zmienia, jeśli nie, dopiero wtedy zaliczam jako impuls (czy też zbocze dobrego impulsu).
    Nie wiem na ile to jest skuteczne w prawdziwych warunkach...
  • Poziom 38  
    :D
    No jakby nie było diod równolegle do silnika to już by pewnie nie było tych tranzystorów.
    Można domniemywać że w czasie gdy transoptor jest przesłonięty pojawia się jakiś impuls i jest traktowany przez program jako znak że transoptor jest odsłonięty.
  • Pomocny post
    Poziom 30  
    A może to po prostu błąd mechaniki... Po kilkukrotnych ruchach w te i we w te za każdym razem jest jakieś minimalne przesunięcie, które w końcu w skrajnym położeniu rozpoznawane jest jako dodatkowy impuls (lub jego brak) i stąd te rozjazdy.
  • Poziom 10  
    janbernat napisał:
    :D
    No jakby nie było diod równolegle do silnika to już by pewnie nie było tych tranzystorów.

    Hm, hm powiedziano mi że to "zabezpieczenie", w takim razie co jeszcze można by dołożyć? To pomęcze ;)

    Cytat:
    A może to po prostu błąd mechaniki... Po kilkukrotnych ruchach w te i we w te za każdym razem jest jakieś minimalne przesunięcie, które w końcu w skrajnym położeniu rozpoznawane jest jako dodatkowy impuls (lub jego brak) i stąd te rozjazdy.

    Wydaje mi się że poprzednie przesunięcie (np wynikające z bezwładności) nie powinno mieć wpływu na następne. Tak by mogło być gdybym np. jeździł na czas.