Многоканальный фазовый регулятор на ATtiny2313

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

Принцип фазового регулирования подробно изложен в различных источниках, например, в [1], где предложена схема одноканального диммера и для ламп накаливания сетевого напряжения. В программном коде учтена нелинейность зависимости их видимой яркости от уровня питающего напряжения. В предлагаемом решении за основу взята идея реализации [1] и приведённые константы задержек включения, но, число управляющих каналов ограничено не одним, а определяется количеством доступных выводов МК, его производительностью и потребностью в них. Данное решение может применяться для создания как многоканальных диммеров, так и автоматов световых эффектов для ламп накаливания. Решение протестировано с использованием 8-ми каналов при изменении яркости одновременно четырьмя из них. Исходный код для МК ATtiny2313 прилагается.

Схема стенда
Схема стенда

Пояснения к исходному коду

Регулирование осуществляется установкой уровня яркости канала lvl[i], 0 соответствует минимальной яркости, 51 — максимальной. Текущий уровень яркости канала curr_lvl[i] будет изменяться с заданной скоростью speed[i], стремясь достичь заданного уровня lvl[i].

Алгоритм оптимизирован по времени расчётов моментов включения каналов: каналы с максимальной яркостью выделены в переменную max_lvl, являющуюся частью общей битовой маски, применяемой к выходному регистру, а с мин. яркостью — не включаются вовсе. Таким образом, расчёт момента включения производится только для каналов с промежуточной яркостью, что позволяет существенно экономить время расчёта и увеличить количество каналов.

МК определяет возрастающий фронт сигнала с детектора нуля (резистивный делитель R2, R3). Второй полупериод отсчитывается по таймеру. Обработчик прерывания int0 инкрементирует счётчики полупериодов и msec20 – счётчик 20мс-интервалов (для управления скоростью изменения яркости каналов), обнуляет счётчик таймера 1. Поскольку основной рабочий цикл осуществляется в обработчике прерывания TIMER1_COMPA_vect, в регистре сравнения OCR1A устанавливается минимальная задержка MIN_Delay и на этом обработчик завершается.

Отсчёт периода времени внутри полупериода сетевого напряжения (т.е., между прерываниями int0) ведётся по счётчику Timer1, работающему на частоте 1МГц (1/8 частоты МК). Для достижения большей производительности тактовая частота может быть увеличена вдвое установкой кварцевого резонатора на 16МГц. Однако, значения задержек угла отпирания (intensity[]) и сопутствующие им константы должны быть соответственно увеличены в 2 раза.

Рабочий цикл обработчика TIMER1_COMPA_vect состоит из 4-х фаз:

  1. включение каналов, которые необходимо включить, в начале первого полупериода;
  2. выключение (т.е., снятие управляющего напряжения для триаков, которые ещё будут оставаться открытыми до перехода напряжения через 0);
  3. включение каналов в начале второго полупериода;
  4. выключение во втором полупериоде и по его окончании – расчёт значений задержек угла отпирания на следующий период.

Каждой фазе соответствует значение переменной phase: 1) 0; 2) 2; 3) 1; 4) 3 (младший бит – полупериод, 0 – I, 1- II, первый бит: 0 – вкл., 1 – выкл. канала).

Включение (п.1 и 3) осуществляется столько раз, сколько на данный момент времени оказалось включаемых каналов (chnl) с различными значениями яркости. Выключение управляющего сигнала (п.2 и 4, соотв.) производится по мере применения к управляющему регистру каждой последующей битовой маски mask_b[] включаемых каналов, а по завершении серии включений– один раз по истечении минимально необходимой задержки включения (TRIAC_Delay) для канала(ов) с минимальным значением яркости (и, соотв., с максимальной задержкой включения). После чего, выполняется расчёт значений уровней яркости curr_lvl[], соответствующих им битовых масок max_lvl, mask_b[] и очереди значений задержек (фазовых углов) queue[], представляющих собой указатели на соответствующие curr_lvl[].

При расчёте max_lvl и mask_b[] формируется очередь каналов с промежуточными яркостями, вместе с ними формируется маска каналов с максимальной яркостью (max_lvl). Далее, выстраивается очередь указателей на значения яркости в порядке их убывания (т.е., по возрастанию фазовых углов — задержек включения). Так же строятся соотв. им значения битовых масок включаемых каналов, номер канала в которой определяется по разности указателей относительно начального элемента массива. Наконец, на 3-м этапе происходит объединение каналов с совпадающими яркостями, т.к. они включаются одновременно.

​Стенд
Стенд

Демонстрационный стенд представляет собой беспаечную макетную плату, к которой подведено напряжение 12В от трансформатора. Питание схемы осуществляется от преобразователя на LM78L05, а на лампы и тиристоры подаётся выпрямленное напряжение от второго диодного моста. Питание стенда осуществляется от силового трансформатора с выходным напряжением 11-12В. Можно любой подходящий на иное напряжение, но желательно не менее указанного. Лампы накаливания — любые подходящие по напряжению трансформатора и его мощности.

На стенде показан эффект «бегущих огней» с задержкой гашения, играющий роль нагрузочного тестирования, когда 4 канала одновременно имеют несовпадающие (и ненулевые) значения яркости. Значение скорости отработки эффекта считывается из второго байта памяти eeprom функцией непосредственного чтения EEPROM_read() из даташита на МК. Значение должно быть в пределах 1-6, иначе, оно остаётся заданным по умолчанию.

Примечание 1. В упрощённой схеме стенда применены тиристоры с малым током управления, при одновременной работе которых отмечен тот же эффект, что и в [2] — нежелательные «мерцания» ламп при одновременной работе нескольких (более 2х) каналов. Полностью избавиться от этого можно указанным там способом: применением специализированных симмисторов или установкой снабберов [3].

Длительности задержек учитывают также задержку включения оптопар [4] для управления симмисторами.

При реализации схем с гальванической развязкой потребуется соответствующий детектор нуля. Так, была опробована и хорошо показала себя достаточно простая схема [5], в которой оптопара 4N35 была заменена на PC817, а Q1 на BC857. Поскольку в этой схеме каждый переход напряжения через 0 отмечается прямоугольным импульсом, обработчик int0 меняет свой вид, а расчёт задержек для регистра сравнения OCR1A несколько упрощается, что предусмотрено соответствующими директивами препроцессора.

Примечание 2. При использовании детектора нуля, как на представленном стенде, компиляция проекта производится с опцией –D DETECT50HZ. Если такое определение отсутствует, подразумевается, что будет использован детектор каждого перехода напряжения через 0, как в [5].

Фьюзы H:99, L:E4.

  1. https://radiokot.ru/articles/40/
  2. https://cxem.net/house/1-485.php
  3. https://www.onsemi.com/pub/Collateral/AN-3008.pdf.pdf
  4. https://static.chipdip.ru/lib/158/DOC000158143.pdf
  5. http://forum.easyelectronics.ru/download/file.php?id=28088

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
VD1-VD4 Тиристор BT169D 4 MCR100-6 и др.
U2 МК AVR 8-бит ATtiny2313A 1
HL1-HL4 Лампа миниатюрная 14В 50мА 1
U1 Линейный регулятор LM78L05 1
D1,2 Диодный мост DB107 2 Или аналогичный
С1 Электролитический конденсатор 470 мкФ 1
C3 Конденсатор 10 нФ 1
C2, C4 Конденсатор 100 нФ 2
C5 Электролитический конденсатор 10 мкФ 1
R1, R3 Резистор 10 кОм 2
R2 Резистор 20 кОм 1
R4-7 Резистор 1 кОм 4
12V AC Трансформатор ТП-121-4 1 Или аналогичный