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

[C][AVR] Dimmer PWM diody LED.

Electix 26 Lis 2010 16:13 2832 1
REKLAMA
  • #1 8792001
    Electix
    Poziom 21  
    Witam serdecznie.
    Do wyprowadzenia OC0A µkontrolera ATTINY2313 mam podłączoną białą diodę LED. Próbuję uzyskać efekt płynnej zmiany intensywności świecenia diody takimi oto funkcjami.
    
    void lightf(void) //funkcja płynnego ściemniania
    	{
    		unsigned char i;
    		for(i=0xFF; i>0x00; i--)
    		{
    			OCR0A=i;
    			_delay_ms(12);
    		}
    		OCR0A=0x00;
    		lon=0;
    	}
    
    void lightn(void) //funkcja plynnego rozjaśniania
    	{
    		unsigned char i;
    		for(i=0x00; i<0xFF; i++)
    		{
    			OCR0A=i;
    			_delay_ms(12);
    		}
    		OCR0A=0xFF;
    		lon=1;
    	} 

    I wszystko działa, ale. Kiedy dioda się załącza to efekt ten dzieje się na tyle szybko, że wydaje się jakby zapalała się właściwie od razu, natomiast przy wyłączaniu, widać jak fajnie płynnie się ściemnia aż do całkowitego wyłączenia.
    Obie funkcje rozjaśniania i ściemniania są symetryczne i polegają na liniowym rozjaśnieniu i ściemnieniu świecenia diody, ale rozjaśnianie jest inaczej widziane w tym przypadku przez oko. I moje pytanie. Jak zrobić żeby ten efekt był tak samo widziany w obie strony? Domyślam się że zmiana intensywności świecenia przy starcie diody od 0 do 255 na początku jest bardziej zauważalna niż pod koniec zliczania pętli rozjaśniającej i stąd ten efekt.
  • REKLAMA
  • #2 8792447
    szelus
    Poziom 34  
    To może zrób jakoś bardziej wykładniczo, np.
    
    void lightn(void) //funkcja plynnego rozjaśniania
       {
          unsigned char i;
          for(i = 4; i < 192; i += (i / 4))
          {
             OCR0A=i;
             _delay_ms(12);
          }
          OCR0A=0xFF;
          lon=1;
       } 
    
REKLAMA