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

[atmega328] [atmega328][bascom] Sterowanie PWM2 dla OC2A i OC2B bez ICR2, ICR2H, ICR2L

wicy 11 Kwi 2015 14:22 1587 11
REKLAMA
  • #1 14608394
    wicy
    Poziom 22  
    Dla sterowania dwoma serwami konfiguruję PWM1 poprzez bezpośredni zapis rejestrów:
    
    Tccr1a = &B10100010                             'mode14 - fast pwm, icr1, prescale64
    Tccr1b = &B00011011
    Icr1h = &B00010011                               'wartość icr1=4999
    Icr1l = &B10000111
    Tcnt1h = 0
    Tcnt1l = 0
    

    i steruję serwami przez
    
    Ocr1ah = High(pozycja_serwa)
    Ocr1al = Low(pozycja_serwa)
    lub
    Ocr1bh = High(pozycja_serwa)
    Ocr1bl = Low(pozycja_serwa)
    

    Dla PWM2 nie mam predefiniowanych zmiennych ICR2, ICR2H i ICR2L. Mam tylko TCNT2.
    Nie mam też OCR2AH, OCR2AL.
    Jak więc sterować PWM2 (kanałami OC2A i OC2B) w sposób jak dla PWM1?
  • REKLAMA
  • #2 14608445
    Konto nie istnieje
    Konto nie istnieje  
  • #3 14608464
    wicy
    Poziom 22  
    niveasoft napisał:
    TIMER2 jest ośmiobitowy więc nie ma rejestrów H i L bo nie ma czego podzielić na dwa.


    Tak, tak, racja. Nie doczytałem noty i myślałem, że to dwa identyczne timery.
    TCCR2A i TCCR2B są zdefiniowane i da się Timer2 skonfigurować przez rejestry, tylko nieco inaczej.
    Sterowanie też powinno zadziałać przez OCR2A i OCR2B.
    Muszę tylko ogarnąć jak skonfigurować ten Timer2 żeby działał identycznie jak Timer1.
  • #4 14609911
    wicy
    Poziom 22  
    Chyba jednak nie do końca umiem sobie poradzić z PWM poprzez bezpośrednią konfigurację rejestrów.
    Na czuja ustawiłem:
    
    Tccr2a = &B10100011
    Tccr2b = &B00000110
    Tcnt2 = 0
    

    Czyli tryb 011 - Fast PWM, Top 0xFF, Clear OC2A on compare match, preskaler 256 (dla taktowania 16MHz).
    Sterowanie serwem działa, ale nie do końca elegancko. Pozycja środkowa (OCR1A = 90) ustalana jest prawidłowo, ale na skrajnych wychyleniach mnie interesujących (OCR1A=50 i 130) serwo czasami buczy jakby było pod obciążeniem.

    Czy ktoś mógłby łaskawie przyjrzeć się konfiguracji i ew. podpowiedzieć jak lepiej ustawić częstotliwość PWM (podejrzewam, że tu jest pies pogrzebany) dla 50Hz pożądanych przez serwo?
  • REKLAMA
  • #5 14609932
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #6 14609994
    wicy
    Poziom 22  
    Sama obsługa serwa to nie wszystko co program ma robić. CONFIG SERVOS zdaje się potrzebuje do poprawnej pracy dwóch timerów - w każdym razie robiłem już testy i to programowe sterowanie serwami kolidowało mi przerwaniami timerów potrzebnych do czego innego.
    Dlatego potrzebuję 4 sprzętowych kanałów PWM. Dwa na Timer1 działają bez problemu, no ale tam jest 16bit i rejestr ICR, który załatwia sprawę częstotliwości.
    Na Timer2 jednak poległem i nie potrafię wstać :(
    Poza tym Bascom to jak na razie wprawki a ostateczny program powstanie prawdopodobnie w C++, więc rejestry załatwią sprawę a CONFIG SERVOS nie.
  • #7 14610018
    Konto nie istnieje
    Konto nie istnieje  
  • #8 14610246
    wicy
    Poziom 22  
    niveasoft napisał:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Nie wiem czemu na ATmega328 to nie działa. Nie ma przerwania Compare0a i zmiennej Compare0a. Ale zamieniając to na Oc0a i Ocr0a i tak nie działa :(
    Szukanie powodów zajmuje mi tyle co głowienie się nad sprzętowym PWM, więc jednak wolę zostać przy poprzednim pytaniu - jaki ustawić rejestry dla Timera2?
  • Pomocny post
    #9 14610278
    Konto nie istnieje
    Konto nie istnieje  
  • #10 14611207
    wicy
    Poziom 22  
    No nie, niestety. Mimo pomocy w kompilacji, program nie specjalnie działa.
    Przy ustawieniach jak wyżej podane znalazłem tylko jedną wartość Pwm_led(1) = 99, dla której serwo samo strobując zmienia pozycję z dowolnej na maksymalną. Dla prescale=1024 nie reaguje wcale.

    Ponieważ przy ustawieniach:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i sterowaniu od Ocr2a = 40 do Ocr2a = 130 serwa działają jak należy, z rzadka popiskując w spoczynku (co jest pewnie kwestią złej częstotliwości) poradziłem sobie w ten sposób, że wyłączam PWM Tccr2b = 0 i włączam tuż przed zmianą położenia.
  • REKLAMA
  • Pomocny post
    #11 14611274
    Konto nie istnieje
    Konto nie istnieje  
  • #12 14611339
    wicy
    Poziom 22  
    Z tym spuszczeniem z tonu to całkiem niezły pomysł :)
    Co prawda ślęczę nad Arduino, ale przecież w gotową płytkę mogę wstawić mniejszy kwarc.
REKLAMA