Микроконтроллеры можно найти практически повсюду, от простой бытовой техники до сложных схем. Благодаря им функциональность устройств увеличивается, а стоимость изготовления снижается. Принимая во внимание постоянное снижение цен на МК и увеличение их возможностей, имеет смысл использовать их даже в устройствах, которые можно было бы построить без участия таких чипов. Примером такого применения является представленный тут контроллер сетевого освещения.

Благодаря использованию популярного микроконтроллера схема диммера управляется двухполюсным переключателем или обычными микровыключателями. Применен известный фазовый контроль мощности переменного напряжения. Принцип заключается в ограничении тока, протекающего через нагрузку, питаемую сетевым напряжением 220 В, путем вырезания части формы сигнала напряжения питания в каждом периоде такой волны (аналогично управлению ШИМ, но здесь регулируем «наполнение» синусоиды питающего напряжения).

  • управляется двухполюсным или обычными микровыключателями,
  • 16-ступенчатая регулировка яркости освещения,
  • регулирование методом фазового контроля,
  • предназначен для управления источниками света до 200 Вт.

Принципиальная схема устройства представлена на рисунке. Это довольно простая микропроцессорная схема на ATtiny13. Он тактируется внутренним RC-генератором с частотой 1,2 МГц, который отвечает за работу переключателя, подключенного к клеммам «+» (PB3) и «-» (PB4) микроконтроллера, и за управление потребителем, подключенным к клеммам «LOAD» устройства.

Регулятор мощности(Диммер) на ATtiny13

Для реализации фазового регулирования необходима точная система, которая синхронизирует алгоритм с изменением напряжения сети. Для этого использовался популярный оптрон PC814, который в своей структуре объединяет два светодиода, соединенных по двухтактной схеме, и выходной фототранзистор. Благодаря этому на выходе этого элемента (коллектора встроенного фототранзистора) получаем сигнал для каждого перехода сетевого напряжения через ноль.

Нарастающий фронт запускает внешнее прерывание INT0, обработчик которого отвечает за программный механизм для обработки фазового регулирования. В этой процедуре система таймер-счетчик Timer0 запускается в режиме CTC, для которого рабочие параметры были выбраны таким образом, что в течение одной половины формы сигнала напряжения питания (10 мс, уменьшено на половину ширины триггерного выхода) было 16 прерываний TIM0_COMPA_vect – от сравнения содержимого счетчика TCNT0 со значением регистра сравнения OCR0A. Это прерывание выполняет управление фазой в 16 шагов путем циклического включения симистора T1 в момент времени, зависящий от значения глобальной переменной, определяющей уровень яркости.

Такое регулирование влечет за собой недостаток в виде сильных искажений тока, протекающего через потребитель, и, следовательно, образования гармоник более высокого порядка, вызывающих радиопомехи. Поэтому на выходе использовалась простая схема гашения (элементы C4, R5) для снижения уровня помех.

Регулятор мощности(Диммер) на ATtiny13 - осциллограмма

На рисунке показан снимок экрана осциллографа, показывающий фактические формы сигналов: напряжение на выходе схемы обнаружения пересечения напряжения через ноль (верхняя волна) и напряжение, контролирующее фазовую стабилизацию (вывод PB0 микроконтроллера, нижняя волна). Запись производилась при яркости около 30%.

Программа управления диммером

В листинге 1 показана функция, которая настраивает периферийные устройства микроконтроллера (прерывание Timer0 и INT0) для управления фазой. Далее в листинге 2 приведен код двух простых и коротких функций обслуживания системных прерываний (INT0 и из сравнения Timer0), реализующих надлежащий механизм управления фазой.

Листинг 1. Функция конфигурации периферии микроконтроллера для реализации фазового контроля
void initDimmer(void)
{
 ZERO_DETECTOR_PORT |= (1 << ZERO_DETECTOR_NR); // К выводу INT0 подключается детектор перехода через ноль
 OPTOTRIAC_DDR |= (1 << OPTOTRIAC_NR); // Порт как выход, управление оптосимистором
 // Конфигурация детектора перехода через ноль -> прерывание по INT0
 MCUCR = (1 << ISC01)|(1 << ISC00); // Нарастающий фронт вызывает прерывание INT0 
 GIMSK = (1 << INT0); // Разрешаем внешнее прерывание INT0
 // Конфигурация Таймера 0: режим CTC, предделитель = 8, OCR2 = 90.
 // Вызов прерывания TIM0_COMPA_vect будет происходить каждые 606 мкс, это означает, что
 // 16 таких прерываний будут выполнены за 9,8 мс, то есть в течение одной половины синусоидальной волны
 // минус 0,2 мс (полупериод детектора пересечения нуля) 
 OCR0A = 90;
 TCCR0A = (1 << WGM01); // Режим CTC
 TCCR0B = (1 << CS01); // Предделитель = 8
 TIMSK0 = (1 << OCIE0A); // Прерывание по сравнению TIM0_COMPA_vect
}

Listing 2. Функции обслуживания системных прерываний, реализующие надлежащий механизм контроля фазы 
ISR(INT0_vect){
 dimSteps = 15;
 // Двойная буферизация, синхронизация 50 Гц 
 dimBuffer = dimValue;
 // Поддержка таймера антидребезга
 // не относится к фазовому контролю 
 if(debTimer) --debTimer;
 TCNT0 = 0;
}
ISR(TIM0_COMPA_vect){
 OPTOTRIAC_OFF;
 if(dimBuffer && (dimSteps == dimBuffer)) OPTOTRIAC_ON;
 --dimSteps;
}

Итак, давайте перейдем ко второй проблеме, с которой имеет дело микроконтроллер, то есть к работе биполярного переключателя затвора, который представляет собой два мгновенных микропереключателя. Они отмечены стрелками вверх и вниз, что делает их идеальными для регулировки яркости. Стоит отметить, что поддержка этого компонента была реализована как поддержка, которая не блокирует основной цикл программы, поскольку он использует программный таймер в виде переменной debTimer. Он уменьшается каждые 10 мс в служебной функции прерывания INT0 (как дополнительная функция этого прерывания). Кроме того, указанная реализация поддерживает короткое и долгое нажатие и удерживание кнопки, которая используется в обработчике приложений устройства.

Листинг 3. Функция обработки нажатия кнопок

enum {IDLE, SHORT, LONG, REPEAT}; // Возможные ключевые состояния
// Определяем переменные выводов кнопок
#define KEYBOARD_PORT PORTB
#define KEYBOARD_PIN PINB
#define PLUS_NR PB3
#define MINUS_NR PB4
uint8_t keyPressed(uint8_t PINNR, uint8_t *keyStatus){
 enum {action_idle, action_debounce, action_check, action_repeat};
 if(!(KEYBOARD_PIN & (1 << PINNR))){
 switch(*keyStatus){
 case action_idle:
 *keyStatus = action_debounce;
 debTimer = 5; // Задержка 50мс, антидребезг
 break;
 case action_debounce:
 if(!debTimer){
 *keyStatus = action_check;
 // Задержка 500мс на проверку короткое
 // или долгое нажатие
 debTimer = 50;
 }
 break;
 case action_check:
 if(!debTimer){
 *keyStatus = action_repeat;
 // Задержка 300 мс, чтобы проверить, нажата ли клавиша. 
 // Старт функции повтора
 debTimer = 30;
 return LONG;
 }
 break;
 case action_repeat:
 if(!debTimer){
 // 100 мс - время повтора
 debTimer = 10;
 return REPEAT;
 }
 break;
 }
 }else{
 if(*keyStatus == action_check){
 if(debTimer){
 *keyStatus = action_idle;
 // Возвращаем SHORT, так как кнопка была отпущена
 // в течение 500 мс (LONG)
 return SHORT;
 }
 }
 else *keyStatus = action_idle;
 }
 return IDLE;
}

Вот и все о программировании. Это не должно вызывать удивления, поскольку устройство чрезвычайно простое, поэтому код приложения не слишком обширен. Такая простота была достигнута во многом благодаря использованию аппаратных ресурсов микроконтроллера, так что скомпилированный код приложения занимает всего 438 байт.

Сборка устройства

Схема сборки устройства показана на рисунке. Небольшая двусторонняя печатная плата была разработана с использованием только сквозных элементов, установленных на верхней стороне. Важно отметить, что размер печатной платы был подобран таким образом, чтобы ее можно было легко поместить в типичную коробку для скрытого монтажа диаметром 60 мм.

Регулятор мощности(Диммер) на ATtiny13 - печатная плата

Начинаем сборку устройства с пайки всех резисторов, затем конденсаторов, затем всех полупроводниковых элементов и, наконец, разъемов и трансформатора TR1. Вы можете залудить дорожки печатных схем, которые будут проводить более высокие токи. Речь идет о путях между выводами симистора Т1 и разъемом подключения нагрузки. Способ подключения диммера к электросети показан далее.

Регулятор мощности(Диммер) на ATtiny13 - подключение

Из-за отсутствия теплоотвода на T1 устройство подходит для управления маломощными источниками света, порядка 100 – 200 Вт. Оснащение симистора теплоотводом значительно улучшит возможности схемы, так как допустимый ток используемого элемента составляет 12 А.

Использование диммера

Для регулировки яркости подключенной лампочки предусмотрен простой выключатель или самые обычные микровыключатели, которые следует прикрепить к трем контактным площадкам с маркировкой «+», «-» и «COM». Каждое короткое нажатие на соответствующий переключатель увеличивает или уменьшает яркость регулируемого источника света на 16 шагов (0…15). Длительное нажатие переключателя «+» вызывает немедленное максимальное освещение подключенного источника света (максимальная яркость), а длительное нажатие переключателя «-» вызывает его немедленное гашение. Состояние по умолчанию после включения питания – погасить источник света, установив яркость на 0.


Файлы к статье "Регулятор мощности(Диммер) на ATtiny13"
Описание:

Файл прошивки микроконтроллера

Размер файла: 665 B Количество загрузок: 618 Скачать