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

attiny2313 PWM na 8 kanałach w jez. C

07 Kwi 2015 15:09 1023 9
  • Poziom 8  
    Witam,

    Chciałbym napisać program do sterownika 8 kanałowego, w którym na raz 4 diody płynnie się zapalały, i w tym samym czasie 4 kolejne płynnie gasiły. Projekt jest wykonany na mikrokontrolerze attiny2313, częstotliwość kwarc-a 1MHz.
    Poniżej przedstawiam moduł wykonawczy sterownika.
    attiny2313 PWM na 8 kanałach w jez. C

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Szukałem informacji w necie jednakże nie wiem zbytnio jak się za to zabrać. W powyższym programie mogę zmieniać czestotliwośc swiecenia diody, tylko nie wiem jak zmieniać szerokosc impulsu. Jak mialby ktos chwile nakierować jak to mógłbym zaprogramować, bądź jakiś szablon program, na jakim trybie timera pracowac będę wdzięczny.
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Skoro ma być płynnie, to musisz jeszcze uwzględnić strumień światła, ponieważ charakterystyka diody jest nieliniowa. Kilka rozwiązań tego problemu znajdziesz tutaj:
    http://mikrokontrolery.blogspot.com/2011/03/epp-rozgrzewka.html

    A oto różnica:


    Link


    Dla 4 z 8 kanałów musisz zrobić PWM programowo, ale zasada korekcji jasności świecenia jest taka sama.
  • Poziom 8  
    Właśnie muszę zrobić programowo PWM, gdzyż 8 kanałów mam podpiętych do całego portu B, więc sprzętowy PWM w tym przypadku odpada.
  • Moderator Mikrokontrolery Projektowanie
    No to timer + przerwania (a w nich odliczanie momentu zmiany stanu pinów) + korekcja jasności według zasady ogólnej z linku.

    Rozpocząłeś w miarę poprawnie, tylko częstotliwość zbyt mała na PWM. Narysuj może teraz algorytm na kartce i go pokaż lub od razu na jego podstawie pisz program.
  • Specjalista - Mikrokontrolery
    Poszukaj u Atmela starej, ale wciąż aktualnej noty aplikacyjnej nt. programowego PWM. O delay() możesz zapomnieć. Częstotliwość PWM to min. 200 Hz (lepiej 400). Spróbuj zrobić np. 50 stopni jasności, to może się to biedactwo wyrobi. Na korekcję gammy przy programowym PWM raczej bym nie liczył - za mała moc obliczeniowa dla większej liczby stopi jasności.
  • Poziom 8  
    Udało mi się znaleźć fajny kod z opisem programowego pwm-a od RedLina. Przerobiłem go trochę na moje 7 kanałów. Domyślnie był na 3.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jednakże dziwnie się zachowuje. Problem przedstawiłem na powyższym filmiku.


    Wygląda na to jakby mikrokontroler się nie wyrabiał, ale nie jestem pewien. Jak można byłoby to zoptyamlizować ?
    Odnośnie korekcji jasności świecenia, jak mógłbym ją tutaj doimpementować :)?
  • Poziom 17  
    Witam,
    ja odnoście "wyrabiania". Policz w wynikowym pliku ile zajmuje obsługa przerwania. Masz 800 cykli na wykonanie 7xfun_pwm plus to co jest w dalej i oczywiście samo wejście i wyjście z przerwania. Według mnie, w przerwaniu powinieneś zrobić jedynie pwma z korekcją jasności jeśli potrzebujesz (nie wiem, czy poziomów jasności wystarczy, żeby było płynnie) a obsługę efektów (rozjaśnianie, mruganie itp)w pętli głównej.
  • Specjalista - Mikrokontrolery
    Ten kod jest błędny i nie ma szans dobrze działać. Przeczytaj notę aplikacyjną Atmela nt. programowego PWM. Rada kol. mpier też jest błędna - całość musi być w przerwaniu timera, i w dodatku ta "całość" musi wyrabiać się czasowo, więc nie może być za duża. Przerzucając część funkcjonalności do "pętli głównej" możesz tylko popsuć działanie.