Алгоритм Брезенхема є одним з найстаріших алгоритмів у машинній графіці. Здавалося б, як можна застосувати алгоритм побудови растрових прямих при створенні домашньої паяльної печі? Виявляється, можна, причому з дуже гідним результатом. Забігаючи вперед, скажу, що даний алгоритм дуже добре згодовується малопотужному 8-бітному мікроконтролеру. Але про все по порядку.
Алгоритм Брезенхе ́ ма - це алгоритм, який визначає, які точки заданого растру потрібно зафарбувати, щоб отримати близьке наближення прямої лінії між двома заданими точками. Суть алгоритму полягає в тому, щоб для кожного стовпчика X (див. малюнок) визначити, який рядок Y ближче всього до лінії, і намалювати точку.
Тепер подивимося, як подібний алгоритм допоможе нам при управлінні ТЕНами в електропечі.
ТЕН харчується від мережевого напруження 220B/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). Навіть якщо МК буде просто смикати ногою по таймеру, відкриваючи оптопару, помилка буде не критичною.