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

Atmega64 i PWM 6-kanałowy sterownik oświetlenia

as_1011 26 Wrz 2011 20:03 4169 21
REKLAMA
  • #1 9966551
    as_1011
    Poziom 10  
    Witam.
    Próbuję oprogramować w Bascom 6-kanałowy sterownik oświetlenia wykonany na atmega64.
    Problem w tym, że nie mogę poprawnie skonfigurować PWM tak aby każdy kanał mógł być sterowany niezależnie w trybie 10-bitowym.
    Czy może ktoś ma doświadczenia z tym układem i można prosić o wskazówki ?
    Potrzebuję informacji jak skonfigurować PWM.
    Dziękuję z góry.
    Pozdrawiam.
  • REKLAMA
  • #2 9968018
    mirekk36
    Poziom 42  
    A zastanowiłeś się kiedyś jak można uzyskać rozdzielczość 10 bitów w oparciu o timer 8-bitowy?

    Podpowiem tylko, że nawet 8-kanałowy PWM o rozdzielczości 10 bitów można najspokojniej w świecie zrobić nawet na ATmega8 tyle że programowo. Może warto taką opcję rozpatrzyć ?
  • REKLAMA
  • #3 9968287
    tmf
    VIP Zasłużony dla elektroda
    Można, a można też przewertować noty Atmela (jeśli już o AVR mowa) i znaleźć procesor ze sprzętowym 6-kanałowym, 10-bitowym PWM.
    Albo przeszukać forum elektrody, gdzie są dziesiątki takich postów razem z gotowcami.
  • #4 9968816
    as_1011
    Poziom 10  
    Jeżeli chodzi o notę atmega64 to wyraźnie jest napisane "6 PWM Channels with Programmable Resolution from 1 to 16 Bits" , chyba że ja tego nie rozumiem.

    Jeżeli chodzi o przyklad konfiguracji PWM w atmega64 to bardzo prosze o podanie linku do strony z konkretnym działającym przykładem, pomimo usilnych moich starań nie mogłem odnaleźć.[/b]
  • REKLAMA
  • #5 9968899
    dondu
    Moderator na urlopie...
    as_1011 napisał:
    Jeżeli chodzi o notę atmega64 to wyraźnie jest napisane "6 PWM Channels with Programmable Resolution from 1 to 16 Bits" , chyba że ja tego nie rozumiem.

    Zgadza się. chodzi o Timer 1 oraz Timer3. Zobacz schemat takiego timera: Figure 46. 16-bit Timer/Counter Block Diagram

    as_1011 napisał:
    Jeżeli chodzi o przyklad konfiguracji PWM w atmega64 to bardzo prosze o podanie linku do strony z konkretnym działającym przykładem, pomimo usilnych moich starań nie mogłem odnaleźć.[/b]

    Ja także nie potrafię, więc datasheet w łapkę i próbuj, a rezultaty wklej tutaj i pomoc na pewno znajdziesz.
  • #6 9969359
    mirekk36
    Poziom 42  
    as_1011 napisał:
    Jeżeli chodzi o notę atmega64 to wyraźnie jest napisane "6 PWM Channels with Programmable Resolution from 1 to 16 Bits" , chyba że ja tego nie rozumiem.


    No nie rozumiesz. Więc na zdrowy chłopski rozum to weź. Od 1 do 16 bitów ale dla timerów 16-bitowych natomiast od 1 do 8 bitów dla timerów 8-bitowych

    Więc teraz zajrzyj szczegółowo do noty i dla każdego timera sprawdź PWM. Ustawiane rozdzielczości masz tylko dla 16-bitowych. A dla 8-bitowych ????? no tylko jeden rodzaj rozdzielczości tyle ile ma cały timer - czyli 8 bit.
  • #7 9969791
    as_1011
    Poziom 10  
    Właśnie mam na mysli TIMER1 i TIMER3. Czyż nie są 16-bitowe ?
  • #9 9969933
    as_1011
    Poziom 10  
    Problem w tym , że na pięciu wyjściach: OC1A/B/C oraz OC3A i OC3B mogę sterować PWM ale przy wartości zmiennej ok 20 wypełnienie jest już 100% (działa tylko w bardzo małym zakresie. Co robię źle ?

    A na wyjściu OC3C wogóle nie działą.

    Przykład najprostszego kodu na którym m.in. testowałem:

    '------------ ŚCIEMNIACZ PWM 6-kanałowy ---------------
    '-------------------------------------------------------
    $regfile = "m64def.dat"
    $crystal = 4000000

    Ddrb = &B11110000 : Ddre = &B00111000

    Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down
    Config Timer3 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Compare C Pwm = Clear Down

    Dim Wypelnienie As Integer
    Wypelnienie = 0

    **************
    Do

    For Wypelnienie = 0 To 1023

    Ocr1al = Low(wypelnienie) : Ocr1ah = High(wypelnienie)
    Ocr1bl = Low(wypelnienie) : Ocr1bh = High(wypelnienie)
    Ocr1bl = Low(wypelnienie) : Ocr1bh = High(wypelnienie)

    Ocr3al = Low(wypelnienie) : Ocr3ah = High(wypelnienie)
    Ocr3bl = Low(wypelnienie) : Ocr3bh = High(wypelnienie)
    Ocr3bl = Low(wypelnienie) : Ocr3bh = High(wypelnienie)

    Waitms 5

    Next Wypelnienie

    Loop
    End
    **************[/b]
  • #10 9969965
    mirekk36
    Poziom 42  
    as_1011 napisał:
    Właśnie mam na mysli TIMER1 i TIMER3. Czyż nie są 16-bitowe ?


    No ale gafę strzeliłem - przepraszam - ATmega64 posiada po 3 PWM'y dla każdego 16-bitowego timera ;) To ja nie doczytałem noty. Zatem możesz wybrać sobie zdaje się tryb 15 w rejestrze TCCRxA i masz 3 PWM'y 16-bitowe.
  • #11 9970098
    danthe
    Poziom 30  
    No nie wiem, ja używam " Pwm1a = wypelnienie" , i działa ok. Inna sprawa to skąd wiesz że po wpisaniu "20" do zmiennej "wypelnienie" masz 100% PWM? Sprawdziłeś oscyloskopem? Czy masz po prostu diody led podpięte na wyjścia PWM i oceniasz na oko?
  • #12 9970187
    as_1011
    Poziom 10  
    Mam podpiete diody i oceniam na oko, ale w zwolnionym tempie. Uzyskuje pełna jasność i już koniec sterowania. Natomiast dla wartości wypełnienie=1 dioda świeci już ok 20% mocy.

    Gdy robiłem sterowanie PWM na mniejszych avr-ach wszystko działało OK.
  • REKLAMA
  • #14 9970377
    as_1011
    Poziom 10  
    Może konfigurację fusebitów mam niwłaściwą. Tryb zgodności ustawiony na AM64.
    Co jeszcze jest ważne ?
  • #15 9970940
    danthe
    Poziom 30  
    Oko ludzkie niestety liniowością nie grzeszy, miałem dokładnie taki sam problem - liniowo zwiększając pwm zasilający diody uzyskiwałem prawie natychmiast sporą jasność, gwałtownie się zwiększającą, po czym prawie zero różnicy. po podpięciu oscyloskopu - wszystko w porządku, liniowo wzrastające wypełnienie. Konsternacja !
    Dodatkowo wydaje mi się że 8 bitów do jasności to i tak o wiele za dużo.
  • #16 9971236
    as_1011
    Poziom 10  
    Do zwykłej diody wystarcza 8 bitów. Do żarówki diodowej 8 bitów to za mało gdyż powoduje widoczne migotanie.

    Niestety nie posiadam oscyloskopu aby dokładnie to sprawdzić.

    Ale czy ktoś wie (lub może sprawdził to w praktyce) jaka powinna być konfiguracja ATMEGA64 aby sterować płynnie PWM od najmniejszego wypełnienia .
    U mnie działa tak że na jednym wyjściu PWM wogóle nie funkcjonuje ale można ustawić "0" lub "1", a na innych przy zmiennej wypełnienie=1 żarówka świeci już dość mocno. Przy wypełnieniu ~0,1% nie powinna świecić, na innych prockach rozjaśniała się dopiero (rozdz. 10 bit) przy wypełnieniu ~40.
  • #17 9971298
    mirekk36
    Poziom 42  
    as_1011 napisał:
    Do zwykłej diody wystarcza 8 bitów. Do żarówki diodowej 8 bitów to za mało gdyż powoduje widoczne migotanie.


    8 bitów zwykle nigdy nie wystarcza i to nie ze względu na jakieś tam migotanie, bo migotanie to może być co najwyżej efektem źle dobranej częstotliwości. Przy 8-bitowej rozdzielczości masz właśnie efekt o jakim pisałeś niżej, że niektóre diody (w zasadzie większość) ciężko ściemnić do wartości np 1% - następuje tu bowiem skokowe albo załączenie albo wyłączenie.

    Pomaga dopiero rozdzielczość minimum 9- albo 10-bit

    Przy 10 bitach już w ogóle nie ma takiego przykrego efektu.

    Dodano po 37 [sekundy]:

    Poza tym o jakich żarówkach ty piszesz ? tak z ciekawości zapytam - zasilanych jakim napięciem ?
  • #18 9971988
    as_1011
    Poziom 10  
    12V stałe, doskonale sie sprawdzaja z innymi AVR-ami , np AM16
  • #19 9972003
    mirekk36
    Poziom 42  
    No tak, przy 12V powinno być wszystko OK. Ale jak mówię dziwi mnie to, że piszesz o jakimś migotaniu przy rozdzielczości 8-bitowej. A nie dziwi mnie fakt, że nie można stopniowo ściemniać do zera w zakresie ok 1% tylko następuje skokowe włączenie/wyłączenie diod. WG mnie to normalne wtedy. Dopiero przy 10bitach będzie OK.
  • #20 9972153
    nsvinc
    Poziom 35  
    Przy 8 bitach nic nie mruga. Jakiego typu cudownym rozróżnieniem jest podział na "diodę" i na "lampę" LED?
    Może ja jakieś boskie LEDy mam, ale moje potrafią się przy 8 bitach płynnie rozjaśniać; niezależnie od tego czy dioda jest sygnalizacyjna, czy mocy. Przecież to jest kwestia głównie częstotliwości, a nie rozdzielczości wypełnienia...
    Po drugie, przy odpowiednich częstotliwościach można bez problemu stosować oversampling, gdzieś na elce juz o tym pisałem.

    Poza tym, skoro autor buduje oświetlenie - to najpewniej stosuje LEDy mocy. Więc czemu tutaj gada się o rozdzielczościach PWM, a nie o sposobach zasilania LEDów mocy? Chamski PWM doprowadzi co najwyżej do przedwczesnych śmierci LEDów.
    Odpowiednio duża częstotliwość PWMa pozwalająca na nadpróbkowanie i eliminująca "efekt migotania przy 1%", będzie katować tranzystory przy LEDach. Dodatkowo, grzejącej się strukturze LEDa będzie zmieniał się Vf, co prowadzi do znacznego pływania i jasności, i prądu (bo PWM będzie de facto "stabilizował" napięcie).
    Można zacząć pracę od zasugerowania się chociażby datasheetem do scalaczka PR4101, aby następnie móc szarpnąć się na przetwornicę sterowaną z mikrokontrolera, jak np. tu
    Atmega64 i PWM 6-kanałowy sterownik oświetlenia
    Przetwornica automatycznie wyeliminuje problemy z migotaniem, pozwoli rozjaśniać praktycznie od 0% i będzie stabilizować prąd. Ta z obrazka chodzi na 440kHz (trochę katuje tranzystory, ale częstotliwość pozwoliła na mały ΔI dławików przy niskiej ich indukcyjności - tryb pracy CCM, dzięki temu układ powstał ultra-miniaturowy). Równie dobrze sprawdza się przy rozdzielczości PWM 8 bit, jak i 12bit... Feedback jest zrealizowany w postaci pomiaru prądu szczytowego i prędkości jego narastania; dzięki temu odpowiedni algorytm jest w stanie tak obliczać dla każdego cyklu Ipk, aby Iavg był stały niezależnie od Vin ;] (czego np. nie ma wspomniany PR4101, gdzie aby w miarę eliminować pływanie Iavg względem Vin, trzeba używać bardzo głębokiego CCM, stosując monstrualnej wielkości dławiki...)
  • #21 9972172
    dondu
    Moderator na urlopie...
    Jeszcze można (lub czasami należy) uwzględnić strumień światła zależny od prądu diody, który często jest nieliniowy. Innymi słowy, 60% PWM może nie nie oznacza 60% strumienia światła:

    Atmega64 i PWM 6-kanałowy sterownik oświetlenia

    Zależnie od diody czasami trzeba nanieść poprawkę, by uzyskać pełną płynność.
  • #22 9972190
    nsvinc
    Poziom 35  
    Ja bym nawet rzekł że zawsze należy. Ale dysponując mikrokontrolerem, korekcja jest prosta.
    Dodatkowo color matching/brightness matching jest o tyle skomplikowany, że taki wykres nieco zależy od bin'a ("zestawu") do którego dany egzemplarz się zalicza. Jak się nie wie, do jakich binów należą dane ledy, to brightness matching łatwo przeprowadzić luksometrem. Z color matching jest już znacznie ciężej...
REKLAMA