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

ATMEGA32[C] - Źle działający programowy PWM na timerze 2

łuki_mar44 16 Cze 2015 22:09 1224 12
REKLAMA
  • #1 14777416
    łuki_mar44
    Poziom 18  
    Witam!

    Zawracam się do szanownych kolegów z nietypowym problemem, mianowicie wykonuję aktualnie sterownik bramy dwuskrzydłowej na uC Atmega32
    gdzie do sterowania silnikami 24V chciałem wykorzystać PWM(funkcja powolnego startu i domykania bramy).
    Przy sprzętowym PWM wszystko jest jak najbardziej ok (silniczki pięknie się starują),
    natomiast gdy do generowania przebiegu używam programowego PWMu
    realizowanego w oparciu o przerwanie TIMERA2, przebieg na zaciskach silnika ma bardzo dziwny kształt co powoduje nie prawidłową pracę silnika.

    ATMEGA32[C] - Źle działający programowy PWM na timerze 2
    PWM programowy

    ATMEGA32[C] - Źle działający programowy PWM na timerze 2
    PWM sprzętowy

    Poniżej zamieszczam konfigurację timera2 oraz jego przerwanie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Konfiguracji sprzętowej (testowej) nie zamieszczam gdyż
    działa dobrze co widać na generownym przebiegu.

    Jeśli chodzi o połączenie elektroniczne to generowane impulsy podaję kolejno na
    optotraik (6n137)-->driver (TC4420)-->mosfet (IRF540)
    -->2x przekaźnik(obroty lewo-prawo)-->silnik

    Nie zakładał bym tego tematu jeśli alternatywnie mógł bym użyć sprzętowej opcji, lecz nie ma takiej możliwości ponieważ, timer0 oraz timer1 wykorzystuje do zliczania impulsów z silnika w celu określenia położenia w jakim znajduje się śruba.
  • REKLAMA
  • #2 14777458
    excray
    Poziom 41  
    A ustawiłeś rejestrem DDRD wyjścia dla tych pinów? Pytam bo nie widzę w kodzie.
  • REKLAMA
  • #3 14777512
    łuki_mar44
    Poziom 18  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tak wygląda konfiguracja rejestru DDRD, zapomniałem jej umieścić w pierwszym poście...

    P.S. Żeby było śmieszniej to na wyjściu PINU PD5 i PD4 przy programowym PWMie jest idealny prostokąt tak samo jak przy sprzętowym, natomiast takie cuda dzieją się bezpośrednio na zaciskach ślinika...
  • #4 14777699
    dondu
    Moderator na urlopie...
    łuki_mar44 napisał:
    Nie zakładał bym tego tematu jeśli alternatywnie mógł bym użyć sprzętowej opcji, lecz nie ma takiej możliwości ponieważ, timer0 oraz timer1 wykorzystuje do zliczania impulsów z silnika w celu określenia położenia w jakim znajduje się śruba.

    A nie możesz zamienić funkcjonalności, tak by odzyskać timer1 do generowania dwóch PWM?


    łuki_mar44 napisał:
    P.S. Żeby było śmieszniej to na wyjściu PINU PD5 i PD4 przy programowym PWMie jest idealny prostokąt tak samo jak przy sprzętowym, natomiast takie cuda dzieją się bezpośrednio na zaciskach ślinika...

    Cudów nie ma - niezależnie jak generujesz PWM (programowo, czy sprzętowo), jeśli sygnał na pinie będzie taki sam, to i efekt musi być ten sam.
  • #5 14777799
    excray
    Poziom 41  
    Pokaż jak wyglądał kod przy sprzętowym PWM. W opisie masz 5859Hz tym czasem przerwanie według ustawień będzie 23437 razy na sekundę co daje w takim trybie generowania 91Hz na wyjściu. Czy przypadkiem przy sprzętowym nie miałeś zupełnie innej częstotliwości na wyjściu?
  • #6 14777834
    łuki_mar44
    Poziom 18  
    Nie mogę zamienić funkcjonalności gdyż jak pisałem wcześniej timer1 używam do pomiarów impulsów bo tylko tam jest licznik T1.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 14777854
    dondu
    Moderator na urlopie...
    łuki_mar44 napisał:
    Nie mogę zamienić funkcjonalności gdyż jak pisałem wcześniej timer1 używam do pomiarów impulsów bo tylko tam jest licznik T1.

    Timer0 posiada wejście do zliczania impulsów. Patrz dokumentacja schemat Timer0.

    Opisz może dokładniej jak wykorzystujesz Timer0 i Timer1.
  • REKLAMA
  • #8 14777856
    łuki_mar44
    Poziom 18  
    Rzeczywiście na oscyloskopie z przeliczenia częstotliwość wynosi około 100Hz...

    Dodano po 41 [sekundy]:

    Posiadam dwa silniki, także wykorzystuje licznik T0 i T1 ...
  • #10 14783278
    łuki_mar44
    Poziom 18  
    Powodem moich problemów było złe wyliczanie częstotliwości...

    Zamiast liczyć 12 000 000/2(podział_wew)/256(presc)/256(pwm_8_bit)=91Hz,
    liczyłem 12 000 000/256(presc)/8(pwm_8_bit)=5859Hz

    Nie mam pojęcia co mi się uroiło, żeby w ten sposób wyliczać częstotliwość,
    tak więc dzięki za naprowadzenie...

    pozdrawiam
  • #11 14784280
    yokoon
    Poziom 29  
    Witam.
    Pierwszy Twój wzór dotyczy:
    Phase Correct PWM Mode

    drugi to:
    Fast PWM mode
  • #12 14784527
    BlueDraco
    Specjalista - Mikrokontrolery
    Pierwszy wzór dotyczy pwm o 256 możliwych stopniach wypełnienia, drugi o ośmiu... ;)
  • #13 14803907
    łuki_mar44
    Poziom 18  
    Nie chciałbym zakładać nowego wątku także, opiszę kolejny problem jaki na potkałem przy budowie tego sterownika w tym temacie.

    Poniżej zamieszczam testowy kod do sterowania silnikiem lewo prawo.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Po wystartowaniu silnika zliczam impulsy w rejestrze TCNT1 i porównuje je z wartością (w tym przypadku) 500, jeśli przychodzi 500 - setny impuls zatrzymuje silnik i zmieniam obroty. Kolejno odliczam 500 impulsów i tak w kółko...

    Problem polega na tym, że położenie śruby zmienia się minimalnie za każdym zamknięcie lub otwarciem przy stałej odległości.

    ATMEGA32[C] - Źle działający programowy PWM na timerze 2

    Przykładowo po pierwszym wysterowania śruba przemieszcza się z punktu 1 do punktu 2, przy kolejnym z punktu 2 do 3, z 3 do 4, 4 do 5, 5 do 6 i jak zaznaczyłem
    na zdjęciu powstaje przesunięcie.

    Impulsy zliczane są dobrze, gdyż zapisywałem wartość rejestru do pamięci EEPROM po jednym cyklu i otrzymywałem wartość 500.

    Podczas przesuwu na wyjściu czujnika halla występuje przebieg prostokątny o częstotliwości około 125Hz.

    Czy ktoś z kolegów orientuje się co może być tego przyczyną, lub zna lepszą metodą pomiaru przesunięcia dla
    takiego przypadku...

    pozdrawiam
REKLAMA