(2 głosujących) PWM (Pulse - Width Modulation) modulacja szerokości impulsu jest powszechnie stosowana do regulacji mocy odbiorników prądu stałego (i nie tylko). Polega ona na sterowaniu wypełnieniem przebiegu prostokątnego o stałej amplitudzie. Mimo że większość mikrokontrolerów posiada własne, przeważnie wielokanałowe, układy PWM, czasem zachodzi potrzeba wekonania czegoś podobnego programowo. W przedstawionym dalej przykładzie pokazana jest zasada sterowania diodami trójkolorowymi (RGB), poprzez zmianę wypełnienia przebiegu prostokątnego sterującego każdy z kolorów. Język BASCOM AVR:Przykładowy program do sterowania diodą RGB przedstawiony jest poniżej: '************* Konfiguracja uC ***************** '*********************************************** $regfile = "attiny2313.dat" $crystal = 16000000 Config Portb = &B11111111 : Portb = &B11111111 Config Portd = &B11111111 : Portd = &B11111111 Config Timer0 = Timer , Prescale = 8 Enable Timer0 : On Timer0 Prztimer0 Enable Interrupts '********** Konfiguracja uC Koniec ************ '****************** Nazwy ******************* '*********************************************** Rd Alias Portb.0 Gd Alias Portb.1 Bd Alias Portb.2 '************* Nazwy Koniec **************** '****************** Zmienne ******************* '*********************************************** Dim Licznik As Byte Dim Rled As Byte , Bled As Byte , Gled As Byte '************* Zmienne Koniec **************** '************ Warunki Poczatkowe *************** '*********************************************** Rled = 80 Gled = 0 Bled = 90 '******* Warunki Poczatkowe Koniec *********** '************** Petla glowna ****************** '*********************************************** Do Loop End '************ Petla glowna Koniec ************** '************ Przerwanie timer 0 *************** '*********************************************** Prztimer0: Incr Licznik If Licznik = 100 Then Licznik = 0 If Licznik < Rled Then Set Rd Else Reset Rd If Licznik < Gled Then Set Gd Else Reset Gd If Licznik < Bled Then Set Bd Else Reset Bd Return '******** Przerwanie timer 0 Koniec ************ Program był testowany na mikrokontrolerze ATTiny2313 o czym świadczy pierwsza linijka w konfiguracji. Timer został ustawiony na podział częstotliwości przez 8. Ponieważ jest on ośmiobitowy (liczy do 256) to przerwanie będzie występowało z częstotliwością ok. 7,8kHz. W przerwaniu Timera (Prztimer0) zostaje zwiększany cyklicznie Licznik od wartosci 0 do 99, co odpowiada regulacji wypełnienia co 1%. Działanie PWM jest zrealizowane w banalny sposób za pomocą instrukcji warunkowej if Licznik.... Porównuje ona aktualną wartość Licznika ze zmienną określającą natężenie (Rled, Gled lub Bled, 3 kanały) i wystawia stan wysoki na pinie wyjściowym jeśli Licznik ma mniejszą wartość od zmiennej, a stan niski jeśli warunek ten nie jest spełniony. W efekcie dla zmiennej (Rled, Gled lub Bled) równej 100 Licznik jest mniejszy od niej cały czas (liczy od 0 do 99) i na wyjściu jest cały czas stan wysoki (wypełnienie 100%). Jeśli natomiast zmienna jest równa 0 to licznik nigdy nie jest od niej mniejszy i wypełnienie będzie równe 0%.
|
|||
Re:Witam Próbuję zastosować
Świeci się cały czas tak samo bo niby jak ma się zmieniać?
Pokaż mi w poniższym kodzie gdzie zmieniasz wartość zmiennej Gled?
Moja strona w powijakach
Dzięki Działa tak jak
Dzięki
Działa tak jak należy. Przeoczyłem taką pierdołkę lecz istotną :D
Re:Witam Próbuję zastosować
Od tego jesteśmy by sobie pomagać.
Moja strona w powijakach
Mam jeszcze taki problem po
Mam jeszcze taki problem po wgraniu do proca poniższego programu działa wyśmienicie tylko jest jeden mankament otóż diody świecą z różną jasnością tak jak trzeba, ale towarzyszy temu nieprzyjemne migotanie domyślam się, że pwm ma za małą częstotliwość i dlatego widoczny jest taki efekt. Jak temu zaradzić ?
procek z wewnętrznym zegarem 1MHz
Re: Mam jeszcze taki problem...
Prawdopodobnie fusy masz ustawione na 1MHz.
Moja strona w powijakach
A czy tak ustawionym zegarze
A czy tak ustawionym zegarze tzn. fabrycznie na 1MHz da się coś więcej wycisnąć z tego programu żeby zniknął ten efekt mrugania? Albo jeszcze inaczej jak policzyć z jaką częstotliwością zmienia się teraz sygnał PWM. Aby dobrać odpowiednią częstotliwość procesora zmieniając fusy.
Re: Mam jeszcze taki problem...
Ja zwykle taktuję procka 8MHz, ale przy jednym MHz na myśl przychodzi mi tylko zwiększenie częstotliwości przerwań.
Moja strona w powijakach
Witam Mam problem z tym
Witam
Mam problem z tym migotaniem ledów problem ten ustał gdy na attiny 26 zwiększyłem wewnętrzne taktowanie na 8MHz. Ale problem ten powrócił gdy przesiadłem się na attiny 45 ustawiłem fusy zgodnie z tym link i pomimo że zgodnie z tym jest niby te 8MHz występuje to migotanie. Poniżej program na którym to testuję:
Re: PWM
Napewno coś jest z fusami bo teraz teoretycznie gdzies 300Hz masz odświerzanie diod, nie ma szans żeby migały. Jak by było 8MHz..... Sprawdź jeszcze raz czy CKDIV jest odznaczony
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
PWM
Witam serdecznie
Chciałbym się dowiedzieć jak dokończyć kod tak żeby włączając przycisk bistabilny rozjaśniały się diody, a po jego wyłączeniu gasły przyciemniając się, z tym że kolejno od 1 diody do 5 diody
To jest timer:
Co wstawić w pętli głównej
napewno bedzie
wiem że muszę zmieniać zmienną wyp(x)
ale nie wiem jak to dokładnie napisać
Re: PWM
Sprecyzuj. Opisz dokładniej.
Moja strona w powijakach
PWM
W pętli wstaw coś takiego:
teraz się rozjaśnia, wstaw jeszcze tak żeby się przyciemniało
Re: PWM
Nie potrzeba pisać czegoś takiego jaik kolega wyżej, bo trzeba zadeklarować dodatkowe zmienne z ilością uzależnioną od ilości kanałów. wystarczy skorzystać z jednej zmiennej ale sprawdzać warunki czy poprzedni kanał osiągnął wartość max ściemnienia (rozjaśnienia).
Moja strona w powijakach
Pwm
podpowie mi ktoś?
Re: PWM
Możesz to napisać na dwa sposoby tylko przerób sobie pod siebie, zmniejsz prędkość czy coś tam:
Załóżmy że zwiększanie zmiennej powoduje ściemnianie diod (bo z tego co pamiętam to tak jest)
i tak dalej i tak dalej. Zasada polega na sprawdzeniu czy poprzednia dioda już została wygaszona.
W tym rozwiązaniu może ukazać się jeden kłopot, mianowicie, jeśli dioda 1 świeci, 2 świeci a 3 jest wygaszona to ten podprogram zacznie wygaszanie od diod 1 ale też od diody 4 ponieważ sprawdzi że dioda 3 jest wygaszona.
Możesz się przed tym zabezpieczyć wprowadzając warunek and w każdej następnej po sobie diodzie.
Moja strona w powijakach
Re: PWM
Spróbuj coś takiego napisać:
Zmienne:
W pętli głównej np co 100ms: ' w przerwaniu jeszcze trzeba dorzucić dzielnik i ustawiać flagę co 100ms
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
W przerwaniu ustawiam
W przerwaniu ustawiam dzielnik
Re: Dzielnik
Jeśli przerwanie masz co 1ms to tak, Taki dzielnik masz dać aby odliczył 100ms. Musisz zliczyć odpowiednią ilość przerwań. Do pracy programowego PWM musisz mieć napewno szybsze przerwanie nic co 1ms bo dzielisz to przez 100 i dostajesz częstotliwość sygnału z PWM, która powinna być napewno ponad 60-80Hz
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
PWM
nie portafie sobie poradzić z obliczeniami
zegar mam 12MHz i prescale np: 256
12000000/256=46875
1/46875= 0,21us
teraz liczę czas na przyjście 256 (timer0) impulsów bo wtedy się przepełni
czy 256 * 0,21us = 0,06ms
dobrze to liczę?
Re: Timer
Nie do końca dobrze... pierwsza część ok ale potem 46875 dzielisz jeszcze przez 256 i potem odwracasz.... wychodzi coś około 5.46ms ale nie jest to dokładna wartość.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
PWM
Witam Wszystkich :)
Wziąłem sobie Attiny2313 zaprogramowałem programem, który jest na pierwszej stronie nie zmieniając nic. Do portów b 0,1,2 podłączyłem zwykłe diody (nie jedną RGB). Włączyłem zasilanie i wszystkie diody świecą jednakowo. Czy nie powinny zapalać się i gasnąć w kolejności?
Z góry dzięki za odpowiedź:)
(-;
Nie wiem co masz na myśli dokładnie, ale jeśli spodziewasz się rozjaśniania i przyciemniania to musisz je sobie dopiero zrobić ...
W takim wypadku odpowiedź na zadane pytanie brzmi NIE.
Gdy będziesz zmieniał wartości XLED osiągniesz zamierzony efekt.
Podobne pytanie ktoś już zadał powyżej i uzyskał odpowiedź.
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
PWM
Powiem Wam zaszalałem z tym kodem :)
Chciałem zrobić program że jak jest na nóżce PIND.4 stan niski to zawsze ma się świecić jedna dioda natomiast jak wystąpi stan wysoki to ma zgasną ta dioda a zaświecić się druga dioda z płynnym wykorzystaniem PWM. Po tym zadaniu procesor ma oczekiwać na pojawienie się znowu stanu niskiego na Pind.4 aby zapalić diodę.
Jak narazie początek mam ale później nie wiem jak zatrzymać tą pętle FOR aby diody nie zapalały się kilkukrotnie na zmianę tylko raz. No i wykonują to równocześnie :(
Proszę o pomoc w rozwiązaniu problemu :)
Witam, mam niby prostą sprawę
Witam, mam niby prostą sprawę ale jak się okazuje nie taką prostą. Otóż taki kod daje mi 1Mhz, 0,5Mhz bo toggle dzieli na pół(czy dzieli?), czy jaką w końcu?
Kod działa widzę ładny kwadrat("oscyloskop" z xmega nie skalibrowany nijak), ale nie mam właściwie pojęcia jaka częstotliwość. A potrzeba mi do kalibracji oscyla.
I jak wygląda wzór na uzyskanie tego PWM bez regulacji wypełnienia??
Jaką F będę miał jak dam Compare = 1? Podzieli na pół?
Pozdrawiam.
Odp. Wyjście zegarowe
Nie napisałeś ile potrzebujesz na wyjściu. Zawsze jest tak z Atmegami, że masz do dyspozycji tylko połowę prędkości bo w jednym cyklu zegara można tylko raz odwrócić stan pinu.
W Attiny2313 na przykład masz tez możliwość włączenia wyjścia zegara bezpośrednio na pin. Nazywa się to CKOUT i stosuje się by w całym systemie był jeden wspólny sygnał.
BARTek
Moja strona
Dzięki za odpowiedź. Otóż za
Dzięki za odpowiedź. Otóż za pomocą np tej zmiennej chciałbym móc regulować F, powiedzmy 50Khz, najlepiej do miliona Hz. I tak to właściwie działa, nie wiem jednak czy właśnie jest podzielona na pół, czy może w ogóle źle liczę. Podzieliłem tak: 8M/8 presc daje 1 Mhz, a toggle jeszcze dzieli jak mówisz na pół bo pełny okres zajmuje 2 cykle, czy dobrze myślę?
Odp.Wyjście zegarowe
Żeby sobie ułatwić i się głupio nie pomylić stworzono kalkulatory. Trochę przez lenistwo ale też kalkulator działa powtarzalnie bez błędów a człowiek potrafi się gdzieś głupio machnąć i traci czas.
W programie MkAVRcalculator jest darmowa zakładka Narzędzia i w niej kalkulator do Timerów.
Fajny z tego względu że możesz przeliczać bezpośrednio z czasu jaki Ci potrzebny na wyjściu albo F potrzebne na wyjściu. Sam zobacz. Jeśli używasz CTC to interesują Cię tabelki z CTC. Jeśli okienko jest puste to znaczy że z tym preskalerem nie da się tego osiagnąć.
Możesz sobie tez zbudowac nawet na byle czym z podstawką 20PIN i LCD taki miernik. Sam go mam zaimplementowany gdzieniegdzie :P
http://mdiy.pl/miernik-czestotliwosci-na-avr-od-1hz-do-10mhz/
W kodzie wpisujesz tylko jaki masz kwarc żeby dobrze liczył i będzie liczył do połowy predkości kwarca bo tez potrafi rozpoznać zmieniony stan pinu tylko raz na jeden cykl zegara ;) Mierzy za to bardzo dokladnie.
BARTek
Moja strona
Ok, dzięki :D
Ok, dzięki :D
Mam Atmega jakiś lcd coś z
Mam Atmega jakiś lcd coś z tego będzie :D
Odp.Wyjście zegarowe
Musisz mieć ATtiny2313 20PIN z tego co pamiętam bo ten kod nie będzie pasował do Mega. Tam jest jedna zmienna zadeklarowana pod konkretnym adresem w pamieci który jest przesunięty w Mega ;)
Dlatego trzeba otworzyć notę aplikacyjną obu mikrokontrolerów i porównać po czym zmienić kod ;)
Wiem bo sam zmieniałem na 328P tylko musiałbym teraz poszukac gotowca.
BARTek
Moja strona
Zrozumiałem po 2h że to nie
Zrozumiałem po 2h że to nie zadziała, zresztą podejrzewałem ze te rejestry nie będą wcale takie same.
Ale uruchomiłem inny kod herc miarki, do tego dałem jeszcze Timer2 toggle, i mam działający miernik i generatorek kwadratu w jednym, niestety nie umiem regulować F tego timera2 więc mam stałą F na wyjściu D7 w Mega32 8M/32 = 250K, ale toggle widze dzieli na pół, tak jak myślałem. Ale ważne że w końcu działa. Mam jakiś punkt odniesienia, bo to do kalibracji niby oscyloskopu na Xmega. Pozdro i dzięki.