Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zliczanie impulsów z 3 wejść

adamusx 24 May 2005 08:29 2480 12
  • #1
    adamusx
    Level 27  
    Witam

    Mam w planach budowę prostego manipulatora.
    Do jego obslugi chcialem użyc mikrokontroler AT908515 lub podobny.

    Na jego wejscia beda podane miedzy innymi impulsy z 3 enkoderów do pomiaru obrotów.Maksymalna czestotliwosc pojawiania sie impulsow byla by na granicy 400 impulsow/s
    I tutaj mam pytanie: czy można zliczać te impulsy nie wykorzystujac do tego celu przerwań i podlaczajac wyjscia z enkoderow do dowolnych pinow ktorych zmiana stanow zwiekszala lub zmniejszala by odpowiednio jakas zmienna w mikrokontrolerze???????[/b]
  • #2
    MirekCz
    Level 35  
    jasne, wystarczy ze program odpalony w mikroprocesorze bedzie wywolywal np 1000 razy/sekunde jakas petle glowna, w ktorej bedziesz mial sprawdzenie stanu pinow i zwiekszenie (lub nie, zaleznie czy nastapila zmiana stanu) wartosci licznikow.

    Czyli najprostszy program wyglada mniejwiecej tak

    main()
    {
    .....
    while (1)
    {
    ... (program, ktory wykonuje sie w mniej niz 1ms)
    //sprawdzenie stanu pinow
    ... (tutaj zliczasz zmiany stanu pinow odpowiedzialnych za enkoder)
    }
    }

    Bardziej skomplikowany program bedzie wykorzystywal timer, ktory bedzie odpalal podprogram co 1ms (w tym momencie program glowny moze miec dowolna petle, bo za obsluge enkoderow bedzie odpowiadal podprogram wywolywany co 1ms)
  • #3
    LordBlick
    VIP Meritorious for electroda.pl
    Program w pętli głównej odpada, ze względu na dość standardowe i jednocześnie bezużyteczne w tym przypadku konstrukcje typu waitms, które wydają się być niektórym programistom potrzebne do szczęścia... ;)
  • #4
    McRancor
    VIP Meritorious for electroda.pl
    W przerwaniu timera, powiedzmy 1000razy na sekundę, sprawdzany jest stan pinu i porównywany ze stanem odczytanym poprzednio, jeśli jest inny to zwiększany jest odpowiedni licznik, a stany aktualne są przepisywane jako poprzednie. Robiłem tak setki razy i zawsze działało dobrze, tylko miałem do czynienia z gotowymi układami impulsatorów ze sprzętową eliminacją drgania styków. Nie powinno być problemów, a w razie konieczności zmniejszasz częstotliwość.
  • #5
    yego666
    Level 33  
    Jesli petla glowna przy najdluzszym mozliwym przebiegu bedzie trwala krocej niz polowe odwrotnosci najwiekszej z mierzonych czestotliwosci wejsciowych (zakladajac przebieg o wypelnieniu 1:1) to czytajac port wejsciowy w kazdym obiegu petli, mozna poprzez porownanie biezacej wartosci z poprzednio sczytana, ustalic czy ktorys sygnal sie zmienil. Majac taka informacje, mozemy juz bez problemu manipulowac zawartoscia odpowiednich licznikow wykonanych krokow. Jesl zas nie jestes w stanie zagwarantowac odpowiednio krotkiego czasu wykonania pojedynczego przebiegu petli glownej, to raczej przerwania beda sluszniejszym rozwiazaniem.
    Pozdrawiam, yego
  • #6
    MirekCz
    Level 35  
    yego666 wrote:
    Jesli petla glowna przy najdluzszym mozliwym przebiegu bedzie trwala krocej niz polowe odwrotnosci najwiekszej z mierzonych czestotliwosci wejsciowych (zakladajac przebieg o wypelnieniu 1:1) to czytajac port wejsciowy w kazdym obiegu petli, mozna poprzez porownanie biezacej wartosci z poprzednio sczytana, ustalic czy ktorys sygnal się zmienil. Majac taka informacje, mozemy juz bez problemu manipulowac zawartoscia odpowiednich licznikow wykonanych krokow. Jesl zas nie jestes w stanie zagwarantowac odpowiednio krotkiego czasu wykonania pojedynczego przebiegu petli glownej, to raczej przerwania beda sluszniejszym rozwiazaniem.
    Pozdrawiam, yego


    Yego, moje gratulacje, z Ciebie jest dobry material na profesora - dawno juz nie czytalem tak skomplikowanego tlumaczenia takiego prostego zagadnienia ;-)

    A co do problemu typu drgania stykow, to najlepiej:
    a)zastosowac kondensator
    b)zczytywc wartosci czesciej (np trzy razy czesciej) i wybrac do obliczen impulsow wartosc, ktora sie powtarza (tzn jak z 3 zczytan masz 2x"0" i 1x"1" to wartosc rzeczywista zakladasz "0")

    Tylko w twoim wypadku ten problem chyba nie bedzie wystepowal, zalezy jakie masz enkodery.
  • #7
    adamusx
    Level 27  
    Z drganiami styków nie bedzie problemow poniewaz sygnaly beda pochodzily z enkoderów optycznych (podobnie jak to dziala w myszce) wiec nie ma tu zadnych mechanicznych styków.

    Zastanawiam sie tez czy podlaczac z kazdego enkodera :

    1)Bezposrednio 2 sygnaly pzezsuniete w fazie ,tylko wowczas trzeba by rozwiazac programowo kwestie rozrozniania kierunku i to jeszcze razy 3 .

    lub
    2)prostym ukladzikiem ( przerzutnik D) podlaczonym zaraz za enkoderem - i wowczas na procka podawal bym tez 2 sygnaly, z czego jeden odrazu wskazywal by mi kierunek obrotow.

    Jesl ktos wie jak rozwiazac ta pierwsza kwestie programowo to prosze o pomoc:)

    aha,program chce pisac w FastAVR, ew Bascomie ,chociaz polecenia sa prawie identyczne.
  • #8
    McRancor
    VIP Meritorious for electroda.pl
    Ja bym to zrobił na prostym układziku, wtedy przerwanie będzie można skrócić, a poza tym przerzutnik da ładny prostokąt, ale można też programowo, w końcu mniej elektroniki itd.

    Pomyśl co dla Ciebie będzie prostrze!
  • #9
    MirekCz
    Level 35  
    adamus.. szkoda marnowac przerzutniki :)
    Programowo na mikroprocesorze zalatwisz to kilkoma instrukcjami - a o ile tanszy, mniejszy, niezawodniejszy i latwiejszy do montazu bedzie uklad.
  • #10
    frohme
    Level 21  
    No to oszacujmy przypadek niemiły - masz trzy enkodery każdy 400 imp/sek, jak złośliwie trzy się ustawią to dadza impulsy w takim układzie, że musisz to sprawdzać z częstotliwością min 3 x 400 Hz plus zapaspowiedzmy około 1500Hz. Jeżeli w BASCOMie ci sie to uda aby pętla główna była krótsza niż 0,66 ms (no coś jeszcze z tymi zliczanymi impulsami bedziesz robił, jakiś wynik, reakcja na zjawisko itp.) i będziesz nad tym czasem miał pełną kontrolę to duże gratulacje - ja wypadam na wstępie, wejdę w przerwania bo tam moge to kontrolować.
  • #11
    adamusx
    Level 27  
    Oczywiscie , zrobie to na przerwaniach,tzn po wystąpieniu przerwania bedzie wykonywana instrukcja sprawdzajaca stany z 3 lini enkoderów.Czestotliwosc generowania przerwań powiedzmy powiedzmy 6x 400 /s powinna w zupełnosci zapewnić odpowiedni zapas poprawnosc odczytu sygnalow nawet w przypadku pojawienia sie impulsów z 3 enkoderów jednoczesnie.
    Tylko zastanawiam sie jak najprosciej ustalic kierunek obrotow programowo majac 2 sygnaly przesuniete w fazie i czy to bedzie poprawnie dzialalo dla 3 enkoderow jednoczesnie.
  • #12
    Dexter77
    Level 28  
    Zalezy jaka chcesz uzyskac dokladnosc. Dla typowych enkoderow z przebiegami przesunietymi w fazie o 90 stopni mozna zliczac 1 impuls na okres 2 lub nawet 4. Zliczanie 1 impulsu na okres jest banalne. Na jednej koncowce szukasz jakiegos zbocza zalozmy ze narastajacego i patrzysz jaki stan jest na drugiej koncowce, jesli wysoki dodajesz jesli niski odejmujesz impuls od jakiejs zmiennej (lub na odwrot zalezy jak podlaczysz ;) ) Gorzej jest zliczac 2 i 4 impulsy na okres.
    Pozdro
    Dexter
  • #13
    adamusx
    Level 27  
    Dzieki za podpowiedz, pomysle nad tym rozwiazaniem :) Nie bede sie bawil w dokladniejszy odczyt, w zupelnosci wystarczy odczyt zbocza jednego sygnalu.