Алгоритм брезенхема в тиристорных регуляторах мощности. Информационный портал по безопасности. Технические характеристики контроллера электроплиты

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

На рис. 1 (A) показана последовательность импульсов на управляющем электроде тиристора для мощности в нагрузке 30%. Как видно, тиристор открыт в течение первых трех полупериодов, а в течение семи последующих - закрыт. Далее эта последовательность повторяется. Частота коммутации у такого регулятора для любой мощности, меньшей 100%, равна 1/10 частоты следования полупериодов. Гораздо логичнее было бы распределить полупериоды, в течение которых тиристор открыт, равномерно по всей последовательности. В общем случае задачу равномерного распределения любого числа импульсов N в последовательности длиной M (при N меньшем или равном M) решает алгоритм Брезенхема, который обычно используется в растровой графике для построения наклонных отрезков. Этот алгоритм реализуется с помощью целочисленной арифметики, что существенно упрощает его программирование. На рис. 1 (B) показана последовательность для той же мощности в 30%, но с применением алгоритма Брезенхема. В последнем случае частота коммутации в три раза выше. Нужно отметить, что выигрыш более заметен при малом шаге регулировки мощности. Например, в случае шага 1% для той же мощности в 30%, выигрыш составит 30 раз.


Рис.2. Схема регулятора мощности

Основой регулятора мощности (см. рис. 2) является микроконтроллер U1 типа AT89C2051 фирмы . Для питания схемы регулятора использован маломощный трансформатор T1, что вместе с применением оптотиристоров обеспечивает гальваническую развязку от сети. Это делает устройство более электробезопасным. Еще одним полезным свойством регулятора является то, что он может быть использован с нагрузками, рассчитанными на разное рабочее напряжение. Для этого достаточно подать на вход тиристоров требуемое напряжение с дополнительного трансформатора. Например, регулятор можно использовать для питания низковольтного паяльника. Необходимо только, чтобы напряжение и ток не превышали максимально допустимых для примененных тиристоров. Регулировка мощности в нагрузке осуществляется с помощью кнопок SB1 и SB2. Короткое нажатие одной из кнопок вызывает изменение мощности на один шаг. При удержании кнопки происходит монотонное изменение мощности. Одновременное нажатие двух кнопок выключает нагрузку, если до этого она была включена или включает максимальную мощность, если нагрузка была выключена. Для индикации мощности в нагрузке служат светодиодные семисегментные индикаторы HG1 - HG3. Для уменьшения количества элементов использована динамическая индикация, которая реализована программно. Встроенный в микроконтроллер аналоговый компаратор осуществляет привязку к сетевому напряжению. На его входы через ограничители R17, R18, VD1, VD2 поступает переменное напряжение с вторичной обмотки трансформатора питания. Роль ограничителя для отрицательной полярности выполняют диоды выпрямительного моста. Компаратор восстанавливает знак сетевого напряжения. Переключения компаратора происходят в моменты перехода сетевого напряжения через ноль. Выход компаратора опрашивается программно, и как только обнаруживается изменение его состояния, на выход управления тиристорами (порт микроконтроллера INT0) выдается управляющий уровень для включения тиристоров. Если текущий полупериод подлежит пропуску, то управляющий уровень не выдается. Затем на 4 мс включается индикатор HG3. В это время происходит проверка нажатия кнопок и, если нужно, изменяется значение текущей мощности. Затем снимается управляющее напряжение с тиристоров, и на 4 мс включаются индикаторы HG1 и HG2. После этого в течение 4 мс ожидается новое изменение состояния компаратора. Если изменения не происходит, система все равно начинает цикл, не привязавшись к сети. Только в этом случае тиристоры не открываются. Это сделано для того, чтобы индикация нормально работала даже без импульсов привязки к частоте сети.

Такой алгоритм работы, однако, накладывает некоторые ограничения на сетевую частоту: она должна иметь отклонение от 50 Гц не более 20%. На практике отклонение частоты сети значительно меньше. Сигнал с порта INT0 поступает на ключ, выполненный на транзисторах VT3 и VT4, который служит для управления светодиодами оптотиристоров. Когда активен сигнал RESET микроконтроллера, на порту присутствует уровень логической единицы. Поэтому в качестве активного уровня выбран ноль. Для коммутации нагрузки используются два оптотиристора, включенные встречно-параллельно. Светодиоды оптотиристоров соединены последовательно. Ток светодиодов задается резистором R16 и равен примерно 100 мА. Регулятор может работать в двух режимах с разным шагом регулировки мощности. Выбор режима работы производится перемычкой JP1. Состояние этой перемычки опрашивается сразу после сброса микроконтроллера. В режиме 1 шаг регулировки мощности составляет 1%. При этом на индикаторе отображаются цифры от 0 (0%) до 100 (100%). В режиме 2 шаг регулировки мощности составляет 10%. При этом на индикаторе отображаются цифры от 0 (0%) до 10 (100%). Выбор числа градаций 10 в режиме 2 обусловлен тем, что в некоторых случаях (например, управление электроплитой) не требуется малый шаг регулировки мощности. Если регулятор предполагается использовать только в режиме 2, то индикатор HG1 и резисторы R8, R9 можно не устанавливать. Вообще говоря, регулятор позволяет произвольно задать число градаций мощности для каждого из режимов. Для этого необходимо в код программы по адресу 0005H занести желаемое значение градаций для режима 1, а по адресу 000BH - для режима 2. Нужно только помнить, что максимальное число градаций в режиме 1 должно быть не более 127, а в режиме 2 - не более 99, поскольку в этом режиме индикация сотен невозможна.

При токе нагрузки до 2 А оптотиристоры можно использовать без радиаторов. При большем токе нагрузки оптотиристоры необходимо установить на теплоотводы площадью 50 - 80 см2. При использовании регулятора с напряжением менее 50 В оптотиристоры могут быть любого класса по напряжению. При работе с сетевым напряжением класс оптотиристоров должен быть не ниже 6. В качестве трансформатора питания можно применить любой маломощный трансформатор с напряжением вторичной обмотки 8 - 10 В (переменное) и допустимым током нагрузки не менее 200 мА. Диоды VD3 - VD6 можно заменить диодами КД208, КД209 или выпрямительным мостом КЦ405 с любой буквой. Микросхема стабилизатора U2 типа 7805 (отечественный аналог КР142ЕН5А, КР1180ЕН5) радиатора не требует. Транзисторы VT1 - VT3 - любые маломощные p-n-p. Транзистор VT4 можно заменить транзисторами КТ815, КТ817 с любой буквой. Диоды VD1, VD2 - любые кремниевые маломощные, например КД521, КД522. Кнопки SB1 и SB2 - любые малогабаритные без фиксации, например ПКН-159. Индикаторы HG1 - HG3 - любые семисегментные с общим анодом. Желательно только, чтобы они обладали достаточной яркостью свечения. Конденсаторы C3, C4, C6 - любые электролитические. Остальные конденсаторы - керамические. Резистор R16 - МЛТ-0,5, остальные - МЛТ-0,125. Еще удобнее применить SMD-резисторы, например, Р1-12. Микросхема U1 установлена на панельке. Если регулятор собран из исправных деталей, а микроконтроллер запрограммирован без ошибок, то регулятор в настройке не нуждается. Желательно только проверить правильность привязки к сетевой частоте. Для этого необходимо засинхронизировать осциллограф сетевым напряжением и убедиться, что импульсы сканирования дисплея (на выводах RXD и TXD микроконтроллера) синхронны с сетью и имеют удвоенную сетевую частоту. Если при подключении нагрузки из-за помех синхронность нарушается, необходимо между входами компаратора (выводы 12, 13 микроконтроллера) включить конденсатор емкостью 1 - 4,7 нф.

Вы можете загрузить программное обеспечение: в файле pwr100.bin (366 байт) находится прошивка ПЗУ, в файле pwr100.asm (7,106 байт) - исходный текст. Необходимые для трансляции с помощью TASM 2.76 библиотеки размещены в архиве lib.zip (2,575 байт).

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


Рис.3. Блок-схема устройства

Для работы в режиме автоматического регулирования используются два Брезенхемовских модулятора Бр. Мод. 1 и Бр. Мод. 2, которые реализованы программно. На вход модулятора Бр. Мод. 1 поступает код требуемой мощности, который задается с помощью кнопок управления. На выходе этого модулятора формируется импульсная последовательность, которая после фильтрации фильтром нижних частот ФНЧ 1 поступает на один из входов компаратора. На второй вход компаратора через фильтр нижних частот ФНЧ 2 поступает напряжение, снимаемое с нагрузки. С выхода компаратора однобитный сигнал ошибки поступает на вход микроконтроллера, где он подвергается цифровой фильтрации. Поскольку цифровой фильтр ЦФ работает синхронно с модуляторами, обеспечивается эффективное подавление пульсаций на частоте повторения выходных импульсных последовательностей и на гармониках этой частоты. С выхода цифрового фильтра 8-битный сигнал ошибки поступает на интегрирующий регулятор ИР. Для повышения точности интегрирующий регулятор работает в 16-разрядной сетке. Младшие 8 бит выходного кода регулятора поступают на вход модулятора Бр. Мод. 2, на выходе которого формируется импульсная последовательность, поступающая на управление тиристорами.

Принципиальная схема второго регулятора показана на рис. 4.


Рис.4. Принципиальная схема второго регулятора

Этот регулятор схемотехнически очень похож на описанный выше, поэтому имеет смысл остановиться только на его отличиях. Поскольку имеющихся портов ввода-вывода микроконтроллера оказалось недостаточно, пришлось отказаться от использования встроенного компаратора. В регуляторе применен сдвоенный компаратор U2 типа LM393. Первая половинка компаратора используется для привязки к сетевому напряжению. Из-за особенностей LM393 в схему привязки пришлось добавить резистор R27, который совместно с R14, R15 образует делитель напряжения, уменьшающий отрицательное напряжение на входах компаратора. Меандр сетевой частоты с выхода компаратора поступает на вход микроконтроллера INT0. Вторая половинка компаратора используется в петле обратной связи. Однобитный сигнал ошибки поступает на вход микроконтроллера T1. На входах компаратора установлены ФНЧ, образованные элементами R16, C7 и R17, C8. Сигнал с выхода модулятора (вывод T0 микроконтроллера) поступает на вход ФНЧ через делитель R18, R19. Делитель необходим по той причине, что компаратор не может работать с входными напряжениями, близкими к напряжению питания. После делителя импульсы имеют амплитуду около 3,5 В. Стабильность амплитуды определяется стабильностью напряжения питания +5 В, которое использовано в качестве опорного. Напряжение, снимаемое с нагрузки, поступает на вход другого ФНЧ также через делитель, образованный резисторами R20, R21. Этот делитель выбирается таким образом, чтобы при номинальном напряжении сети и мощности в нагрузке 100% напряжение на выходе ФНЧ составляло 3,5 В. Сигнал с выхода микроконтроллера INT1 через транзисторный ключ поступает на управление тиристорами. Оптотиристоры V1 и V2 вместе с диодной сборкой VD11 образуют управляемый выпрямитель, который и питает нагрузку.

Кнопки управления для экономии портов микроконтроллера включены по-другому. В цикле работы регулятора есть промежуток, когда индикаторы погашены. В это время оказалось возможным провести сканирование кнопок, используя линии данных индикаторов. Таким образом, три кнопки используют дополнительно только одну линию: это линия возврата P3.7. Третья кнопка понадобилась для управления режимом "AUTO". Сразу после включения регулятор находится в ручном режиме, т.е. функционально соответствует регулятору, описанному выше. Для включения режима автоматического регулирования необходимо нажать одновременно кнопки "AUTO" и "UP". При этом зажигается светодиод "AUTO". В таком режиме регулятор автоматически поддерживает установленную мощность. Если теперь нажать и удерживать кнопку "AUTO", то на индикаторах можно посмотреть текущее состояние регулятора (проценты выходной мощности, которые изменяются при колебаниях сетевого напряжения так, чтобы мощность оставалась неизменной). Если сетевое напряжение упало настолько, что поддерживать мощность нет возможности, то начинает мигать светодиод "AUTO". Выключить режим автоматического регулирования можно одновременным нажатием кнопок "AUTO" и "DOWN".

При токе нагрузки более 2 А оптотиристоры необходимо установить на теплоотвод. Основания оптотиристоров соединены с анодами, поэтому в данной схеме приборы можно монтировать на общем радиаторе, который соединен с общим проводом устройства. В качестве VD11 желательно применить сборку диодов Шоттки (или два отдельных диода Шоттки, например КД2998). В крайнем случае, можно применить обычные диоды, допускающие необходимый ток нагрузки. Хорошие результаты можно получить с КД2997, КД2999, КД213. Компаратор LM393 выпускает ПО "Интеграл" под обозначением IL393. Можно применить и два отдельных компаратора, например LM311 (он же КР554СА3). Вместо транзистора КП505А (производства з-да "Транзистор", г. Минск) можно применить биполярный транзистор КТ815, КТ817, добавив резистор 1 Ком последовательно в цепь коллектора VT3. К остальным деталям требования такие же, что и для регулятора, описанного выше. Для настройки регулятора необходимо к нему подключить нагрузку и подать номинальное сетевое напряжение (например, с помощью ЛАТРа). Затем нужно установить максимальную мощность (100%). Подстроечным резистором R21 необходимо добиться разницы напряжений на входах 5 и 6 компаратора U2B, близкой к нулю. После этого нужно уменьшить мощность до 90% и включить режим "AUTO". Подстройкой R21 необходимо добиться совпадения (с точностью ±1 единица) установленной мощности и показаний индикаторов в режиме контроля состояния регулятора (при нажатой кнопке "AUTO").

Вы можете загрузить программное обеспечение: в файле pwr100a.bin (554 байт) находится прошивка ПЗУ, в файле pwr100a.asm (10,083 байт) - исходный текст. Необходимые для трансляции с помощью TASM 2.76 библиотеки размещены в архиве lib.zip (2,575 байт).

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

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Вариант 1.
U1 МК AVR 8-бит

AT89C2051

1 В блокнот
U3 Линейный регулятор

LM7805

1 В блокнот
VT1-VT3 Биполярный транзистор

КТ3107В

3 В блокнот
VT4 Биполярный транзистор

КТ972А

1 В блокнот
V1, V2 Оптронный тиристор ТО125-12.5-6 2 В блокнот
VD1, VD2 Выпрямительный диод

1N4148

2 В блокнот
VD3-VD6 Выпрямительный диод

FR157

4 В блокнот
С1, С2 Конденсатор 33 пФ 2 В блокнот
С3 1 мкФ 1 В блокнот
С4 Электролитический конденсатор 33 мкФ 1 В блокнот
С5 Конденсатор 0.1 мкФ 1 В блокнот
С6 Электролитический конденсатор 1000 мкФ 25 В 1 В блокнот
R1-R9 Резистор

200 Ом

9 В блокнот
R10, R11 Резистор

4.7 кОм

2 В блокнот
R12-R15, R17, R18 Резистор

10 кОм

6 В блокнот
R16 Резистор

51 Ом

1 0.5 Вт В блокнот
ZQ1 Кварцевый резонатор 12 МГц 1 В блокнот
SB1, SB2 Кнопка 2 В блокнот
JP1 Джампер 1 В блокнот
HG1-HG3 Светодиодный индикатор ELC3614 3 В блокнот
Т1 Трансформатор 5 Вт 9-12 Вольт 1 В блокнот
S1 Выключатель 1 В блокнот
FU1 Предохранитель 0.315 А 1 В блокнот
Вариант 2.
U1 МК AVR 8-бит

AT89C2051

1 В блокнот
U2 Компаратор

LM393

1 В блокнот
U3 Линейный регулятор

LM7805

1 В блокнот
VT1-VT3 Биполярный транзистор

КТ3107В

3 В блокнот
VT4 Транзистор КП505А 1 В блокнот
V1, V2 Оптронный тиристор ТО125-12.5-6 2 В блокнот
VD1-VD5 Выпрямительный диод

1N4148

5 В блокнот
VD6 Светодиод 1 В блокнот
VD7-VD10 Выпрямительный диод

FR157

4 В блокнот
VD11 Диод Шоттки

MBR3045CT

1 В блокнот
С1, С2 Конденсатор 33 пФ 2

Регулятор мощности для паяльника.

Данный регулятор позволяет регулировать мощность на нагрузке двумя способами.

  1. Фазоимпульсным - изменение угла открытия симистора.
  2. По пропуску нужного кол-ва полупериодов.

Для второго способа распределение импульсов находится по алгоритму Брезенхема, исходный код данного решения я полностью взял из статей и постов на форумах уважаемого Ридико Леонида Ивановича , большое ему спасибо!

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

  1. SET – при удержании более 2сек вход в режим настроек, при кратковременном нажатии листание трех быстрых уставок мощности.
  2. Минус.
  3. Плюс.

Регулятор позволяет хранить 3 быстрые настройки мощности. Есть функция авто выключения, если в течении 30 минут не было нажатий на кнопки, индикатор начинает мигать, далее, через 10 минут произойдет выключение нагрузки.

Блок схема управления в режиме настроек.

При нажатии SET с удержанием более 2сек на экран выводится надпись РЕГ, далее кнопками плюс/минус выбирается нужный алгоритм

  • PAU - алгоритм Брезенхема.
  • FI – фазоимпульсный.
Если выбран алгоритм FI
ЧИС – регулировка от 0..145. То есть полупериод разбит на 145 значений. ПРЦ – регулирование от 0 до 100%, то есть идет автоматический пересчет шкалы 145 в проценты Далее идут три быстрых уставки мощности “-1-” ”-2- ” ”-3-”.
INC – шаг на который будет увеличиваться/уменьшаться мощность кнопками плюс/минус.
_t_ - управление функцией авто-выключения ON-включено, OFF-выключено.

Как видно из блок-схемы быстрые устваки мощности для режимов PAU и FI(ПРЦ) используются одни и те же, так как их диапазон 0..100. Для FI(ЧИС) свои уставки, так как их диапазон 0..145.

Доступно быстрое включение регулятора на полную мощность нажатием двух кнопок SET+ПЛЮС (кнопку SET следует нажимать немного ранее), при этом на экран выведется надпись “on”. Быстрое выключение по нажатию SET+МИНУС, при этом на экран выведется надпись “OFF”.

Диагностические сообщения.

  • noC – нет синхроимпульсов, при этом запрещается подача управляющих импульсов на симистор.
  • EEP – ошибка данных в EEPROM, лечится заходом в режим настроек, после редактирования параметров надпись пропадает.

В железе.



Введение На производстве (в системах автоматизированного управления), в быту зачастую необходимо использовать регулировку мощности, подаваемую на нагрузку. Как правило, нагрузка работает от сети переменного тока. Поэтому задача несколько усложняется, в сравнении с регулировкой мощности нагрузки, работающей на постоянном напряжении. В случае работы нагрузки на постоянном напряжении применяют широтноимпульсную модуляцию (ШИМ), и изменяя скважность соответственно изменяется и мощность, подаваемая на нагрузку. Если использовать управление с помощью ШИМ для регулировки мощности в сети переменного тока, ключ через который регулируем сигнал (например, симистор) будет открываться и пропускать в нагрузку части синусоиды, имеющие разную мощность. Элементная база и сборка регулятора Рис.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. Регулировка мощности методом Брезенхема Заключение Регулятор универсален, что дает возможность применить его как в быту, так и в промышленности. Наличие микроконтроллерного управления позволяет быстро перенастроить систему, что обуславливает гибкость устройства. Два алгоритма управления позволят применять регулятор в широких диапазонах мощностей.

Мы научились выводить на 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)

Алгоритм Брезенхема является одним из старейших алгоритмов в машинной графике. Казалось бы, как можно применить алгоритм построения растровых прямых при создании домашней паяльной печи? Оказывается, можно, причем с очень достойным результатом. Забегая вперед, скажу, что данный алгоритм очень хорошо скармливается маломощному 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). Даже если МК будет просто дергать ногой по таймеру, открывая оптопару, ошибка будет не критичной.

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

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то