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

Jak obsłużyć więcej serwomechanizmów na atmega32 (PB3, PD7)?

Tokio123 01 Sie 2019 13:55 669 23
  • #1 18091558
    Tokio123
    Poziom 5  
    Hej
    Mam problem z obsługą serwomechanizmów. Potrzebuje obsłużyć 3 ewentualnie 4, ale 3 wystarczą :). Mam zrobioną obsługę na pinach PD4 i PD5. Wiem, że można jeszcze zrobić na pinach PD7 i PB3, ale nie wiem jak. O to mój kod do obsługi 2 serwomechanizmów.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Proszę o pomoc w napisaniu kodu. Z góry dziękuje za pomoc.
  • Pomocny post
    #2 18091841
    szelus
    Poziom 34  
    PB3 jest wyjściem PWM podłączonym do timera nr 0, natomiast PD7 do timera numer 2.
    Musisz po prostu skonfigurować analogicznie pozostałe dwa timery. Tylko że one są 8-mio bitowe, więc rozdzielczość będzie gorsza.
  • #3 18091976
    Tokio123
    Poziom 5  
    Z tego co się orientuję mniej więcej to żeby skonfigurować timer0 trzeba ustawić bit TCRR0 ale nie wiem jak go skonfigurować w kodzie. Zapomniałem dodać, pracuje na kwarcu 16MHZ
  • Pomocny post
    #4 18092224
    Konto nie istnieje
    Poziom 1  
  • #5 18092353
    Tokio123
    Poziom 5  
    A gdy by taktowanie było 12MHZ ? Albo jakaś alternatywa, czy tylko w atmega32 można użyć tych 4 nóżek do sterownia serwem ? Bo w programie docelowym będzie jeszcze UART i timery programowe:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dobrze by było jak bym mógł uzyskać około 180 położeń, gdzie przy OCR=1 Servomechanizm wychyla się na około 1° od zera.
  • Pomocny post
    #6 18092479
    szelus
    Poziom 34  
    Znalazłem czas wniknąć w szczegóły...J
    Jaka ma być rozdzielczość/częstotliwość tego programowego timera? Bo z wartością 108 jest jakaś taka mało okrągła. Rozdzielczość 20ms nie wystarczy? Bo jeżeli musisz go tak skonfigurować do timerów programowych, to czwartego kanału serwa nie da się na nim zrobić.

    UART nie ma nic do rzeczy, ma swój generator częstotliwości.

    o_Tadeusz ma z grubsza rację, tylko preskalera 32 też nie ma, jest 64, więc rozdzielczość serw na timerze 1 będzie 250 kroków. A okres jest 20ms, tyle, ile trzeba.
    Tylko nie wiem skąd ta wartość 620 w pierwszym kodzie - długości impulsu 1 do 2ms odpowiadają wartości rejestru OCR z zakresu 250 do 499.
    Jeżeli wystarczą 63 (nie 64) kroki rozdzielczości (dla timerów 8 bitowych) to najprościej taki timer skonfigurować w trybie 0 (normalnym) z preskalerem 256 i compare mode 3 (ustawienie wyjścia OC przy zgodności), oraz włączyć przerwania od przepełnienia timerów.
    Przerwaniaeod timera 1 będzie wyznaczać okres powtarzania impulsów. W nim:
    - ustawiamy OCR0 na zadaną długość impulsu imp0 z zakresu 0 .. 62:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    - włączamy timer 0 przez ustawienie preskalera na 256.

    W przerwaniu od timera 0 zatrzymujemy timer 0 przez ustawienie preskalera na 0.

    Podobnie można zrobić z timerem 2, jeżeli nie jest wykorzystany do innych celów.

    Rozdzielczość serw na timerze 0/2 można poprawić dwukrotnie przez zmniejszenie zegara głównego do 8MHz i użycie preskalera 64. Wówczas na timerze 1 trzeba użyć preskalera 8 i rozdzielczość serw w tych kanałach wzrośnie 4 krotnie (1000 kroków, w zakresie 1000 do 1999).
  • Pomocny post
    #7 18092616
    Konto nie istnieje
    Poziom 1  
  • #8 18092722
    Konto nie istnieje
    Poziom 1  
  • #9 18092876
    Konto nie istnieje
    Poziom 1  
  • #10 18092970
    Tokio123
    Poziom 5  
    Nie mam niestety kwarcu 8MHZ i nie mam jak sprawdzić. I nie wiem czy mogę użyć wewnętrznego oscylatora. Mój kod wygląda teraz tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy jeżeli zaokrąglę OCR1A i OCR1B jakaś zmienną i dzieleniem czy będę mógł uzyskać żeby servo obracało sie dokładnie co 1° ? I czy jeżeli używam też timera ICP na nóżce PD6 czy on nie będzie współpracował z servami?
  • #11 18093743
    Konto nie istnieje
    Poziom 1  
  • #12 18093902
    Konto nie istnieje
    Poziom 1  
  • #13 18094548
    Tokio123
    Poziom 5  
    Narazie chciałbym obsłużyć serva tylko na Atmega32 później ewentualnie dodać to co ma się dziać na timerze ICP i wybrać odpowiedniego procka. Ale chciałem zapytać tylko o timer ICP, ponieważ nie chcę zakładać oddzielnego tematu w którym będzie jedno pytanie i odpowiedzi tak lub nie.

    Dodano po 20 [minuty]:

    Sprawdziłem mój kod na wewnętrznym oscylatorze 8MHZ i na timerze 1 serva w miarę działają, ale timerze 0 już w ogóle servo nie reaguję. Wklejam kod jeszcze raz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 18094580
    Konto nie istnieje
    Poziom 1  
  • #15 18094585
    Tokio123
    Poziom 5  
    Obsługiwał będę w programie docelowym:
    -UART
    -Timery Programowe + PWM (Na jednym timerze"2")
    -3xserva
    -Czujnik HC-SR04 na timerze ICP
    Do reszty nie są potrzebne przerwania i timery.
  • #16 18094719
    Konto nie istnieje
    Poziom 1  
  • #17 18094740
    Tokio123
    Poziom 5  
    Prędkości transmisji uart 115200 / 9600

    Timerów programowych nie jestem pewien ile dokładnie około 6/8 może mniej

    Jestem dość początkującym i obawiam się większych atmeg jak np. atmega 1280/1281 boje się że nie będę umiał dobrze zaprogramować tych rzeczy, które mam dobrze oprogramowane na atmega32.

    Zapomniałem jeszcze dodać, że będzie także transmisja przez moduł RFM73, będzie to zajmowało około 50% pamięci RAM w atmega32 w innych atmegach nie wiem

    Reszta to sterowanie silnikami dc i krokowymi i przerwania encodera na INT0 i INT1( też zapomniałem dodać )
  • #18 18094749
    Konto nie istnieje
    Poziom 1  
  • #19 18094757
    Tokio123
    Poziom 5  
    Servami chciałem sterować sprzętowo pwm będę wykorzystał, gdzie indziej dlatego mysłałem czy by nie zrobić np 2x atmega328 jedna by robiła część z opisanych zadać druga inną części komunikowały by się uartem jedna by wszystko kumulowała i wysłała przez RFM73
  • #20 18094760
    Konto nie istnieje
    Poziom 1  
  • #21 18094792
    Tokio123
    Poziom 5  
    Procesory były by połączone kablami RXD1-->TXD2 i RXD2-->TXD1. Głowna atmega podłączona do RFM73 wysyłała by paczke danych do drugie, która by to parsowała i ustawiała poszczególne zmienne.
  • #22 18094829
    Konto nie istnieje
    Poziom 1  
  • #23 18094832
    Tokio123
    Poziom 5  
    Chodziło mi o uart jednej atemgi( RXD1 i TXD1 ) i uart drugiej atmegi( RXD2 i TXD2 )
  • #24 18094868
    Konto nie istnieje
    Poziom 1  
REKLAMA