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

Wybór trybu PWM i konfiguracja timerów w Atmega8a do sterowania silnikami

mondo90 17 Lut 2015 22:26 1281 17
REKLAMA
  • #1 14450023
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    Witam,

    Planuję wykorzystać timer atmegi8a do generowania sygnałów PWM których zadaniem będzie sterowanie 2 silnikami. Mam jednak kilka problemów z wyborem odpowiedniego rozwiązania, które wynikają z niezrozumienia sposobu działania. Stąd kilka pytań:

    1.) Wedle datasheet atmega8a ma kilka rodzajów timerów 8/16 bit z różnymi licznikami "Counter0/1/2", jaka jest różnica pomiędzy nimi poza różnicą związana z bitami i tym samym inną rozdzieczością ? Po co nam właściwie liczniki w PWM?

    2.) Wydaje mi się iż do mojego zadania odpowiedni będzie wybór "Phase and Frequency Correct PWM" ze względu na zgodność fazową ale mam już ogromy problem z wyborem tzw "Compare Output Mode", po co własciwie porównywać wyjścia portów PWM, jaki tryb wybrać ?

    3.) Wiem iż preskalera używamy aby dopasować częstotliwości (z wyższych do niższych) ale własciwie po co to robić, jakie płyną z tego korzyści, nie do końca rozumiem zastosowania.
  • REKLAMA
  • #2 14450197
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Zacznijmy od pkt 1. i pytania:

    mondo90 napisał:
    Po co nam właściwie liczniki w PWM?

    Czy wiesz w ogóle co to jest PWM?
    Opisz to własnymi słowami a sam zrozumiesz dlaczego są potrzebne. Jeśli nie, to podpowiemy.
  • REKLAMA
  • #3 14450289
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    PWM generuje sygnał o stałej amplitudzie oraz częstotliwości ale różnym współczynniku wypełnienia czyli czasie trwania danego sygnału, który na przemian zmiania stan z wysokiego na niski i odwrotnie.
    No i właśnie, po co tutaj licznik ? Co mamy zliczać ? Ja wyobrażam to sobie tak (i tak chciałbym aby wyglądał mój sygnał sterujący), że na podstawie np. odczytu z ADC (który już mam oprogramowany i działający) ustawiam sygnał PWM na np. prawy silnik z wypełnieniem 50 % i taki przebieg trwa sobie aż nie wprowadzę innego. Po chwili znowu bazując na odczytach zmieniam wartość sygnału PWM na 100 % po czym na 80, 20 70 % itd. Dlatego właśnie nie rozumiem po co tutaj licznik.

    Czytam datasheet i jestem kompletnie zgubiony ;/ Udału mi się wywnioskować iż odpowiednim dla mnie rozwiązaniem będzie "Phase and Frequency Correct PWM", ale nie potrafię znaleźć tak prostej sprawy jak uruchomienie PWM na porcie OC1A. Wydaje się, że rejestr za to odpowedzialny to TCCR1A, ale jesli tak to TCCR1B powinien być odpowiedzialny za pin OC1b, a ma on zupełnie inne bity niż TCCR1A.

    PS: podobnie do licznika nie widzę potrzeby ustawiania "Compare Match" po co sprzętowo ustawiać co się ma stać w przypadku taich samych wartości na kanałach PWM skoro mogę to zrobić płynnie programowo.

    Jak widać jestem zgubiony, proszę o pomoc ;)

    Dzięki.
  • #4 14450304
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    mondo90 napisał:
    PWM generuje sygnał o stałej amplitudzie oraz częstotliwości ale różnym współczynniku wypełnienia czyli czasie trwania danego sygnału, który na przemian zmiania stan z wysokiego na niski i odwrotnie.
    No i właśnie, po co tutaj licznik ? Co mamy zliczać ?

    To co wytłuściłem :)

    http://mikrokontrolery.blogspot.com/2011/04/pwm-co-to-takiego.html

    To pytanie uściślające: Co to znaczy wypełnienie 80%?
  • #5 14450423
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    dondu napisał:
    To pytanie uściślające: Co to znaczy wypełnienie 80%?


    80% wypełnienia to 80 % stanu "high" w danym okresie, czyli jeśli okres trwa sekundę to przez 800 ms będzie przepływał prąd przez dany pin. po czym zatrzyma się na 200ms i cała operacja się powtórzy. Zgadza się ?

    Dzięki za pytania kontrolne, ale co z moimi pytaniami ? ;)

    Dzięki.
  • Pomocny post
    #6 14450442
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    To nie pytania kontrolne tylko naprowadzające :)

    mondo90 napisał:
    80% wypełnienia to 80 % stanu "high" w danym okresie, czyli jeśli okres trwa sekundę to przez 800 ms będzie przepływał prąd przez dany pin. po czym zatrzyma się na 200ms i cała operacja się powtórzy. Zgadza się ?

    I właśnie do odmierzania tych czasów służą liczniki (timery).
    Wybrany timer z funkcją PWM, odlicza określone odcinki czasowe za pomocą sygnału go taktującego z reguły (F_CPU / preskaler).
    Odlicza zarówno okres PWM, czyli 1000ms (100%) z Twojego przykładu jak i wypełnienie, czyli 800ms (80%).
    Dzięki temu może w odpowiednim momencie zmienić stan pinu.

    Czy teraz rozumiesz do czego potrzebne są liczniki (timery) w przypadku PWM?
  • #7 14450457
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    dondu napisał:
    Czy teraz rozumiesz do czego potrzebne są liczniki (timery) w przypadku PWM?


    Tak, dziękuję ;)

    Nie znalazłem natomiast ciągle odpowiedzi na to pytanie:

    Cytat:
    Udału mi się wywnioskować iż odpowiednim dla mnie rozwiązaniem będzie "Phase and Frequency Correct PWM", ale nie potrafię znaleźć tak prostej sprawy jak uruchomienie PWM na porcie OC1A. Wydaje się, że rejestr za to odpowedzialny to TCCR1A, ale jesli tak to TCCR1B powinien być odpowiedzialny za pin OC1b, a ma on zupełnie inne bity niż TCCR1A.
  • REKLAMA
  • Pomocny post
    #8 14450458
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Phase and Frequency Correct PWM - to najbardziej skomplikowany PWM w prostych AVR.
    Możesz go oczywiście zastosować do sterowania silnikami.
    Proponuję jednak, byś zaczął od prostego trybu Fast PWM.

    Wybór trybu PWM i konfiguracja timerów w Atmega8a do sterowania silnikami

    Przeczytaj o nim w Timer1 i zadaj konkretne pytania czego nie rozumiesz.

    Możesz także wzorować się na przykładzie: http://mikrokontrolery.blogspot.com/2011/03/avr-fast-pwm-sposob-na-dac.html
  • #9 14451427
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    dondu napisał:


    No właśnie strasznie utrudnia sprawę fakt, że wymieszane w tym artykule są wszystkie timery0/1/2 na raz. W tekście poradnika "Wykorzystałem do tego możliwość wygenerowania dwóch sygnałów z Timera2." w kodzie już tego timera nie ma za to pojawia się timer0. Tutaj moje pytanie po co zastosowany został timer0, wygląda na to że do przerwań ale jeśli tak to dlaczego tych przerwań nie zrobić z timera1/2 ?

    PS: zrobiłem test Fast PWM na silniczku i w momencie spadku obrotów oraz całkowitego zatrzymania wydaje dziwne sygnały (jakby pisk) czy to jest związane z tą niezgodnością fazy ?
  • Pomocny post
    #10 14451633
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Ten silnik nie wie, co to jest "niezgodność fazy". Możesz używać dowolnego trybu PWM. Pisk prawdopodobnie wynika stąd, że podajesz przebieg PWM o niezerowym wypełnieniu, jednak za małym, żeby silnik poruszyć. A on się stara ruszyć, że aż piszczy.
  • #11 14452204
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    Czy dobrze rozumiem, że :

    Okres nie jest jawnie definiowany, a wynika z ustawienia wartości startowej oraz granicznej (zatrzymania) licznika. Czyli np. TOP programujemy jako OCR1A = 128; i to jest wartośc szczytowa (TOP), ale znowu jest pytanie od czego licznik odlicza czy od zera ? I nawet ważniejsze pytanie co jest jednostką ? Te 128 to milisekundy, bity czy cykle procesora ?

    PS: Czy częstotliwość na pewno jest stała - "The waveform generated will have a
    maximum frequency of fOC2 = fclk_I/O/2 when OCR2 is set to zero (0x00)" sugeruje, że częstotliwość wzrasta.

    Dzięki ;)
  • #12 14452477
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Wszelkie Twoje wątpliwości rozwieje lektura Datasheet. Znajdziesz tam i opis i parę obrazków.
  • #13 14457515
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    Dalej mam problem, chciałbym ustawić dwa wyjścia PWM tak, aby po sterowaniu progiem OCR1A niezależnie zmianiały się ich wypełniania.
    
    TCCR1A |= (1<<COM1A1) //| (1<<COM1A0) //Zmiana stanu wyjścia OC1A na niski przy porównaniu A
    		   |  (1<<COM1B1) | (1<<COM1B0)//Zmiana stanu wyjścia OC1B na niski przy porównaniu B
    	       |  (1<<WGM13); //Tryb 8 ?
    		   
    	TCCR1B |= (1<<WGM13)   | (1<<WGM12)  //Tryb PWM, Phase and Frequency Correct
    		   | (1<<CS11) | (1<<CS10) ;		// preskaler 8 bit
    
    	ICR1 = 500;  // TOP ?
    	
    
    	OCR1A= 250;    //Wartość początkowa porównania A (Wyjście OC1A - PB1),
    	//wypełnenie = 50%
    	OCR1B= 250;    //Wartość początkowa porównania B (Wyjście OC1B - PBB),
    	 //wypełnenie = 50%
    


    Problem w tym, że nie uzsykuje takiego efektu co jest nie tak? Dlaczego W rejestrze "TCCR1A" ustawiane są bity odpowiedzialne za wyjście OC1B ? Czy generalnie sterwowanie prędkością poprzez zmianę zmiennej OCR1x jest wogóle dobrym rozwiązaniem ?

    Bardzo proszę o odpowiedzi.

    Dziekuję. ;)
  • REKLAMA
  • Pomocny post
    #14 14457728
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Ustawiasz bit WGM13 w dwóch rejestrach,a on jest tylko w jednym - TCCR1B. Za to niepotrzebnie ustawiasz bit WGM12, co powoduje, że nii działasz w trybie PWM, a w trybie CTC (tryb 12 zamiast 8).
  • #15 14460402
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powyżej mój aktualy kod z trybem PWM, Phase Correct oraz preskalerem clkI/O/64. Można powiedzieć że działa natomiast mam kilka pytań:
    1. Prędkością silników steruję poprzez zmianę OCR1A/B czy to odpowiedni sposób ?
    2. Czy przerwanie (interrrupt) poprzez OCR1A/B = 0 jest dobrym rozwiązaniem czy lepiej skorzystać z mechanizmu przerwań ?
    3. Pomimo dużego wypełniania np. OCR1A/B = 400 lub nawet 500 (100%) silnik ma kłopoty z ruszeniem (z obciążeniem), czym to jest spowodowane ? Generalnie dla powyższego kodu silmniki są zdolne pracować tylko z wypełnieniem OCR1A/B > 200 w innym przypadku nawet bez obciążenia nie mogę ruszyć, a co za tym idzie regulacja prędkości pojazdu jest praktycznie żadna -> prosza się lub nie. Jak to naprawić ?
    4. Jak redukować drgania, szumy wywołane pracą silników w trybie PWM na układ ?

    Dzięki wielkie za pomoc ;)
  • Pomocny post
    #16 14460816
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    1. A jest jakiś inny?

    2. Ale o co chodzi?

    3. Przy starcie silnika należy chwilowo zwiększyć wypełnienie. Schematu nie pokazałeś i nie wiemy nic o zasilaniu ani silnikach, a być może problem jest po stronie elektryki.

    4. Jakie szumy i drgania? W zależności od częstotliwości PWM silnik może lekko buczeć lub piszczeć (w praktyce używa się częstotliwości kilkaset Hz - ze starymi silnikami lub od kilku do kilkudziesięciu kHz z nowymi), ale raczej nie drgać. Nie wiem, co to są "drgania na układ".
  • Pomocny post
    #17 14466029
    Konto nie istnieje
    Poziom 1  
  • #18 14466100
    mondo90
    Poziom 13  
    Posty: 165
    Pomógł: 2
    Ocena: 2
    BlueDraco napisał:
    2. Ale o co chodzi?

    O przerwania, pwm działa i teraz chcemy go zastopować, pytanie jak to zrobić poprawnie, bo mam wątpliwości co do mojego sposobu - wypełnienie = 0;

    BlueDraco napisał:
    Jakie szumy i drgania? W zależności od częstotliwości PWM silnik może lekko buczeć lub piszczeć


    Nie chodzi o zachowanie silnika, a układu np. diody migają mam obway iż może to wpływać również negatywnie na działanie uC. Wiem że jest to związane z indukcyjnością silnika oraz przerywanym sygnałem pwm, nie wiem natomiast jak sobie z tym radzić, może jakieś dławiki na doprowadzonym zasilaniu ?

    emarcus napisał:
    yłoby idealnie łatwo, gdyby te bity były umiesczone w jednym rejestrze. Niefotrunnie, tak nie jest (!!!)


    No właśnie, po 2 dniach czytania datasheet zacząłem dopiero dochodzić do jasności...

    emarcus napisał:
    8-bit czyli 256 jest zupełnie wystarczające.


    Raczej 255, ale masz ttaj namyśli ICR1 = 255 ?

    PS: wkrótce dorzuce schemat układu oraz wyliczone częstotliwości PWM.

    Dzieki wielkie za pomoc ;)

Podsumowanie tematu

✨ W dyskusji poruszono temat wykorzystania timerów w mikrokontrolerze Atmega8a do generowania sygnałów PWM w celu sterowania silnikami. Użytkownik zadał pytania dotyczące różnic między timerami 8/16-bitowymi, wyboru trybu PWM oraz zastosowania preskalera. Odpowiedzi wskazują, że liczniki są kluczowe do odmierzania czasu trwania sygnału PWM oraz jego wypełnienia. Użytkownik rozważał zastosowanie trybu "Phase and Frequency Correct PWM", ale otrzymał sugestie, aby zacząć od prostszego trybu "Fast PWM". Wskazano również na problemy z ustawieniem wartości rejestrów oraz na konieczność zrozumienia działania timerów i ich konfiguracji. Użytkownik testował działanie PWM na silniku, zauważając problemy z dźwiękiem przy niskich obrotach, co może być związane z niewłaściwym wypełnieniem sygnału. W końcu, poruszono kwestie dotyczące przerwań oraz wpływu indukcyjności silnika na działanie układu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA