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

[Attiny2313][C++] - Błąd działania układu PWM diod RGB

poloxyt 10 Paź 2010 21:45 3938 9
  • #1 8605376
    poloxyt
    Poziom 10  
    Witam wszystkich

    Jest to mój pierwszy post na forum wiec proszę o odrobinę wyrozumiałości :D

    Zaprojektowałem układ, który w założeniu miał sterować czterema diodami RGB poprzez PWM(rys. 1).

    Rysunek 1. [Attiny2313][C++] - Błąd działania układu PWM diod RGB


    W programie EAGLE stworzyłem sobie płytkę(rys. 2) i wykonałem ją metodą termotransferu.

    Rysunek 2.[Attiny2313][C++] - Błąd działania układu PWM diod RGB

    Układ zmontowałem. Attiny2313 zaprogramowałem na płytce testowej. Wszystko włączyłem i o dziwo zadziałało jak chciałem(do czasu). Ładne i płynne przejście w barwach itd.

    Problem pojawił się po dłuższym użytkowaniu tego układu(około 10-15min):

    1. Diody nie zachowują dokładnie określonego porządku:
    - czasami zapala się kolor biały zamiast ustawionego koloru
    - czerwony nie pali się wcale natomiast fioletowy tak jak powinien
    2. Przy włączeniu układy po jakimś czasie diody zaczynają migotać, po czym działają „względnie dobrze”(patrz powyższy punkt 1.) i znowu migają.

    Teraz układ zaraz po włączeniu głupieje.

    Nie załączam kodu, bo chwilowo nie mam do niego dostępu(jak mi się uda to jutro wrzucę), ale myślę ze to nie to, bo całość chwile działała poprawnie. Może popełniłem gdzieś błąd przy projekcie płytki? Jak ktoś ma jakieś pomysły/uwagi to bardzo proszę.

    Pozdrawiam

    =====================================================
    Edit 1

    Poniżej załączam kod, jakim zaprogramowałem Attiny2313:

    Oba liczniki ustawione w trybie Fast PWM(mode 3) jako Clear on compare match bez prescalera

    #define F_CPU 8000000L
    #include <avr/io.h>
    #include <util/delay.h>
    //#include <stdlib.h>
    #define wyp_R OCR0A
    #define wyp_G OCR1A
    #define wyp_B OCR1B
    #define czas 50
    
    
    int main(void)
    {
     DDRB  = 0xFF;
     
     TCCR0A= 0xA3;
     TCCR0B= 0x01;; 
     //TCNT0 = 0x00;
     
    TCCR1A= 0xA3;
    TCCR1B= 0x09;
    //TCNT1 = 0x00;
     _delay_ms(3000);
     
     
     while(1)
     {
      
        wyp_B=255; _delay_ms(1000); //niebieski
    
      for(int i=0;i<=255;i++) // fiolet
      { _delay_ms(czas); wyp_R=i;
      } _delay_ms(3000);
    
      for(int i=0;i<=255;i++) //czerwony
      { _delay_ms(czas); wyp_B=255-i;
      } _delay_ms(3000);
    
      for(int i=0;i<=255;i++) //zolty
      { _delay_ms(czas); wyp_G=i;
      } _delay_ms(3000);
    
      for(int i=0;i<=255;i++) //zielony
      { _delay_ms(czas); wyp_R=255-i;
      } _delay_ms(3000);
    
      for(int i=0;i<=255;i++) //blekitny
      { _delay_ms(czas); wyp_B=i;
      } _delay_ms(3000);
    
      for(int i=0;i<=255;i++) //niebieski
      { _delay_ms(czas); wyp_G=255-i;
      } _delay_ms(3000);
     
     }
    
    }


    Załączam też note katalogową tych diod RGB(taka uzyskałem od sprzedawcy).

    Rezystory obliczyłem wg niej:
    Dla R (5V-1.95V) / 0.02A = 152.5 Ohm (dałem 150R)
    Dla G i B (5V-3.3V) / 0.02A = 85 Ohm (dałem 120R bo taki miałem)

    Na rysunku był błąd ale już poprawiłem
  • #3 8607527
    poloxyt
    Poziom 10  
    Załączyłem kod i notę katalogową. Diody są raczej podłączone ok bo jak je podłącze na sztywno z zasilaczem to ładnie sobie świecą. Sekcja zasilająca również działa bez zarzutu. Sam program też chwilowo działał, myślę więc że od strony programowej jest ok.

    Myślałem raczej o jakimś błędzie w samym projekcie: brak zabezpieczeń, może złe tranzystory?
  • #4 8608313
    janbernat
    Poziom 38  
    Wszystko- za wyjątkiem ostatniego objawu- że zaraz po włączeniu głupieje wskazuje na "rozjeżdżanie" faz sterowania.
    Delay() ma dokładność 0.1ms powyżej kiluset ms- już nie pamiętam ilu.
    Po kilku- kilkunastu minutach się wszystko rozjedzie.
    Można by obliczyć po ilu- ale to chyba zadanie dla kopciuszka.
  • #5 8608549
    poloxyt
    Poziom 10  
    Więc sugerujesz ze problemem może być odmierzanie czasu?

    Może bez zbędnych komplikacji zmodyfikuje odmierzanie tak

    for(int i=0;i<100;i++)
    {
    _delay_ms(10);
    }


    dla jednej sekundy?
  • #6 8608752
    janbernat
    Poziom 38  
    Sprawdź- ja w _delay() nie bardzo wierzę.
    Druga sprawa- gdy OCR osiąga wartość max- czyli 0xFF w przypadku Timer0 i 0xFFFF w Timer1 do są specjalne przypadki- ale przyznam się bez bicia że jeszcze tego do końca z braku czasu nie rozgryzłem.
    Sprawdź dla i<=244 i podaj rezultaty.
  • #7 8609547
    Dr.Vee
    VIP Zasłużony dla elektroda
    poloxyt napisał:

    Oba liczniki ustawione w trybie Fast PWM(mode 3) jako Clear on compare match bez prescalera

    
     DDRB  = 0xFF;
     
     TCCR0A= 0xA3;
     TCCR0B= 0x01;; 
     //TCNT0 = 0x00;
     
    TCCR1A= 0xA3;
    TCCR1B= 0x09;
    //TCNT1 = 0x00;
    



    No jak dla mnie to Timer1 jest w trybie Fast PWM 10-bit...

    Dokładność _delay_ms() po poprawieniu powyższego błędu nie powinna tu mieć żadnego znaczenia.

    W fast PWM dla ustawienia 0 masz na wyjściu szpilkę szerokości 1 cyklu timera.
    Dla ustawienia TOP masz na wyjściu stały stan.

    Pozdrawiam,
    Dr.Vee
  • #8 8612165
    poloxyt
    Poziom 10  
    Chciałem sie zabrać za modyfikacje tego ale będzie to musiało troszkę poczekać gdyż dziś po podłączeniu układu do gniazdka zrobiło sie gdzieś jakieś zwarcie, poszło kupa iskier, trochę dymu po czym nastała ciemność :P jak zmontuje układ na nowo to dam znać co i jak z tym :P ale mimo to mam kilka spraw:

    Dr.Vee napisał:
    No jak dla mnie to Timer1 jest w trybie Fast PWM 10-bit...


    Słuszna uwaga. Zmienię przy okazji na TCCR1A= 0xA3; na TCCR1A= 0xA1; Ciekawostką jest fakt że układ działał dobrze w takiej konfiguracji :P dlaczego?

    Dr.Vee napisał:
    W fast PWM dla ustawienia 0 masz na wyjściu szpilkę szerokości 1 cyklu timera.


    Czy to może powodować fakt że diody cały czas lekko sie palą nawet jak ustawie OCR0A/1A/1B = 0; ?
  • #9 8613123
    Dr.Vee
    VIP Zasłużony dla elektroda
    Układ działał, bo PWMy były zsynchronizowane a stosunek częstotliwości to było 1:4. Ale oczywiście nie mogłeś uzyskać maksymalnego wypełnienia na timerze1.

    Ad: Pytanie o lekkie palenie się diod - tak. Zauważ też, że charakterystyka czułości oka ludzkiego na natężenie światła jest +/- logarytmiczna - stąd oko widzi skoki pomiędzy poszczególnymi krokami przy niskim wypełnieniu, a przy wysokim wypełnieniu różnica 1 bitu w wypełnieniu jest niewidoczna.

    Pozdrawiam,
    Dr.Vee
  • #10 8649387
    poloxyt
    Poziom 10  
    Wymieniałem po tym zwarciu w zasadzie większość komponentów. Pozmieniałem wg waszych sugestii efekt ale w zasadzie to nic nie dało bo układ nie działa w ogóle. Świeci sie jeden kolor(zazwyczaj zielony przechodzący w żółty). Co ciekawe jak wyjmę uC z podstawki to diody dalej sie tak samo świecą a wg mnie nie powinny bo nie dostają żadnego prądu na bramce tranzystora. Dla pewności wymieniłem te 3 tranzystory oraz sam uC i dalej jest tak samo. Skończyły mi się pomysły i wyniosłem to do piwnicy :(
REKLAMA