Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 28 lip 2025, o 14:22


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
    Autor Wiadomość
    PostNapisane: 7 kwi 2017, o 12:09 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam, mam pytanie do kolegów. Co może być przyczyną pulsowania cyfr w wyświetlaczu 7 segmentowym, które sterowane są Timer0 czyli multipleksowaniem.
    Multipleksowanie działa bez problemu ale gdy wstawiłem regulacje jasności wyświetlanie za pomocą PWM Timer2 z portu D do wejścia bazy tranzystora PNP widocznego na schemacie poglądowym regulacja nie działa prawidłowo. W maksymalnej jasności delikatnie widać pulsowanie ANODA1-ANODA4 natomiast, gdy ściemniam pwm im mniej światła tym pulsowanie jest coraz bardziej widoczne. W konsekwencji, gdy maksymalnie przyciemniam diody świecą mniejszą mocą, ale CYFRY pulsują od 1 do 4 i to bardzo widocznie. Czyli tak w trakcie sekundy zapałają sie wyświetlacze od 1 do 4
    To wychodzi tak, że gdy przyciemniam pwm to przy okazji wpływam na multipleksowanie.
    Podłączając stałe napięcie do tranzystorów ANOD wyświetlacza multipleksowanie działa super. Nic nie pulsuje i jest stałe wyświetlanie cyfr. A jak do PWM podłęcze zwykła diodę ona sie ściemnia i nie widać na niej pulsowania. Czyli jakby osobno jest OK

    Dodam, że jest to układ zegara i działa od roku bez problemu jednak dodanie ściemniania było konieczne i wykorzystałem tranzystor jak na schemacie, ponieważ wykonałem juz płytkę i dodanie tranzystora było możliwością, jaka mi przyszła do głowy.
    Procesor to atmega128 zegar kwarc 16Mhz
    Wolny tylko jeden PIN z Portu D więc PWM jest programowy z książki BB tylko na jeden PIN.
    Timer0 - multipleksowanie
    Timer2 - PWM
    Timer1 - sterowanie odbiorem IR

    Co może być przyczyną?
    Dziękuję za udzieloną pomoc. Pozdrawiam

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 12:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 lis 2012
    Posty: 298
    Pomógł: 13

    Musisz mieć synchronizację między PWM a multipleksowaniem. Czyli jeśli częstotliwość PWM to 100Hz, to multipleksować musisz o wielokrotność, np. 400Hz - czyli PWM i multipleksacja musi być synchroniczna, w rytm wspólnego zegara.
    Może powiedz jakie masz częstotliwości PWM i multipleksacji.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 12:35 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam, ustawienia Timerów mam tak:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 13:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 gru 2011
    Posty: 449
    Pomógł: 4

    Musisz jeszcze podać, z jaką częstotliwością napędzany jest mikrokontroler, bo bez tego nie da się obliczyć podziału i ostatecznej końcowej częstotliwości przerwań.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 13:34 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam, dziękuję za odpowiedź.
    Mam 16Mhz jest jeszcze przerwanie INT3 z układu zegara. To raczej nie koliduję.
    Zmieniłem tak na szybko OCR0 w TIMER0 i pulsowanie jest znikome czyli można to dopracować po wyliczeniu jak pisał kolega ZOOM.
    Jednak im szybciej ustawiam multipleksowanie to pojawił się nowy problem z segmentami wyświetlacza. Te segmenty które nie powinny świecić, świecą się delikatnie tak z 30% jasności. Czyli jak mam pełną jasność CYFR to delikatnie świeca się segmenty które powinny być zgaszone.
    Czyli taki efekt duchów z innych cyfr. Zmniejszając multipleksowanie w OCR0 TIMER0 tego efektu nie ma.
    Jak to wyeliminować?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 15:19 
    Offline
    Użytkownik

    Dołączył(a): 10 sty 2017
    Posty: 50
    Pomógł: 5

    Rozdziel gaszenie i zapalanie kolejnego wyświetlacza. W procedurze multipleksowania zamiast gasić jeden wyświetlacz i od razu zapalać kolejny, zrób tylko gaszenie. Zapalanie zrób w kolejnych wywołaniach przerwania. Prawdopodobnie trzeba będzie zwiększyć częstotliwość wywołania przerwania ale w ten sposób możesz wysterować wypełnienie bez zaprzęgania kolejnego timera. Jest to nieco proteza ale da się uzyskać kilka stopni jasności. Można też zapalanie i gaszenie wyświetlaczy przenieść do pętli głównej a w przerwaniu stawiać tylko odpowiednie flagi ale jak wiadomo pętla główna może mieć różne czasy poszczególnych obiegów a co za tym idzie może świecić nierówno. Obsługa w przerwaniu chyba będzie lepsza.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 15:25 
    Offline
    Użytkownik

    Dołączył(a): 08 mar 2014
    Posty: 398
    Lokalizacja: Głogów
    Pomógł: 11

    Ja w swoim zegarku zwiększyłem częstotliwość multipleksowania dwukrotnie beż żadnej synchronizacji i nie da się zauważyć pulsowania



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 20:17 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam,
    na początku miałem tak:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
      Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Nic się nie zmienia dalej mam duchy. Chyba że nie zrozumiałem co kolega riddik miał na myśli.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 21:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 sty 2013
    Posty: 1760
    Pomógł: 196

    Witam
    Duszki powstają wtedy, gdy na forum króluje kod widmo - może kolega pokaże przynajmniej obsługę przerwań bo teraz to raczej do egzorcysty... ;)

    Pozdr.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 kwi 2017, o 23:07 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam, proszę bardzo.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Ostatnio edytowano 7 kwi 2017, o 23:32 przez ATuser, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 kwi 2017, o 15:20 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 sty 2013
    Posty: 1760
    Pomógł: 196

    Witam
    Masz troszkę nietypowe sterowanie wyświetlaczem - po pierwsze dlaczego osiem liczb dla czterech wyświetlaczy?
    riddik napisał(a):
    Rozdziel gaszenie i zapalanie kolejnego wyświetlacza.

    Koledze chodziło o to, że sterowanie powinno wyglądać tak:
    1.ANODY zgaszone
    2.ustaw liczbę na dany wyświetlacz
    3."zapal" anodę danego wyśw.
    1. ...
    To wygaszenie pozwala na uniknięcie duszków.

    Pozdr.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 kwi 2017, o 22:00 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam, dziękuję za odpowiedź. Niestety to nie pomogło.
    Zrobiłem jak kolega opisał dodałem kroki do licznika przerwania i jest delikatna poprawa. Ale to samo uzyskałem 2 krokach na wyświetlacz
    1. Zgaś anodę i zgaś cyfrę
    2. Zapal cyfrę i anodę.
    Więc czy trzy kroki czy dwa jest podobnie. W akcie desperacji rozbudowałem sekcje licznika przerwania do nawet 16 kroków gdzie 4 kroki były od 1 wyświetlacza cyfry.
    Próbowałem tez z tranzystorami na wyjściu (npn) BC817 , Darlington oraz BC547 na wszystkich jest to samo. Mało tego mam 5 identycznych płytek i na wszystkich jest to samo a wszędzie są różne diody wyświetlacza.
    Segmenty, które nie powinny się świecić, świeca teraz z mocą tak 7-9% ale to widać jeszcze.
    Myślałem, że może jakieś rezystory do bazy tranzystorów, aby trochę wytłumić te przebicia cyfr. W sumie to może nic nie dać.
    Jak zmienię w multipleksowaniu OCR0=40 to świecenie jest już dużo mniejsze tak może z 1-2% i to już tak nie widać i trzeba się przyjrzeć uważnie i jest to do zaakceptowania.
    Może jeszcze jakieś inne rozwiązanie?
    Pozdrawiam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 kwi 2017, o 06:42 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 sty 2013
    Posty: 1760
    Pomógł: 196

    kicajek napisał(a):
    Masz troszkę nietypowe sterowanie wyświetlaczem - po pierwsze dlaczego osiem liczb dla czterech wyświetlaczy?

    ew. rozbudowa?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 kwi 2017, o 11:11 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam,
    Tak jest osiem liczb dla kolejnych 4 wyświetlaczy które nie są podłączone. Tak żeby np. wyświetlać osobno temperaturę czy inne dane.
    Pozdrawiam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 kwi 2017, o 12:14 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 sty 2013
    Posty: 1760
    Pomógł: 196

    Witam
    To w takim razie "nie każ" tym 5 do 8 dublować 1-4; wykasuj tamte wyświetlania.

    Pozdr.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 kwi 2017, o 16:32 
    Offline
    Nowy

    Dołączył(a): 13 lut 2014
    Posty: 19
    Pomógł: 0

    Witam, na 4 krokach pogorszyło się. Jest gorzej niestety. Nie mam oscyloskopu żeby zobaczyć co się dzieje w danych miejscach że im szybciej multipleksuje tym pojawiają się duszki.
    Zastanawiam się czy jakieś Drivery ULN 2803 czy UDN mogły by to wyeliminować. Albo wysłanie przez SPI i to właśnie też przetestuję bo nie poddam się dopóki dopóty nie rozwiąże tego problemu choćby z czystej ciekawości. Więc drodzy Panowie będę tutaj próbował swoich sił możliwości.
    Jeżeli ktoś będzie miał jakiś pomysł to chętnie wysłucham i przetestuję.

    Na dniach postaram się wrzucić cały schemat układu jak i więcej kodu może ktoś gdzieś coś zauważy.
    Dziękuję za pomoc.
    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 kwi 2017, o 16:53 
    Offline
    Użytkownik

    Dołączył(a): 08 mar 2014
    Posty: 398
    Lokalizacja: Głogów
    Pomógł: 11

    zwolnij częstotliwość multipleksowania tak aby przerwanie odbywało się np. co 500 ms, możesz też powstawiać dodatkowe opóźnienia, wtedy gołym okiem zobaczysz co może być nie tak, że np. kolejne się zapalają zanim poprzednie się wygaszą.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 kwi 2017, o 17:35 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    ATuser napisał(a):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    O ile się nie mylę to dla ATmega128 (takiego mikrokontrolera zdaje się używasz) to raczej będzie preskaler 128. Przy OCR0=5 przerwanie masz co 640 taktów, czyli częstotliwość ponad 20kHz. Moim zdaniem 1kHz powinien w zupełności wystarczyć.

    EDIT: Z pośpiechu pomyliłem się w obliczeniach. 128 należy pomnożyć przez 6, a nie przez 5, więc przerwanie będzie oczywiście co 768 taktów :)

    ATuser napisał(a):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Przełączasz anodę bezpośrednio w momencie, kiedy na PORTB masz jeszcze poprzednią cyfrę, a odstęp pomiędzy instrukcjami to 62,5ns. Tranzystor sterujący anodami ma swoją pojemność i raczej nie zdąży wejść w tym czasie w stan wysokiej impedancji.
    Zrób porządnie to, o czym pisał kolega kicajek, czyli coś w stylu:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Zmniejsz też częstotliwość multipleksowania do ok. 1kHz i powinno być OK.

    ATuser napisał(a):
    Jak zmienię w multipleksowaniu OCR0=40 to świecenie jest już dużo mniejsze tak może z 1-2% i to już tak nie widać i trzeba się przyjrzeć uważnie i jest to do zaakceptowania.

    To naturalne. Przy mniejszej częstotliwości multipleksowania stosunek czasu "prześwitywania" do czasu poprawnego świecenia będzie coraz mniejszy, czyli efekt będzie mniej widoczny.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 gru 2017, o 18:28 
    Offline
    Nowy

    Dołączył(a): 29 lis 2015
    Posty: 15
    Lokalizacja: Lublin
    Pomógł: 0

    Co prawda dyskusja w temacie już się dość dawno skończyła, ale mimo to postanowiłem zabrać głos. Może mój pomysł komuś się przyda.
    Otóż robię zegar, w którym potrzebny jest duży wyświetlacz. Ponieważ każdy segment tego wyświetlacza zawiera 3 szeregowo połączone diody, do zasilania niezbędne jest napięcie większe od 5 V. Z tego powodu segmenty sterowane są przez układ ULN2803, a anody przez parę tranzystorów npn i pnp. Stąd biorą się z pozoru "dziwne" sygnały włączające anody i segmenty. W obu przypadkach są to stany wysokie H. Przy próbach, podobnie jak u Kolegi, wystąpił problem migania cyfr przy regulacji jasności. Oczywiste jest, że niezbędna jest synchronizacja PWM i przełączania cyfr. Zrobiłem tak, ale to niewiele dało, gdy PWM był tylko czterokrotnie szybszy od przełączania. W związku z tym wpadłem na pomysł, który widać w załączonym kodzie.
    Każda cyfra załączona jest przez 4 kolejne cykle przerwania i w zależności od wartości zmiennej bright jest odpowiednio wcześniej wyłączana. W ten sposób uzyskałem 4 poziomy jasności wyświetlacza. Próbowałem zrobić w ten sam sposób 8 poziomów jasności, lecz wymagałoby to jeszcze dwukrotnego zwiększenia częstotliwości występowania przerwania. Działo mi to dobrze, ale nieco obawiałem się, że nie pozostawię już prockowi czasu na wykonanie innych zadań i pozostałem przy 4 poziomach.


    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Obecnie zmieniłem jeszcze sposób sterowania wyświetlacza. Zastosowałem dekoder BCD na 7 segment CD4511 i w związku z tym oszczędziłem 3 piny procka. Do wyświetlacza muszę przesłać teraz tylko 4 bity cyfry, a nie wszystkie 7 segmentów i, oczywiście, sterowanie anodami.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 13 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO