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

C - ATmega32 i enkoder o dużej częstotliwości impulsów

maniocek 19 Gru 2015 18:34 1188 8
REKLAMA
  • #1 15253957
    maniocek
    Poziom 10  
    Dzień dobry,

    Jestem na etapie projektowania i oprogramowywania pewnego układu.

    Układ ten składa się m.in. z silnika+enkodera, dokładnie takiego,
    Pololu 172:1 Metal Gearmotor 25Dx56L mm LP 6V with 48 CPR Encoder
    Na wyjściu z przekładni, mamy 48*172= 8256 impulsów na jeden obrót.
    Na wał osadzoną mam rolkę napędową o średnicy 31 mm .
    Daje nam to prędkość maksymalną około 54 mm/s czyli jakieś 1 i 2/3 obrotu rolki czyli otrzymamy około 13800 impulsów na sekundę...

    Większość bibliotek co znalazłem do tej pory zliczał impulsy z częstotliwością 1kHz, więc, to jest o jakieś 14 razy za mało do moich zastosowań.

    Prosiłbym o jakąś radę, czy może ktoś się spotkał z biblioteką zdolną obsłużyć prawidłowo taką ilość impulsów?
    A może gdzieś robię błąd w swoich obliczeniach?

    Pozdrawiam,
    Mariusz
  • REKLAMA
  • #2 15253977
    Flesz
    Poziom 22  
    Rozwiązanie kolega znajdzie tutaj: Link
  • REKLAMA
  • #3 15254018
    maniocek
    Poziom 10  
    @Flesz dziękuję za odpowiedź.

    Układ buduję w oparciu o ATMegę32, nie ma ona takich możliwości jak XMega,która już ma w sobie funkcje do obsługi enkoderów.

    Taktuję zewnętrznym kwarcem 16MHz , więc przerwania z częstotliwością 14kHz powinno dać się uzyskać.
  • #4 15255247
    Flesz
    Poziom 22  
    maniocek napisał:
    @Flesz Taktuję zewnętrznym kwarcem 16MHz , więc przerwania z częstotliwością 14kHz powinno dać się uzyskać.


    Na pewno się da - przy prostym programie. Jeżeli jednak procesor będzie mocno obciążony to dodatkowe zliczanie enkodera może powodować utratę impulsów, a co za tym idzie przekłamania. Myślę że z czegoś to wynika że gotowe biblioteki liczą do 1KHz (pytanie przy jakim kwarcu).

    Możliwości widzę dwie:

    1 - napisać obsługę enkodera samemu - jeżeli reszta programu nie będzie obciążała procka - powinien nadążyć.

    2 - przeprosić się z XMegą
  • REKLAMA
  • #5 15255307
    excray
    Poziom 41  
    Jeśli chcesz liczyć impulsy bez rozpoznania kierunku to możesz skorzystać ze sprzętowego liczenia podając sygnał na wejście zegara i ustawiając zewnętrzne taktowanie.
  • #6 15255563
    dondu
    Moderator na urlopie...
    maniocek napisał:
    ... czyli otrzymamy około 13800 impulsów na sekundę.
    .....
    A może gdzieś robię błąd w swoich obliczeniach?

    Owszem, robisz błąd gdyż:

    Cytat:
    This gearmotor consists of a low-power, 6 V brushed DC motor combined with a 171.79:1 metal spur gearbox, and it has an integrated 48 CPR quadrature encoder on the motor shaft, which provides 8245.92 counts per revolution of the gearbox’s output shaft.

    ...

    Free-run speed @ 6V: 36 rpm

    stąd przy powyższych warunkach:

    36rpm * 8245.92impulsów/obrót / 60sek = 4947,55 impulsów/sek

    z czym mikrokontroler (pracując np. z częstotliwością 16MHz) poradzi sobie bez problemu (podobnie jak z 13800 impulsów/sek).
    Ale jeśli uC jest wykorzystany bardzo mocno w innym zakresie, to zawsze można dodać drugi malutki, który zajmie się tylko i wyłącznie enkoderem (-ami).
  • REKLAMA
  • #7 15256206
    Pavlik71
    Poziom 15  
    Witam.

    Moje rozwiązanie jest takie:
    Link
  • #8 15256225
    maniocek
    Poziom 10  
    @excray kierunek musi być rozpoznawany obowiązkowo. Kierunek i prędkość.

    @dondu dziękuję za celną uwagę. Faktycznie, mogę liczyć impulsy ( a z nich ilość obrotów) pomijając wstępnie rolkę. Dopiero po rozpoznaniu ilości obrotów mogę do wzoru podstawiać średnicę rolki i z niego prędkość liczyć i wyświetlać na LCD.
REKLAMA