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

Jak poprawić działanie automatycznego podświetlania LCD w Bascom?

pier 26 Maj 2008 17:16 1987 8
REKLAMA
  • #1 5183201
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    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:
    '----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
  • REKLAMA
  • #2 5183368
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 5185114
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    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:
    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.
  • #4 5202321
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    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).
  • REKLAMA
  • #5 5202325
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    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.
  • #6 5202507
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    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.
  • #7 5202818
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    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.
  • REKLAMA
  • #8 5206537
    nouki
    Poziom 25  
    Posty: 1222
    Pomógł: 28
    Ocena: 97
    a może plynnie ??

    
    .
    .
    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.:)
  • #9 5207390
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    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.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z automatycznym podświetlaniem wyświetlacza LCD 4x20 sterowanego mikrokontrolerem Atmega32 w Bascomie. Autor stosuje procedurę sterującą jasnością podświetlenia na podstawie wartości z ADC, jednak podświetlanie nie zawsze reaguje na zmiany oświetlenia i czasami miga, szczególnie przy wartościach granicznych. Proponowane rozwiązania obejmują poprawę warunków w kodzie (np. uwzględnienie wartości granicznych w instrukcjach warunkowych), optymalizację kodu przez zastosowanie instrukcji elseif zamiast wielu if, wprowadzenie histerezy lub uśrednianie pomiarów ADC z wielu próbek (np. 60 próbek co sekundę) w celu stabilizacji sygnału. Sugerowano także płynne zwiększanie lub zmniejszanie wartości PWM zamiast skokowych zmian, co eliminuje efekt migotania. Wskazano na możliwość zakłóceń w przetworniku ADC i zalecenie sprawdzenia schematu układu oraz konfiguracji timerów i PWM, aby wykluczyć błędy sprzętowe lub programowe wpływające na sterowanie podświetleniem.
Wygenerowane przez model językowy.
REKLAMA