Примеры с сайта AVR+ Electronics - Управляем RGB светодиодом.

Автор: Internet. Опубліковано в Початківцям з CV AVR

Зміст статті

Управляем RGB светодиодом.

Так как скоро Новый Год, расскажу как управлять RGB светодиодом. RGB светодиод, это по сути 3 светодиода (Red - Green - Blue) собранные под общей линзой. В теории для изменения цвета, надо зажигать светодиоды с определённой яркостью для каждого из 3-х (красного, зелёного, синего), и будем получать различные цвета. Для плавного изменения цвета свечения светодиода, будем использовать 3-х канальный ШИМ. И так долго рассказывать не буду, в исходниках всё и так понятно. Для начала собираем вот такую схему:


В этом проекте я использовал программный ШИМ аля "дёрганья ножками”. Многие скажут что софтовый ШИМ занимает много ресурсов у МК, но так как задача у нас простая плавно регулировать 3 светодиода, то для этого ресурсов МК вполне хватит. МК тактируется от внутреннего RC генератора на частоте 9.6мгц. Исходник написан на Си, под компилятор Code Vision AVR.

Исходник: soft_pwm_rgb

Code
/*****************************************************
Автор: Krik99
Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
*****************************************************/
#include      
#include <delay.h>
void main(void)
{
unsigned int k, i;  
unsigned char a;
// Port B initialization
PORTB=0xFF;
DDRB=0x07;
while (1)
      {     
       k=3000;
      for(i=1; i<=k; i=i+1)
          {   
             if(a==0){
             PORTB.0=0;  
             PORTB.1=1;
             }
             if(a==1){
             PORTB.1=0;
             PORTB.2=1;
             }       
             if(a==2){  
             PORTB.2=0;
             PORTB.0=1;
             }
             delay_us(5);
          }
      for(i=k; i<=3000; i=i+1)
          {
             if(a==0){
             PORTB.0=1;  
             PORTB.1=0;
             }
             if(a==1){
             PORTB.1=1;
             PORTB.2=0;
             }       
             if(a==2){  
             PORTB.2=1;
             PORTB.0=0;
             }
             delay_us(5); 
          }    
          k=k-10; 
       a++;
       if(a>2)a=0;
      };
}