Мы не раз рассматривали разнообразные светодиоды, строение, использование и т.д. и т.п. Сегодня я хотел бы остановиться на одной из разновидностей светодиодов (если так можно говорить) - RGB светодиодах.
Что такое RGB светодиод и устройство
Соединение RGB диодов с ШИМ Altmega8
Аноды RGB светодиода подключаем к линиям 1,2,3 порта В, катоды соединяем с минусом. Чтобы получить разнообразные палитры цвета на аноды будем подавать ШИМ сигнал в определенной последовательности. В этом примере мы специально используем программный ШИМ, хотя на Atmega8 можно без проблем получить аппаратный ШИМ на 3 канала. Программный ШИМ можно использовать в случаях нехватки таймеров/счетчиков и по другим причинам. Для генерации ШИМ определенной частоты используем прерывание по переполнению 8-ми битного таймера Т0(TIMER0_OVF_vect). Так как предделитель не используем частота переполнения таймера будет равна 31250Гц. А если переменная "pwm_counter" считает до 163, то частота ШИМ будет равна 190 Hz. В обработчике прерываний исходя из значений в переменных pwm_r, pwm_g, pwm_b переключаются ножки порта В. Цветовые эффекты настраиваются с помощью функций, где задается время свечения светодиода. В тестовой программе сначала загораются красный, зеленый, синий, белый цвета, а потом начинается цикл с переходами цвета.
Программный код:
// Управление RGB светодиодом. Программный ШИМ
#include
#include
volatile char pwm_counter,pwm_r,pwm_g,pwm_b;
// Прерывание по переполнению Т0
ISR (TIMER0_OVF_vect)
if (pwm_counter++ > 163)
pwm_counter = 0;
if (pwm_counter > pwm_r) PORTB |= (1 << PB1);
if (pwm_counter > pwm_g) PORTB |= (1 << PB2);
if (pwm_counter > pwm_b) PORTB |= (1 << PB3);
// Процедура задержки в микросекундах
void delay_us(unsigned char time_us)
{ register unsigned char i;
for (i = 0; i < time_us; i++) // 4 цикла
{ asm (" PUSH R0 "); // 2 цикла
asm (" POP R0 "); // 2 цикла
// 8 циклов = 1 us для 8MHz
// Процедура задержки в миллисекундах
void delay_ms(unsigned int time_ms)
{ register unsigned int i;
for (i = 0; i < time_ms; i++)
{ delay_us(250);
// Красный цвет
void red (unsigned int time)
for (char a = 0; a < 165; a++)
pwm_r = 164 - a; //увеличение
for (char a = 0; a < 165; a++)
pwm_r = a; //уменьшение
// Зеленый цвет
void green (unsigned int time)
for (char a = 0; a < 165; a++)
pwm_g = 164 - a;
for (char a = 0; a < 165; a++)
// Синий цвет
void blue (unsigned int time)
for (char a = 0; a < 165; a++)
pwm_b = 164 - a;
for (char a = 0; a < 165; a++)
// Белый цвет
void white (unsigned int time)
for (char a = 0; a < 165; a++)
pwm_r = 164 - a;
pwm_g = 164 - a;
pwm_b = 164 - a;
for (char a = 0; a < 165; a++)
// Переход цветa
void rgb (unsigned int time)
for (char a = 0; a < 165; a++)
pwm_b = 164 - a;
for (char a = 0; a < 165; a++)