Заголовок сообщения: Управление светодиодами RGB. Программный ШИМ AVR.
Добавлено: Сб май 19, 2012 13:09:16
Родился
Зарегистрирован: Пт май 18, 2012 23:03:42 Сообщений: 4
Рейтинг сообщения:0
Здравствуйте! Хотелось бы поуправлять светодиодами RGB, и не одним, а например десятью. Как я понимаю аппаратным ШИМ не получится, не хватит выводов . Попробовал программный, но светодиод заметно мерцает. Работает схема на внутреннем кварце частота 1 МГц. Может поэтому? Возможно ли частоту внутреннего кварца повысить или подключать внешний? Микросхема Atmega16. Вот программа:
Код:
#include <mega8.h> #include <delay.h>
volatile char pwm_counter,pwm_r,pwm_g,pwm_b;
/*** прерывание по переполнению Таймера 0 ***/ interrupt [TIM0_OVF] void timer0_ovf_isr(void) { if (pwm_counter++ > 163) { PORTB = 0x00; pwm_counter = 0; } if (pwm_counter > pwm_r) PORTB.1 = 1; if (pwm_counter > pwm_g) PORTB.2 = 1; if (pwm_counter > pwm_b) PORTB.3 = 1; }
/*** красный цвет ***/ void red (unsigned int time) {char a; for (a = 0; a<165; a++) { pwm_r = 164 - a; //увеличение pwm_g = 164; pwm_b = 164; delay_ms(time); } for (a = 0; a<165; a++) { pwm_r = a; //уменьшение pwm_g = 164; pwm_b = 164; delay_ms(time); } }
/*** зеленый цвет ***/ void green (unsigned int time) {char a; for (a = 0; a<165; a++) { pwm_r = 164; pwm_g = 164 - a; pwm_b = 164; delay_ms(time); }
for (a = 0; a<165; a++) { pwm_r = 164; pwm_g = a; pwm_b = 164; delay_ms(time); }
} /*** синий цвет ***/ void blue (unsigned int time) {char a; for (a = 0; a<165; a++) { pwm_r = 164; pwm_g = 164; pwm_b = 164 - a; delay_ms(time); } for (a = 0; a<165; a++) { pwm_r = 164; pwm_g = 164; pwm_b = a; delay_ms(time); } } /*** белый цвет ***/ void white (unsigned int time) {char a; for (a = 0; a<165; a++) { pwm_r = 164 - a; pwm_g = 164 - a; pwm_b = 164 - a; delay_ms(time); } for (a = 0; a<165; a++) { pwm_r = a; pwm_g = a; pwm_b = a; delay_ms(time); } } /*** переход цветов ***/ void rgb (unsigned int time) {char a; for (a = 0; a<165; a++) { pwm_r = a; pwm_b = 164 - a; delay_ms(time); }
for (a = 0; a<165; a++) { pwm_b = a; pwm_g = 164 - a; delay_ms(time); }
for (a = 0; a<165; a++) { pwm_g = a; pwm_r = 164 - a; delay_ms(time); } }
void main (void) { DDRB = 0x0E; // PB3,2,1 - выходы PORTB = 0x00; TIMSK = 0x01; // разрешение прерывания TCCR0 = 0x01; // без предделителя
Внутреннего кварца не бывает, бывает внутренний RC-генератор. Обычно у АВР-ок его можно выставить фьюзами до 8 МГц. У вас таймер переполняется с частотой 1МГц/256 = 3900Гц, а частота ШИМ получается 3900/164=24Гц, что конечно маловато. Можно не менять источник тактирования, вариантов много. Можно сделать прерывание по совпадению с регистром (OCRxx), занести в него 128 и в его обработчике скопировать обработчик из прерывания по переполнению - будет в 2 раза чаще. Можно перевести таймер в режим CTC, и занести в OCR например 32, тогда ШИМ будет с частотой в 8 раз больше.
Заголовок сообщения: Re: Управление светодиодами RGB. Программный ШИМ AVR.
Добавлено: Сб июн 09, 2012 01:20:01
Родился
Зарегистрирован: Пт май 18, 2012 23:03:42 Сообщений: 4
Рейтинг сообщения:0
Поменял частоту на 8 Мгц мерцание пропало. Но заметил странную вещь. Программой предусматривается плавное изменение цвета. Сначала включается например красный и синий и меняется значение синего, потом синий и зеленый и т.д Но почему то не всегда происходит смешивание, т.е отдельно видно красный и отдельно синий. И еще интересно есть ли какая нибудь палитра для светодиодов, что бы быстро получить нужный тебе цвет? Или легче сделать схему для подборки вручную?
для глаза одно восприятие- для железа это совсем другое один и тот же уровень по осциллографу вызовет разные ощущения на красном, зеленом или синем да и индивидуальное восприятие во многом зависит от конструкции экрана лучше предусмотреть возможность окончательной подгонки параметров на уже завершенной конструкции
ой-ой-ой!!! на том bamе свои "камушки" имеются!!! проверенно на практике - если работать с фиксированным уровнем все хорошо, но только попытайся сделать простенький приемчик - плавный перебор уровней от 0 до 0xFF и затем к 0 (по кольцу) сразу эта проблемка вылезет
//Global variables here volatile unsigned char leds[22], direct[22]; //leds - непосредственно значения BAM для светодиодов, direct - направление изменения яркостей для эффектов unsigned char mask_b, mask_c, mask_d; unsigned char stage;
это как кто пишет и мыслит (и кто к чему привык) - можно и алгоритм нарисовать - а там уже не все ли равно на каком языке реализовать кстати... неплохо бы наборчик алгоритмов собрать без привязки к конкретному семейству и языку...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения