Транзистор VT1 служит для формирования синхроимпульсов, необходимых для корректного управления симистором. На базу транзистора подаётся выпрямленное пульсирующее напряжение частотой 100 гц (верхняя эпюра на графике), на коллекторе транзистора и выводе 6 микроконтроллера DD1 формируются импульсы положительной полярности с периодом 10 мс (нижняя эпюра на графике):
Используемый симистор S202S02 не позволяет реализовать фазоимпульсное регулирование напряжения (его нельзя открыть в произвольный момент времени), поэтому единственный выход - "выкусывать" часть полупериодов напряжения на нагрузке.
Строго говоря, выкусывать нужно таким образом, чтобы всегда получалось чётное число полупериодов. В противном случае неизбежно образование в потребляемом токе постоянной составляющей, способной вызвать нежелательное подмагничивание магнитопроводов трансформаторов и двигателей, подключённых к той же сети.
Но это теория, на практике же, паяльник мощностью 40 ватт (или лампочка в подъёзде, включённая через диод) трансформаторную будку вместе с силовым трансформатором сильно не намагнитят. Поэтому в текущей версии программы микроконтроллера разрешено появление нечётного количества полуволн.
Для примера, зададимся числом полупериодов = 100. Тогда удалив один полупериод, мы понизим мощность паяльника на 1%, удалив 50 полупериодов - понизим мощность на 50%. Но 50% можно получить и по другому, выкусывая каждый второй полупериод! Также, можно найти кратные значения и для других комбинаций полупериодов. Чтобы не считать каждый раз всю таблицу вручную, на языке VBA (Visual Basic for Application) из состава Microsoft Excel была написана вспомогательная программа, в которой можно задаться количеством полупериодов, шагом "выкусывания", а также разрешить или запретить нечётное количество полуволн:
В текущей версии программы микроконтроллера используется таблица из 100 полупериодов с шагом 2. Нечётное количество полупериодов - разрешено. При этом получается 51 градация мощности, что вполне удобно. Большее количество не имеет смысла, т.к. невозможно уверенно выбрать ту или иную ступень при помощи переменного резистора.
Соответствие синхроимпульсов на выводе 6 микроконтроллера (верхняя эпюра) и импульсов управления симистором на выводе 3 микроконтроллера (нижняя эпюра) показано на рисунке (горизонтальный масштаб - 5 мс на деление; уровень мощности - 50%):
Как видно из графика, длительность импульсов управления равна 5 мс. Этого вполне достаточно не только для уверенного открывания симистора, но и для свечения светодиода HL1, расположенного на передней панели устройства. Напряжение на нагрузке в случае уровня мощности 50% имеет вид однополупериодного выпрямления: Программа для микроконтроллера ATtiny13 написана на языке Си в среде разработки CodeVisionAVR 1.25.5. Бесплатная версия компилятора имеет ограничение по размеру компилируемого кода (hex), в 2 кБ. Поскольку объём памяти применяемого микроконтроллера равен 1 кБ, то "бесплатность" компилятора является большим плюсом. Для редактирования исходника необходимо запустить (открыть) файл проекта "copper.prj".
Вся программа состоит из четырёх функций:
- void main(void);
- interrupt [EXT_INT0] void ext_int0_isr(void);
- unsigned char read_adc(unsigned char adc_input);
- void open_simistor (void).
Рассмотрим назначение каждой функции подробнее:
- void main(void) - основная функция в любой программе на языке Си. После включения микроконтроллера первой начинает выполняться именно эта функция. Поэтому в её начале находится инициализация всех необходимых составляющих микроконтроллера (таймеры, АЦП, порты и т.д.), а также чтение сохранённых в EEPROM данных;
- interrupt [EXT_INT0] void ext_int0_isr(void) - функция обработки прерывания. Отправной точкой работы программы являются прерывания, инициируемые нарастающим фронтом импульсов на выводе 6 микроконтроллера. После наступления прерывания, микроконтроллер прекращает все текущие действия и переходит к выполнению кода, размещённого в данной функции. Условно, функция состоит из трёх частей:
- определение положения движка резистора R3 (функция unsigned char read_adc(unsigned char adc_input));
- проверка условий открытого/закрытого состояния симистора;
- управление симистором (функция void open_simistor (void));
- unsigned char read_adc(unsigned char adc_input) - функция выполняет запуск преобразования и чтение результатов преобразования АЦП, т.е. фактически здесь определяется положение движка переменного резистора R3. Поскольку в данной задаче не требуется большого разрешения, то используются только старшие 8 бит 10-битного результата. Частота тактирования АЦП, напротив, выбрана большой - 600 кГц. Результат преобразования АЦП используется для выбора нужной ячейки двумерного массива flash unsigned char cycles[52][2], в котором находится таблица скважностей всего диапазона регулировки мощности;
- void open_simistor (void) - функция управления симистором. Определяет задержку и длительность импульса открывания симистора. Единственное, что нужно прокомментировать в этой функции - строку " if (mode == 0) delay_us(2000); ".
Дело в том, что во время первичных испытаний, когда вся конструкция была собрана на "соплях", и провода были длинными, наблюдалось нестабильное открывание симистора. Это происходило только при работе симистора под нагрузкой и только при напряжении питания 15 вольт (ступень для 12-ти вольтового паяльника). Нормальная работа обеспечивалась задержкой импульса открывания симистора (нижняя эпюра) относительно синхроимпульса (горизонтальный масштаб - 2 мс на деление; уровень мощности - 100%):
Включение и выключение задержки реализовано через положение движка переменного резистора R3. Если ПРИ ВКЛЮЧЕНИИ питания движок находится в крайнем левом положении (нижнем по схеме), то в EEPROM микроконтроллера записывается флаг признака включения задержки. Если движок резистора в момент включения находился в крайнем правом положении (верхнем по схеме), то в EEPROM микроконтроллера пишется флаг признака выключения задержки. Когда движок резистора находится в любом другом промежуточном положении (а так оно, чаще всего, и бывает), то данные из EEPROM просто переписываются в ОЗУ микроконтроллера. Таким образом, выполнено запоминание необходимого режима работы.
Однако, после окончательного монтажа устройства, сбои в работе симистора исчезли. На всех ступенях напряжения задержка импульса открывания симистора не требуется. Тем не менее, возможность включения задержки было решено оставить.
|