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 1248 8
REKLAMA
  • #1 15253957
    maniocek
    Poziom 11  
    Posty: 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  
    Posty: 361
    Pomógł: 54
    Ocena: 68
    Rozwiązanie kolega znajdzie tutaj: Link
  • REKLAMA
  • #3 15254018
    maniocek
    Poziom 11  
    Posty: 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  
    Posty: 361
    Pomógł: 54
    Ocena: 68
    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  
    Posty: 5500
    Pomógł: 739
    Ocena: 656
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 148
    Pomógł: 4
    Ocena: 18
    Witam.

    Moje rozwiązanie jest takie:
    Link
  • #8 15256225
    maniocek
    Poziom 11  
    Posty: 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.

Podsumowanie tematu

✨ Mariusz projektuje układ z silnikiem Pololu 172:1 Metal Gearmotor 25Dx56L mm LP 6V z enkoderem 48 CPR, co daje 8256 impulsów na obrót. Przy prędkości maksymalnej 54 mm/s, układ generuje około 13800 impulsów na sekundę. Mariusz poszukuje biblioteki zdolnej do zliczania impulsów z taką częstotliwością, ponieważ dostępne rozwiązania ograniczają się do 1 kHz. Użytkownicy sugerują, że ATmega32 może obsłużyć tę ilość impulsów, ale przy dużym obciążeniu procesora mogą wystąpić straty impulsów. Proponują napisanie własnej obsługi enkodera lub rozważenie użycia mikrokontrolera XMega, który ma wbudowane funkcje do obsługi enkoderów. Wskazują również na możliwość sprzętowego liczenia impulsów oraz konieczność rozpoznawania kierunku obrotu.
Wygenerowane przez model językowy.
REKLAMA