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

[MEGA16][C/GCC] Regulacja jasności led

Overclocker 26 Sie 2011 16:31 2547 12
REKLAMA
  • #1 9865789
    Overclocker
    Poziom 13  
    Witam, zacznę od tego, że nie wiedziałem jak nazwać mój problem, dlatego tytuł może być trochę mylący.
    W związku z tym, że nie mogę użyć PWM'a sprzętowego/programowego, ponieważ się nie wyrabia czasowo (15Mhz), a jeżeli uda mi się uzyskać przyzwoitą szybkość, to muszę zrezygnować z licznika T1, który jest mi niestety niezbędny,podobnie jak T0. Jako rozwiązanie problemu wykorzystałem regulację jasności "liniową" (brak mi innego słowa :) ).
    [MEGA16][C/GCC] Regulacja jasności led
    wszystko działa fajnie, jednak zastanawiam się, jak można zwiększyć rozdzielczość bez zwiększania ilości rezystorów (brak wolnych portów).
    Układzik jest sterowany dwójkowo (+5V/w.imp.), co daje mi 31 poziomów jasności.
    Tak to wygląda w programie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I teraz moje pytanie, jak może wyglądać sterowanie 3-ma stanami (+5V/w.imp./0V), bo wydaje mi się, że zwiększyło by to rozdzielczość, jeżeli jednak zawiłość kodu, oraz czas jego wykonywania wydłużył by się za bardzo, to sobie będę musiał darować, i pozostać przy 5-ciu bitach.
    Z góry dzięki.
    Pozdrawiam :)

    Jest jeszcze opcja z wew rezystorami podciągającymi, ale nie mam pojęcia, jak można ich użyć :)
  • REKLAMA
  • #2 9865897
    xamrex
    Poziom 28  
    Overclocker napisał:
    W związku z tym, że nie mogę użyć PWM'a sprzętowego/programowego, ponieważ się nie wyrabia czasowo (15Mhz),

    Tego to ja zrozumieć nie potrafię:D
    Jak to nie wyrabia się czasowo?
    Chcesz to zastosować do diod tak?
    I używając PWM widzisz miganie diody?, że mówisz ze nie wyrabia się czasowo?
    Używając PWM możesz mieć mieć 2^10 poziomów jasności ;)
  • REKLAMA
  • #3 9865922
    Overclocker
    Poziom 13  
    Tak, nie wyrabia czasowo :P nie powiedziałem o zastosowaniu, dlatego może to być trochę niezrozumiałe. Będzie to wyświetlacz widmowy (HDDclock prezentowany już na elektrodzie) u mnie została zastosowana m16 sąd problemy z ilością kanałów PWM. Talerz obraca się ok 2700 obr/min (45 obr/s), w momencie zastosowania PWM sprzętowego widać zamiast stabilnego obrazu takie cieniutkie kreski ciemniejsze i jaśniejsze, w przypadku zastosowania programowego PWM'a te kreski są dużo grubsze (w zależności od ustawionego OCR) dochodzą do 1cm, przez co nie spełnia swojej funkcji.
    Zastosowanie tego "układu" to wyeliminowało, i obraz jest stabilny, bez żadnych kresek :P jednak podczas powolnego rozjaśniania widać skoki, dlatego chciałem zwiększyć rozdzielczość

    p.s. 15MHz to częstotliwość kwarcu, a nie PWM
  • #4 9865945
    dondu
    Moderator na urlopie...
    A PWM programowy, ale oparty o któryś z używanych timerów, jak to ładnie opisał:

    janbernat napisał:
    Trzeba znaleźć takie źródełko wyzwalania w już wykorzystywanych timerach żeby nie zaprzęgać do roboty następnych.
  • REKLAMA
  • Pomocny post
    #5 9865990
    tmf
    VIP Zasłużony dla elektroda
    Coś poknociłeś. Zakładając, że to się kręci tak jak napisałeś, a kreska nie ma być większa niż 1mm to wychodzi mi, że PWM sprzętowy powinien spokojnie wystarczyć. Jeśli tak nie jest to coś robisz źle - albo preskaler, albo licznik, nie ten tryb, lub błędne sterowanie diodą - np. tranzystor za wolno się przełącza.
    Co do twojego rozwiązania - można dodać kolejne rezystory, bo wprowadzenie PWM na któryś z pinów nic nie da. Innym rozwiązaniem jest zastosowanie sprzętowego kontrolera LED.
  • #6 9866023
    Overclocker
    Poziom 13  
    Myślałem o tym, ale nie ma jak tego zrobić.
    T1 ma preskaler 8, zlicza on czas 1 obrotu, po przyjściu przerwania przelicza on wartość dla licznika T0.
    Tamten odlicza kolejne segmenty (240), też pracuje z preskalerem 8, mi potrzebne by było przerwanie jakieś 10-20x w czasie jednego "segmentu".
    Jak już pisałem, PWM generowany sprzętowo przez T2 bez preskalera i z wpisaną wartością 70 do OCR2 powodował wyświetlanie kresek, przy 65 procek się zawieszał, przerwań było za dużo.
    Aktualne rozwiązanie działa naprawdę fajnie, tylko chciałbym w jakiś sposób zwiększyć mu rozdzielczość bez dodawania kolejnych rezystorów, a nie za bardzo wiem, jak :/
  • REKLAMA
  • #7 9866051
    dondu
    Moderator na urlopie...
    Overclocker napisał:
    Myślałem o tym, ale nie ma jak tego zrobić.

    Prawie zawsze są jakieś możliwości zamiany funkcji timera z głównej na uboczną a główną ustanowienie innej. Tylko kombinować.

    Overclocker napisał:
    Aktualne rozwiązanie działa naprawdę fajnie, tylko chciałbym w jakiś sposób zwiększyć mu rozdzielczość bez dodawania kolejnych rezystorów, a nie za bardzo wiem, jak :/

    Ja także :)

    ADC używasz do czegoś?
  • #8 9866077
    Overclocker
    Poziom 13  
    dondu napisał:

    ADC używasz do czegoś?

    Nie, nie używam, ale używam PA prawie cały do tego mojego rozwiązania.

    Wprowadziłem was w mały błąd. Projekt przedwczoraj zacząłem odświeżać, bo przeleżał w szafce całe wakacje. Rzeczywiście sprzętowy PWM dawał sobie radę, jednak miałem mało kanałów(T1 zajęty) próba zamiany funkcji T1 się nie udała, (próbowałem użyć INT'a oraz zliczania przepełnienia licznika T0+to co zostało w momencie przyjścia przerwania). Nie mogłem sobie poradzić ze stabilnością obrazu, dlatego odrzuciłem tamtą opcję, a to co opisywałem było PWM'em programowym.
  • #11 9866162
    Overclocker
    Poziom 13  
    mam na myśli PORT A dokładnie od 0 do 5.
    sprawdziłem PWM sprzętowy, przy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i OCR2 = 100 widać takie naprawdę cieniutkie kreski, ale trzeba się przyjrzeć z bliska. Problemem, jednak zostaje stabilność obrazu, która nie była zadowalająca. wracam do sprawdzania, może jakiś głupi błąd zrobiłem :)

    Cytat:
    Rejestr przesówny 74HC595 x 2 i masz 16 bitow rozdzielczosci na 3 liniach. Predkość 'przesuwania' dla niego to 100 MHz. Policz czy to wystarczy.

    ha! proste, i dobre :) Tylko nie wiem, czy procek się wyrobi z wysyłaniem danych, no i trzeba dobierać rezystorki :)

    Tymczasem dzięki za pomoc, usiądę teraz nad tym co mam, i postaram się spłodzić jakieś sensowne rozwiązanie.
    Pozdrawiam.
  • Pomocny post
    #12 9866172
    dondu
    Moderator na urlopie...
    No to jeżeli nie wykorzystujesz ADC ani AC, to możesz ADC wykorzystać jako dodatkowy timer w trybie free running. Nie musisz go odczytywać, ale przerwanie będą generowane i do wykorzystania. Być może wtedy zwolnisz sobie jakiś timer?
  • #13 9869900
    Overclocker
    Poziom 13  
    Cytat:
    No to jeżeli nie wykorzystujesz ADC ani AC, to możesz ADC wykorzystać jako dodatkowy timer w trybie free running. Nie musisz go odczytywać, ale przerwanie będą generowane i do wykorzystania. Być może wtedy zwolnisz sobie jakiś timer?

    Świetny sposób, właśnie go użyłem, i dzięki temu mam sporo wolnych kHz do wykorzystania :)

    Ogólnie problem został rozwiązany, zastosowałem PWM'a sprzętowego z T2+T1, T0 jest wykorzystywany do obliczania reszty, radzi sobie całkiem nieźle, ale będę musiał popracować nad stabilnością obrazu, bo teraz trochę się "trzęsie" (może się boi ? :P ) W każdym razie dzięki wszystkim za pomoc, temat zamykam.
REKLAMA