Управление мощностью по алгоритму брезенхема на avr. Алгоритм вывода прямой линии. Схема и описание силовой части регулятора мощности

Мы научились выводить на TFT дисплей символы и строки, в этой будем учиться рисовать геометрические фигуры. Геометрических фигур, которые могут пригодиться при создании графического интерфейса, не так уж много, основные из них, это прямоугольник и круг именно их мы и будем учиться рисовать, в двух вариантах закрашенные и не закрашенные. Скажу сразу, что в статье подробно будут описаны алгоритмы рисования лишь некоторых геометрических фигур, чего должно хватить для понимания общих принципов построения растрового изображения. Начнём с самой простой фигуры - закрашенного прямоугольника.
Из прошлой статьи мы помним, что если задать координаты точки, затем просто отправлять цвет, то SSD1289 сам по выбранному, при инициализации алгоритму, будет закрашивать точки. Но в этом случае есть одна особенность, контроллер переходит на следующую строку, только когда достигает конца текущей строки.
Нарисовать закрашенный прямоугольник, нам помогут следующие регистры.

С помощью этих регистров мы можем задать начало и конец области, в которую будем писать, затем в цикле, нужное количество раз, отправим цвет, а контроллер все сделает сам, по заданному при инициализации алгоритму. Но теперь он будет переходить на следующую строку, когда достигнет конца, указанной нами области.
Для записи границ области по Х, предназначен один регистр R44, а для записи границ по Y - два регистра R45 и R46. Давайте описанное выше оформим в виде функции, для удобства, код, который отвечает за выделение рабочей области, вынесем в отдельную функцию Set_Work_Area().
void Set_Work_Area(uint16_t y1, uint16_t x1, uint16_t x2, uint16_t y2) { Lcd_Write_Reg(0x0044,((x2 << 8) | x1)); Lcd_Write_Reg(0x0045,y1); Lcd_Write_Reg(0x0046,y2); Set_Cursor(x1, y1); } /////////////////////////////////////// void Draw_Area(uint16_t left, uint16_t top, uint16_t right, uint16_t bottom, uint16_t color) { register uint16_t x,y; Set_Work_Area(left, top, right, bottom); for(y=top; y<=bottom; y++) { for(x=left; x<=right; x++) { Lcd_Write_Data(color); } } Set_Work_Area(0, 0, 319, 239); }


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

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



На картинке выше жёлтым цветом показана линия до растеризации, зелёным и красным - расстояние до центров ближайших ячеек.
А вот и код для рисования линии.
void Draw_Line (uint8_t size,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color) { int deltaX = abs(x2 - x1); int deltaY = abs(y2 - y1); int signX = x1 < x2 ? 1: -1; int signY = y1 < y2 ? 1: -1; int error = deltaX - deltaY; for (;;) { Draw_Point(size,x1,y1,color); if(x1 == x2 && y1 == y2) break; int error2 = error * 2; if(error2 > -deltaY) { error -= deltaY; x1 += signX; } if(error2 < deltaX) { error += deltaX; y1 += signY; } } }
Для того чтобы нарисовать прямоугольник нам понадобится 4 линии, для удобства вынесем в отдельные функции рисование горизонтальных и вертикальных линий,
void Draw_Horizont_Line(uint8_t size,uint16_t x1,uint16_t y1,uint16_t y2,uint16_t color) { Draw_Line(size, x1, y1, x1, y2, color); } /////////////////////////////// void Draw_Vertical_Line(uint8_t size,uint16_t x1,uint16_t x2,uint16_t y1,uint16_t color) { Draw_Line(size, x1, y1, x2, y1, color); } /////////////////////////////// void Draw_Reactangle(uint8_t size,uint16_t left,uint16_t top,uint16_t right,uint16_t bottom,uint16_t color) { Draw_Horizont_Line(size, top, left, right, color); Draw_Horizont_Line(size, bottom, left, right, color); Draw_Vertical_Line(size, top, bottom, left, color); Draw_Vertical_Line(size, top, bottom, right, color); }


А для того чтобы нарисовать треугольник потребуется всего 3 линии)))
void Draw_Triangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint8_t size, uint16_t color) { Draw_Line(size, x1, y1, x2, y2, color); Draw_Line(size, x2, y2, x3, y3, color); Draw_Line(size, x3, y3, x1, y1, color); }


По алгоритму Брезенхема также можно построить окружность. На каждом шаге алгоритма, рассматриваются три точки и более подходящая находится путём сравнения расстояния от центра окружности до выбранной точки с радиусом окружности.
void Draw_Circle (uint8_t size,uint16_t x0,uint16_t y0,uint16_t radius,uint16_t color) { int x = 0; int y = radius; int delta = 2 - 2 * radius; int error = 0; while(y >= 0) { Draw_Point(size,x0 + x, y0 + y,color); Draw_Point(size,x0 + x, y0 - y,color); Draw_Point(size,x0 - x, y0 + y,color); Draw_Point(size,x0 - x, y0 - y,color); error = 2 * (delta + y) - 1; if(delta < 0 && error <= 0) { ++x; delta += 2 * x + 1; continue; } error = 2 * (delta - x) - 1; if(delta > 0 && error > 0) { --y; delta += 1 - 2 * y; continue; } ++x; delta += 2 * (x - y); --y; } }


Под конец написания статьи нашел функцию, которая рисует закрашенные и не закрашенные кружки, отвечает за это аргумент fill.
void Draw_Circle1(unsigned int x,unsigned int y,char radius,char fill, char size, unsigned int color) { int a_,b_,P; a_ = 0; b_ = radius; P = 1 - radius; while (a_ <= b_) { if(fill == 1) { Draw_Area(y-a_,x-b_,y+a_,x+b_,color); Draw_Area(y-b_,x-a_,y+b_,x+a_,color); } else { Draw_Point(size, a_+x, b_+y, color); Draw_Point(size, b_+x, a_+y, color); Draw_Point(size, x-a_, b_+y, color); Draw_Point(size, x-b_, a_+y, color); Draw_Point(size, b_+x, y-a_, color); Draw_Point(size, a_+x, y-b_, color); Draw_Point(size, x-a_, y-b_, color); Draw_Point(size, x-b_, y-a_, color); } if (P < 0) { P = (P + 3) + (2* a_); a_ ++; } else { P = (P + 5) + (2* (a_ - b_)); a_ ++; b_ --; } } } ////////////////////////////////////


Пожалуй это все, что хотелось рассказать про рисование геометрических фигур, а в мы узнаем как работает резистивный сенсорный экран.
Ссылка на код, написанный к статьям про SSD1289, .
Проект для Atmega16 в Atmel Studio 6.2 в архиве (cкачиваний: 167)

Благодаря идее и участию Юрия Зинченко (ZenitSoft) было разработано и построено устройство, регулирующее мощность кухонной электроплиты методом пропуска периодов. За основу была взята (см. также блок ссылок в подвале). Разработанный вариант и в настоящее время работает у него, и он вполне доволен его работой.

После изготовления первого варианта устройства были замечены единичные сбои при работе и сравнительно сложная регулировка детектора перехода сетевого напряжения через ноль из-за сдвига фазы при получении импульса перехода.

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

Технические характеристики контроллера электроплиты

Симисторный регулятор позволяет регулировать мощность в активной нагрузке от нуля до 100% с шагом 1%. Величина регулируемой мощности определяется типом тиристора и свойствами радиатора охлаждения.
Для быстрого разогрева предусмотрена подача 100% мощности на заданное время, от нуля до 9 мин
Предусмотрен таймер обратного отсчета времени нагрева, от нуля до 999 мин.
Возможен выбор способа регулирования пропуском периодов или управлением длительностью полупериода (фазовый метод). Позволяет менять способы регулирования во время работы.
Запоминание всех установок при плановом или случайном отключении устройства от сети.
Габариты устройства 125×70 х 62 мм.

Краткое описание режимов регулирования

Пропуск периодов

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

Известно, что отдаваемую мощность прибора работающего на переменном напряжении можно регулировать, пропуская в неё не все периоды напряжения сети. Если взять сеть частотой 50Гц, то в 2с проходит 100 периодов, значит если в 2 с пропустить, допустим, 10 периодов, то получим 10% мощности, и точность регулирования составит 1%. При этом очень желательно чтобы периоды шли не пачками, а были бы распределены равномерно.
Это достигается использованием алгоритма Брезенхема , который распределяет заданный процент мощности равномерно во времени. Причем это достигается применением в программе только целочисленной арифметики, без деления и умножения, что существенно упрощает и ускоряет вычисления. Вычисления и управление по алгоритму Брезенхема запускаются сразу после поступления внешнего прерывания.
Режим пропуска периодов применим для управления резистивными нагрузками, но не применим для осветительных приборов, так как вызывает мигание ламп накаливания.

Фазовое регулирование

Альтернативным методом управления мощностью является метод фазового управления
Для изменения мощности, подведенной к нагрузке через симистор, может использоваться фазовое управление. Сущность метода заключается в отпирании симистора на каждом полупериоде переменного тока с постоянной задержкой относительно точки перехода через ноль. Таким образом, от каждого полупериода отрезается «ломтик». Это и будет так называемая широтно-импульсная модуляция, позволяющей управлять током в (или, что реже, напряжением на) нагрузке с максимальным КПД.

Преимуществом этого метода является то, что частота пульсаций на нагрузке остается равной сетевой. Это важно для управления осветительными приборами, так как снижение частоты может сказаться на появлении мерцания, заметного глазом. Но при регулировании данным методом появляется особенность неравномерности характеристики регулирования.


Прямое решение этого уравнения требует поиска корней квадратного уравнения и вычисление арккосинуса полученного корня. Это довольно сложная задача для микроконтроллера, как по времени, так и по объему ресурсов. Поэтому значительно более простым оказалось применение метода кусочно-линейной аппроксимации, без значительной потери точности, что наглядно видно из графика.


По оси x указано значение устанавливаемой мощности в процентах, а по оси y значение угла открывания симистора в значениях Π/100. Синий график – вычисленный по формулам, а коричневый создан с помощью аппроксимации. Как видно из рисунка расхождения между реальными и вычисленными значениями весьма незначительны.
Неприятной особенностью фазового метода являются помехи, которые могут появиться в связи с резким переключением симистора, поэтому желательно применение фильтров на входе.

Для обоих методов управления мощностью необходимо знать, когда сетевое напряжение переходит через нуль и поэтому основной цикл программы - отслеживание перехода сетевого напряжения через ноль и подача его на вход внешнего прерывания микроконтроллера, как на вход с наивысшим приоритетом.

Схема и описание силовой части регулятора мощности


Силовой блок выдает напряжение +5V, формирует импульсы перехода сети через ноль и содержит схему управления нагрузкой с помощью симистора.
Детектор перехода сетевого напряжения через ноль взят из журнала «Радиолоцман». Он выдает импульсы перехода с интервалом 10 мсек.
Конденсатор С6 заряжается до 25 Вольт - уровня ограничения стабилитрона D12. Входной ток ограничивается резистором R2. Когда выпрямленное входное напряжение опускается ниже напряжения на конденсаторе С6, открывается транзистор Q3 и генерирует импульс длительностью в несколько сотен микросекунд. Оптрон U2 обостряет фронты и делает выходной импульс более прямоугольным.

Схема источника +5 Вольт подробно описана в журнале «Радио» № 11 за 2007 год, стр. 30, в статье «Доработка ЗУ сотового телефона». Добавлен стабилизатор на 78L05 для уменьшения помех и для дополнительной стабилизации.
Работа схемы: Напряжение сети через резистор R1, который выполняет функции предохранителя, поступает на мостовой выпрямитель на диодах D1 -D4 и сглаживается конденсатором С1. Стабилизация выходного напряжения осуществляется косвенным методом. Для этого напряжение со второй обмотки трансформатора выпрямляется диодом D5, сглаживается конденсатором С2 и через стабилитрон D6 поступает на базу транзистора. Для защиты источника в момент подключения к сети, а также при резких колебаниях напряжения в сети, установлена защита по току Q2 на элементах Q1, R7 на уровне 60…70 мА.

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

Схема управляющей части регулятора мощности


NB! На принципиальной схеме неверно указаны номиналы резисторов R2 - R6. Правильный номинал 680 Ом.
Применен индикатор с общим катодом.


Схема блока управления получилась довольно простой. Три кнопки управления, 3-х разрядный индикатор и два светодиода позволяют управлять и следить за всеми функциями устройства.
Платы блоков соединяются 4-х проводным шлейфом.

Программное обеспечение

Программа написана на языке Си для компилятора «mikroC for PIC». Комментарии, расположенные в программе способствуют пониманию ее работы.
Для управления режимами работы применено управление с помощью одной кнопки с подсчетом числа нажатий. Алгоритм и часть кода взяты из .
Кнопку можно нажимать кратко (несколько раз), длинно или делать разные комбинации нажатий. Сколько за две секунды успеем «натыкать» - всё наше. Далее запустится процедура анализа собранных данных и всё расставит по порядку.
Бороться с дребезгом тут уже не обязательно, так как временные задержки организуются автоматически. См. подробности в статье.

В программе задействованы прерывания по внешнему входу INT, по таймеру 1 и таймеру 2.
На вход INT поступают импульсы с детектора перехода через ноль с периодом 10 мсек. Импульсы с таким периодом используются для получения фазовой регулировки, а для управления пропуском периодов необходим период 20 мсек, который получаем программно, пропуская один из импульсов. Алгоритм Брезенхема удачно вписался в программу внешних прерываний.
С таймера TMR1 получаем импульсы 5 мсек, которые используются для динамической индикации, работы кнопки «Выбор» и отсчета системного времени.
Таймер TMR0 настроен на время около 100 мксек и применяется только в режиме фазового управления.

Память EEPROM использована для сохранения всех режимов при отключении или внезапном пропадания питания. Запись в память происходит после пропадания импульсов внешнего прерывания. Восстановление данных из памяти происходит при включении регулятора в сеть. При таком использовании EEPROM резко уменьшается количество операций записи и время, которое она занимает.

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

Прибор собран на двух платах, соединенных между собой стойками.


Радиатор для симистора должен иметь достаточную площадь для отвода тепла.


Трансформатор и некоторые детали для источника питания +5 Вольт применены от старого телефонного зарядника. Оптосимистор U1 можно заменить аналогом, но следует учесть, что он должен быть без детектора нуля. Платы соединены между собой 4-х проводным шлейфом. Печатная плата для блока управления не создавалась, а была взята от предыдущей версии. С нее были удалены лишние детали и сделаны необходимые доработки. Обе платы и розетка для включения нагрузки заключены в корпус из металла и пластика.

Первое включение и проверка работы

Учитывая, что силовая часть устройства гальванически связана с сетью, желательно проявить максимум осторожности или использовать разделительный трансформатор при первом включении и проверке сигналов.
1. Включить силовую часть устройства.
2. Проверить напряжение источника +5 Вольт на выходе микросхемы 78L05.
3. Проверить наличие импульсов перехода через ноль – должны быть импульсы с периодом 10 мсек.
4. Соединить плату шлейфом, подключить в качестве нагрузки лампу накаливания 15 – 100вт и включить в сеть. При включении лампа загорится полным накалом и также загорится красный светодиод. После некоторого времени красный светодиод гаснет, и лампа начинает мигать в зависимости от установленной мощности. Если перейти в фазовый режим, то лампа будет гореть без миганий, а яркость будет изменяться в зависимости от установленной мощности. Желтый светодиод ШИМ практически полностью повторяет режим свечения лампы.
5. Проверить регулятор во всех режимах работы, согласно инструкции по управлению устройством.

Управление прибором

Режим управления мощностью – одно короткое нажатие кнопки «Выбор». На индикаторе отображается величина мощности в процентах.
Режим таймера отключения - два коротких нажатия кнопки «Выбор». На индикаторе отображается время, оставшееся до отключения нагрева в минутах. В этом режиме идет обратный отсчет времени в минутах. Можно установить время отключения таймера в минутах от 0 до 999. точка в последнем разряде мигает, если идет отсчет.
Режим установки времени быстрого разогрева - три коротких нажатия кнопки «Выбор». На индикаторе отображается время, подачи 100% мощности нагрева в минутах и секундах. При этом точка в первом разряде не мигает.
Режим изменения варианта регулировки с пропуском периода или фазовый – одно длинное нажатие кнопки. На индикаторе отображается режим PUL - с пропуском периода или F – фазовый.

В любом из режимов можно изменить значения кнопками «+» и «-». Нажатие кнопки кратковременно - добавление или уменьшение, удержание быстрый перебор. При этом кнопкой «Выбор» можно перейти в любой режим и просмотреть параметры любого режима, если не нажимать кнопки «+» и «-».

Если возникнет необходимость вернуться к начальным установкам, это можно сделать, удерживая кнопку «Выбор» около секунды при включении устройства в сеть.

Алгоритм Брезенхема является одним из старейших алгоритмов в машинной графике. Казалось бы, как можно применить алгоритм построения растровых прямых при создании домашней паяльной печи? Оказывается можно, причем с очень достойным результатом. Забегая вперед, скажу, что данный алгоритм очень хорошо скармливается маломощному 8-битному микроконтроллеру. Но обо всем по порядку.

Алгоритм Брезенхе́ма - это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Суть алгоритма заключается в том, чтобы для каждого столбца X (см. рисунок) определить какая строка Y ближе всего к линии, и нарисовать точку.

Теперь посмотрим как подобный алгоритм поможет нам при управлении ТЭНами в электропечи.

ТЭН питается от сетевого напряжения 220В/50Hz. Взглянем на график.



При подаче такого напряжения в чистом его виде на вход электронагревателя мы получим на выходе 100% мощность нагрева. Все просто.



Что будет если подать на вход ТЭНа только положительную полуволну сетевого напряжения? Правильно, мы получим 50% выходной мощности нагрева.



Если подать каждую третью полуволну, мы получим 33% мощности.

В качестве примера возьмем 10% градацию выходной мощности и временной отрезок в 100мс, что равносильно 10 полуволнам сетевого напряжения. Нарисуем сетку 10х10 и представим, что ось Y это ось значений выходной мощности. Проведем прямую от 0 до необходимого значения мощности.


Прослеживаете зависимость?
Увеличив временной отрезок до 1 сек, можно получить градацию выходной мощности в 1%. Получится сетка 100х100 со всеми вытекающими.

А теперь о приятном:
Алгоритм Брезенхема можно построить в цикле таким образом, чтобы на каждом шаге по оси X просто отслеживать значение ошибки, которое означает - вертикальное расстояние между текущим значением y и точным значением y для текущего x . Всякий раз, когда мы увеличиваем x , мы увеличиваем значение ошибки на величину наклона. Если ошибка превысила 0.5, линия стала ближе к следующему y , поэтому мы увеличиваем y на единицу (читай - пропускаем одну полуволну напряжения), одновременно уменьшая значение ошибки на 1.

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

Я намеренно не стал грузить вас формулами. Алгоритм элементарный, легко гуглится. Я лишь хочу показать его возможность применения в схемотехнике. Для управления нагрузкой будет использоваться типовая схема подключения симисторной оптопары MOC3063 с детектором нуля.


При таком подходе есть ряд преимуществ.

  • Минимальные помехи в сети из-за частых коммутаций большой нагрузки, включение/выключение будет происходить в моменты перехода напряжения через ноль.
  • Очень простой алгоритм - все вычисления сводятся к работе с целыми числами, что хорошо для микроконтроллера.
  • Нет необходимости городить детектор перехода напряжения через ноль (привет MOC3063). Даже если МК будет просто дергать ногой по таймеру, открывая оптопару, ошибка будет не критичной.

Продолжение следует.

Алгоритм Брезенхема является одним из старейших алгоритмов в машинной графике. Казалось бы, как можно применить алгоритм построения растровых прямых при создании домашней паяльной печи? Оказывается, можно, причем с очень достойным результатом. Забегая вперед, скажу, что данный алгоритм очень хорошо скармливается маломощному 8-битному микроконтроллеру. Но обо всем по порядку.

Алгоритм Брезенхе́ма - это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Суть алгоритма заключается в том, чтобы для каждого столбца X (см. рисунок) определить какая строка Y ближе всего к линии, и нарисовать точку.

Теперь посмотрим, как подобный алгоритм поможет нам при управлении ТЭНами в электропечи.

ТЭН питается от сетевого напряжения 220В/50Hz. Взглянем на график.


При подаче такого напряжения в чистом его виде на вход электронагревателя мы получим на выходе 100% мощность нагрева. Все просто.



Что будет если подать на вход ТЭНа только положительную полуволну сетевого напряжения? Правильно, мы получим 50% выходной мощности нагрева.



Если подать каждую третью полуволну, мы получим 33% мощности.

В качестве примера возьмем 10% градацию выходной мощности и временной отрезок в 100мс, что равносильно 10 полуволнам сетевого напряжения. Нарисуем сетку 10х10 и представим, что ось Y это ось значений выходной мощности. Проведем прямую от 0 до необходимого значения мощности.

Прослеживаете зависимость?
Увеличив временной отрезок до 1 сек, можно получить градацию выходной мощности в 1%. Получится сетка 100х100 со всеми вытекающими.

А теперь о приятном:
Алгоритм Брезенхема можно построить в цикле таким образом, чтобы на каждом шаге по оси X просто отслеживать значение ошибки, которое означает - вертикальное расстояние между текущим значением y и точным значением y для текущего x . Всякий раз, когда мы увеличиваем x , мы увеличиваем значение ошибки на величину наклона. Если ошибка превысила 0.5, линия стала ближе к следующему y , поэтому мы увеличиваем y на единицу (читай - пропускаем одну полуволну напряжения), одновременно уменьшая значение ошибки на 1.

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

Я намеренно не стал грузить вас формулами. Алгоритм элементарный, легко гуглится. Я лишь хочу показать его возможность применения в схемотехнике. Для управления нагрузкой будет использоваться типовая схема подключения симисторной оптопары MOC3063 с детектором нуля.

При таком подходе есть ряд преимуществ.

  • Минимальные помехи в сети из-за частых коммутаций большой нагрузки, включение/выключение будет происходить в моменты перехода напряжения через ноль.
  • Очень простой алгоритм - все вычисления сводятся к работе с целыми числами, что хорошо для микроконтроллера.
  • Нет необходимости городить детектор перехода напряжения через ноль (привет MOC3063). Даже если МК будет просто дергать ногой по таймеру, открывая оптопару, ошибка будет не критичной.

Продолжение следует.

Введение На производстве (в системах автоматизированного управления), в быту зачастую необходимо использовать регулировку мощности, подаваемую на нагрузку. Как правило, нагрузка работает от сети переменного тока. Поэтому задача несколько усложняется, в сравнении с регулировкой мощности нагрузки, работающей на постоянном напряжении. В случае работы нагрузки на постоянном напряжении применяют широтноимпульсную модуляцию (ШИМ), и изменяя скважность соответственно изменяется и мощность, подаваемая на нагрузку. Если использовать управление с помощью ШИМ для регулировки мощности в сети переменного тока, ключ через который регулируем сигнал (например, симистор) будет открываться и пропускать в нагрузку части синусоиды, имеющие разную мощность. Элементная база и сборка регулятора Рис.1. Электрическая принципиальная схема регулятора Для реализации данного проекта были использованы: Pinboard на AVR микроконтроллере ATmega16, симистор Philips BT138 12А, диодный мост DB105, оптосимистор MOC3022, оптопара PC817, сопротивления 220 Ом - 10 кОм, потенциометр 5 кОм. Подключение элементов показано на рис.1. Принцип работы устройства Данный регулятор предназначен для работы с активной нагрузкой, подключаемой к сети напряжением 220 В. Для определения начало каждой полуволны используется оптопара. Таким образом, на выходе детектора нуля получаем короткие положительные импульсы в момент, когда напряжение в сети проходит через 0. Сигнал с детектора нуля подключен на вход внешнего прерывания МК, чтобы определять начало новой полуволны и открывать симистор на необходимое время или на определенное количество полупериодов. Для отпирания симистора на его управляющий электрод подаётся напряжение через оптосимистор относительно условного катода. Фазовый метод При фазовом методе, изменяя значение задержки таймера посредством АЦП микроконтроллера (в нашем случае потенциометром), соответственно изменяем задержку открытия симистора после начала полуволны. Чем больше задержка, тем меньшая часть полуволны будет пропущена на нагрузку и соответственно получаем меньшую мощность, и наоборот. Зная частоту тактирования микроконтроллера, рассчитана задержка. При частоте сетевого напряжения 50 Гц время полупериода составит 0,01 секунды. То есть, если симистор открыт через 0,003 сек, будет пропущено приблизительно 2/3 полуволны, и мощность составит 70%. Если симистор будет открыт без задержки, то пропущена вся полуволна, и выходная мощность составит 100%. Была реализована программа с применением фазового метода управления нагрузкой. Программирование осуществлялось на языке С++ в среде CodeVisionAVR. Показания с осциллографа на нагрузке приведены на рисунке 2. Рис.2. Регулировка мощности фазовым методом Расчет задержки на открытие симистора Так как функция напряжения не линейная, то есть площадь под синусоидой при одном и том же интервале времени будет разной, соответственно и мощность будет разная. Поэтому задержка была рассчитана с учетом нелинейности напряжения. На рисунке 3 показана синусоида сети и интервалы задержки, рассчитанные в таблице 1. Показаны первые пять из ста (в процентах) значений задержки. Рис.3. Регулировка фазовым методом Таблица 1 Расчет задержек на открытие симистора Номер точки полуволны Время в микросекундах Синус точки 0 0 0 1 638 0,199 2 903 0,279 3 1108 0,341 4 1282 0,391 5 1436 0,435 Метод Брезенхема Существует также метод регулировки мощности, основанный на принципе подачи на нагрузку нескольких полупериодов сетевого напряжения с последующей паузой (Рис.4). Моменты коммутации симистора совпадают с моментами перехода сетевого напряжения через ноль, поэтому уровень радиопомех резко снижен. Применение микроконтроллера позволило использовать для равномерного распределения импульсов алгоритм Брезенхема. Однако наблюдается пониженная частота коммутации тока в нагрузке в сравнении с фазовым управлением. Предпочтителен для управления нагрузкой большой мощности (от 1 кВт). Была реализована программа, и также как и в фазовом методе по АЦП изменялось количество пропущенных полупериодов. Был выбран диапазон пропускание от каждой полуволны до пропускания одной полуволны к десяти. На рисунке 4 показаны изображения с осциллографа реализации регулятора методом Брезенхема. Рис.4. Регулировка мощности методом Брезенхема Заключение Регулятор универсален, что дает возможность применить его как в быту, так и в промышленности. Наличие микроконтроллерного управления позволяет быстро перенастроить систему, что обуславливает гибкость устройства. Два алгоритма управления позволят применять регулятор в широких диапазонах мощностей.