Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Automatyczne podświetlanie LCD [bascom]

pier 26 Maj 2008 17:16 1615 8
  • #1 26 Maj 2008 17:16
    pier
    Poziom 23  

    Witam.
    Robię pewne urządzenie z wyświetlaczem lcd 4*20 którym steruje atmega32.
    Wymyśliłem że urządzonko będzie miało automatyczne podświetlanie zależne od oświetlenia (jak ciemno to i wyświetlacz słabo podświetlany).
    Oto fragment kodu odpowiedzialny za takie sterowanie:

    Code:
    '----PROCEDURA OBSLUGI PODSWIETLANIA----.'
    
    Sub Dimmer
    Jasnosc = Getadc(2)
    If Jasnosc > 0 And Jasnosc < 50 Then
    Pwm1a = 5
    End If
    If Jasnosc > 50 And Jasnosc < 300 Then
    Pwm1a = 20
    End If
    If Jasnosc > 300 And Jasnosc < 700 Then
    Pwm1a = 50
    End If
    If Jasnosc > 700 Then
    Pwm1a = 155
    End If
    End Sub

    Niby ta procedura działa ale tylko niby.
    Po pierwsze nie zawsze reaguje na zmianę oświetlenia (czasami wcale), a po drugie czasami podświetlanie wariuje (pewnie jak wartość oświetlenia jest na granicy z drugą wartością)
    Jak wyeliminować powyższe?
    Pozdrawiam.

    Przeniosłem z Programowanie Ogólne - krzychoocpp

    0 8
  • #2 26 Maj 2008 18:07
    190175
    Użytkownik usunął konto  
  • #3 27 Maj 2008 00:06
    K_o_n_r_a_d
    Poziom 23  

    Po co tyle warunków?
    Czy GetADC() może zwrócić wartość <0? Nigdy, więc: warunek Jasność>0 jest niepotrzebny i tak samo kilka następnych. Inna sprawa, po co sprawdzać wszystkie warunki jeśli tylko jeden może być prawdziwy (no chyba, że zależy nam na zawsze możliwie równym czasie działania funkcji ale to nie w przypadku Bascoma chyba.
    Jeszcze dodatkowo aby zaoszczędzić trochę pamięci flash i przyśpieszyć działanie programu proponuję użycie zamiast procedury podprogramu.
    To samo, ale zoptymalizowane:

    Code:
    Kod:
    
    '----PROCEDURA OBSLUGI PODSWIETLANIA----.'
    Dimmer:
    Jasnosc = Getadc(2)
    If Jasnosc <= 50 Then
       Pwm1a = 5
    elseif Jasnosc <= 300 Then
       Pwm1a = 20
    elseIf Jasnosc <= 700 Then
       Pwm1a = 50
    else
       Pwm1a = 155
    End If
    Return


    Aby nie wariowało na granicy zmian proponuję albo dać histerezę przy zmianie, albo zastosować inny sposób sterowania podświetleniem. Ja kiedyś eksperymentując zrobiłem w ten sposób: przyjąłem, że przy maksymalnym oświetleniu ma być PWM ustawiony na 100% a przy minimalnym oświetleniu na 50%. Zmiana oświetlenia była płynna. Wartość z przetwornika (9 bitowa!) odejmowana od 1023, wynik wpisywany do PWM. Wyglądało to całkiem dobrze, nie było widocznych przeskoków pomiędzy jasnościami podświetlenia.

    0
  • #4 01 Cze 2008 00:53
    pier
    Poziom 23  

    No niestety koledzy, zastosowałem się do Waszych wskazówek ale układ nadal nie działa tak jak powinien. Nadal występuje szybka zmiana wartości podświetlania(miganie).

    0
  • #5 01 Cze 2008 00:55
    Balu
    Poziom 38  

    A zmienia się szybko, jak ukłąd jest w stanie spoczynku? Czy jak machasz ręką nad czujnikiem?
    Jak to drugie zbieraj próbki np. z 60sekund i uśredniaj.

    Pozdro.

    0
  • #6 01 Cze 2008 08:18
    pier
    Poziom 23  

    Jak macham ręką to układ normalnie reaguje. Ale podczas normalnej pracy czasem miga jak szalony. Nie mam już do tego siły, ze dwa tygodnie już z tym walcze.

    0
  • #7 01 Cze 2008 11:23
    Balu
    Poziom 38  

    Może jakieś śmieci Ci sieją po przetworniku...
    Schematy każdy z Nas widział Twojego urządzenia więc od razu wykluczył błędy hardwareu;-)

    Anyway spróbuj pobierać 60 próbek (minuta co 1 sekunde) uśredniać i na podstawie tego sterować LCD.


    Pozdro.

    0
  • #8 02 Cze 2008 17:15
    nouki
    Poziom 25  

    a może plynnie ??

    Code:

    .
    .
    Config Timer1 = Pwm , Pwm = 10 , Prescale = 8 , Compare A Pwm = Clear Down   
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    .
    .
    .


    Wartosca = Getadc(2)

       If Wartosca > Pwm1a Then
             Waitms 1
             Incr Pwm1a
       Elseif Wartosca < Pwm1a Then
             Waitms 1
             Decr Pwm1a
       End If
     


    Coś w tym stylu działa mi bezproblemowo.
    Wartość 0v -0, 5v jest pełne podświetlanie

    p.s występuje szybka zmiana bo z 300 dajesz 500 a nie krokowo od 300 do 500 zastosuj dcr, incr.:)

    0
  • #9 02 Cze 2008 21:12
    K_o_n_r_a_d
    Poziom 23  

    Poprzez uśrednianie albo poprzez powolną zmianę wyeliminujemy efekt migania ale lepiej wyeliminować przyczynę złego działania niż skutki.
    Pokaż schemat dokładny ze wszystkimi elementami jakie tam masz. A czy reszta kodu programu w żaden sposób nie wpływa na PWM sprzętowy lub Timer1 albo na końcówkę z której odczytujesz napięcie? Pokaż jak masz skonfigurowany przetwornik a najlepiej cały kod.
    Zlikwiduj w kodzie wszystko co nie dotyczy podświetlania i sprawdź czy wtedy też będzie źle działało.

    0