Инженер-конструктор
0,0
рейтинг
2 апреля 2015 в 12:05

Разработка → Алгоритм Брезенхема в паяльной печи — теория

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


Продолжение следует.
Анатолий @oWart
карма
75,0
рейтинг 0,0
Инженер-конструктор
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (37)

  • +9
    Хорошая идея.

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

    Вот если бы ваша схема измеряла не напряжение, а ток нагрузки, и коммутировала бы ее в момент прохода через ноль тока — тогда помех было бы меньше. Но все равно не ноль. Спектральная плотность мощности напряжения и тока в простой резистивной нагрузке в основном сосредоточена на частоте 50Гц и ее гармониках, а если вы посчитаете спектр практически случайных полупериодов, которые вы пропускаете на выход — то этот спектр будет более сложным, там появятся разные частоты. И тут главное — снизить помехи в области радиочастот.

    Ну, а если бы ваша схема измеряла и напряжение, и ток — то микроконтроллер мог бы перемножить эти величины и получить мощность. Таким образом можно было бы более точно управлять именно мощностью ТЭНа, чтобы она была максимально близка к желаемой. Хотя, поскольку у вас схема с обратной связью по температуре — то мощность как таковая не имеет большого значения, а имеет значение лишь разность заданной и фактической температур.
    • +2
      Спасибо за объективный комментарий. Перефразировал предложение про помехи.
      • +3
        Вообще ваша идея мне очень нравится. Область ее применения простирается за пределы описанного вами. Ваш метод позволяет оптимизировать спектр выходных помех, смещая их в более высокочастотную область, и тогда их легче отфильтровать. Я думаю, что производителям МК следовало бы встроить аппаратную поддержку этого метода вместо или в дополнение к модулям ШИМ, которые есть в практически любом МК.
    • +5
      Симистор сам закроется когда уменьшится ток в нагрузке. А перед включением нагрузки в цепи изначально нет тока и взяться там ему неоткуда, а если он есть — значит симистор и так уже открыт.
      Нет необходимости его отслеживать.
      • 0
        Да, вы правы. Тут уж я ошибся.
  • +2
    Для таких инертных устройств, как нагреватель печи, нет особого смысла в точности отсечения на уровне полупериода. Вполне достаточно отсекать пакеты из N полных периодов за время, соответствующее M периодам. При M=1с точность будет на уровне 2%, при M=2с = 1%. У меня так регулятор паяльника работает. :)
    • +2
      Суть алгоритма от этого не меняется. Работать можно что с полупериодом, что с полным. Просто симистор отключается на полупериоде, вот и все.
      • 0
        Пардон, не по той кнопке попал, а удалить комментарий нельзя. :(
    • 0
      А у вас есть детектор перехода через ноль? Если использовать MOC3063 с встроенным ZC и не снять импульс в момент перехода через 0, то оптосемистор будет все равно открыт до следующего перехода через 0
    • 0
      Почему «нет особого смысла в точности отсечения на уровне полупериода»? Для вашего паяльника, может, и не нужна такая точность, а для других задач — бесплатная точность в два раза выше, бери и пользуйся. В вашем примере при М=1с точность будет на уровне 1%, при М=2с = 0.5%
      • 0
        Смысла нет не в самом увеличении точности, как таковом, а в ее увеличении «быстрыми» методами вроде модуляции на уровне полупериода. Нагреватель, что в паяльнике, что в печи — элемент очень инертный, ему периода даже в несколько секунд достаточно. А точность здесь получается не бесплатной — более «тонкие» вычисления, более частые прерывания. Тупое увеличение периода регулирования выходит дешевле.
  • 0
    Я к тому, что алгоритм Брезенхема сложнее в реализации. Но красивее, да. :)
    • 0
      Не видя Вашего алгоритма, не соглашусь. Данный алгоритм сводится к одному циклу с целочисленным сложением и подергиванием ногой в нужные моменты времени для открытия оптопары.
      • 0
        Алгоритм там примитивный до крайности. :) Упомянутый регулятор для паяльника — аналоговый, я его делал лет 25 назад, там мультивибратор с регулируемой скважностью, отмеряющий нужное количество периодов/полупериодов (в зависимости от работы на переменном или пульсирующем токе) и детектор перехода через нуль, чтобы включать/выключать ключ только в моменты переходов.

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

        Ваш «следящий» алгоритм больше подходит для высокочастотного управления (например, яркостью светодиода). По сути, на том же принципе работают однобитовые ЦАПы.
  • +1
    emusic прав про управление ТЭН!

    Алгоритмом брезенхема последний раз на asm под DOS линию рисовал в универе. Необычное применение у вас)
    Про регулирование мощности, понятно, но вопрос к oWart какой алгоритм для управления печью вы используете: ПИД, ПД или ПИ?
    • 0
      Печь грубо говоря еще в проекте. В идеале буду городить ПИД, но возможно дифф составляющую не осилю :)
      • +1
        Как-то я уже спрашивал здесь про то кто как паяет smd детали olartamonov давал ссылку на свою печь, со схемой и прошивкой
      • 0
        А Д для нагревателей и не требуется.
        • 0
          Требуется еще даже сильней чем обычно. Дифф.составляющая позволяет отрабатывать непредсказуемые отборы тепла от нагревателя. Для стационарой теплоизолированной печки может это и не актуально, но нагреватель паяльника без дифф.составляющей был бы довольно тормознутым и бесконечные переходные процессы…
          • +2
            Только если на жале есть датчик температуры, хорошо отражающий температуру в зоне пайки. Датчики вроде тех, что стоят в нагревателях паяльников китайских станций (типичный представитель — Lukey 852D/D+), зачастую даже не имеющие хорошего контакта с жалом, никакой дифференциальный анализ не спасет. :) По слухам, паяльники, не перегревающиеся на холостом ходу, но за секунды реагирующие на быстрый отбор тепла, получаются только на эффекте Кюри, но там отдельное жало под каждую рабочую температуру. :(
          • 0
            Даже без непредсказуемого отбора.
            Особенно для случаев, когда есть задержка между нагревом и моментом, когда нагрев доходит до нагреваемого объекта (типа гистерезиса). Например — печка с вентилятором нагревает воздух, воздух нагревает емкость с жидкостью. Без Д получаются классические колебания с периодом в несколько минут.
  • 0
    • 0
      Дык это же управление ТЭН, а не лампой или электродвигателем.
      Двигатель так тот вообще момент теряет. Для таких задач используют частотный преобразователь
      • 0
        Вот именно — ТЭН, а не лампочка. Никогда не видели как мигает освещение, когда коммутируется ТЭН?
        • 0
          Возвращаясь к вашей ссылке про коммутацию с пропуском периодов. Вы сравниваете теплое с мягким!
          Если комутировать нагрузку в момент перехода напряжения через 0 и только периодами(рис. в), то помехи и воздействие на питающую электро сеть минимальные. Управление реактивной нагрузкой, к которой относится ТЭН — простое!

          Никогда не видели как мигает освещение, когда коммутируется ТЭН?

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

          При коммутацией с пропуском периодов, поскольку частота в электросети 50Гц, в случае электролампы — сильное мерцание излучаемого ей света. В случае фазового управления(рис. а), которое применяется при обычном диммировании ламп накаливания, мерцание не заметно, так как пропускается не весь период целиком, а часть полупериода. Для люминисцентных ламп вообще не применимо димирование ни фазным методом управления, ни пропуском периодов.

          В случае управления электродвигателем пропуск периодов ведет к движению вала рывкам и меньшему сроку службы, фазное управление применимо, но наблюдается сильная потеря момента при уменьшении оборотов(так регулируется скорость в китайских граверах и фрезерах по дереву). Поэтому для управления электроприводом для серьезных дядь в промышленности используют частотный преобразователь, в котором выпрямляется питающее напряжение и с помощью силовых ключей(MOSFET или IGBT) инвертора коммутируется сигналом из блока управления в напряжение нужной частоты и амплитуды на выходе преобразователя.



          Картинка в. — это ШИМ метод управления
          • 0
            Помехи-то в сеть такой метод даёт минимальные, но он не устраняет проблему моргания освещения. Ведь ТЭН даёт нагрузку на сеть, соответственно просаживается напряжение в сети когда он включается. даже если коммутировать целыми полупериодами слишком частая коммутация приводит к заметным колебаниям яркости освещения. Да даже и редкая — момент перехода между состояниями четко прослеживается по освещению.
            И чем хуже проводка на объекте, тем заметней эффект.
            • 0
              Ну да, предполагаем что проводка нормальная, что это не деревенская линия где в трехфазной сети оборвало нулевой провод и напряжения в фазе гуляет в зависимости от нагрузок в других фазах
              Эх, классный предмет был в универе ТОЭ!)))
              • 0
                А нормальная проводка это какая? по 10мм толщины медного провода на киловатт нагрузки? даже 4кВт электрокотёл в доме рассчитанном на 20кВт электроплиту заметно влияет на яркость освещения.
                Правда, проблему замечать со временем будет сложнее и сложнее ибо светодиодные лампочки имеют какой-никакой а стабилизатор.
                • 0
                  У соседей свет мерцает при включении вашего электрокотла?
                  — Если нет, то подключите электрокотел отдельными проводами к щитку, добавьте УЗИП на основную линию с освещением.
                  В проводке есть старые скрутки с окислившимися и подгоревшими контактами? Или есть скрутка меди с алюминием или в клемниках раскрутились винты?
                  — Если да, то дело точно не в сечении и расчетной мощности!

                  И обязательно обратитесь к специалистам-электрикам! Самолечение может быть опасным)))
                  • 0
                    Котел и так запитан отдельной линией от щитка. Но это не панацея. Провода имеют сопротивление, избавится от просадки напряжения не получится. Можно увеличивать сечение провода, но это экономически будет нецелесообразно заменить всю линию от дома до подстанции.
                  • 0
                    Ну вот у нас в деревенском доме стоит электрокотел на 9 кВт, которым отапливались, пока не подвели газ. Подключение к сети трехфазное, провода 25 мм2, в щитке провода 6 мм2, от щитка к котлу идет отдельный трехфазный кабель с проводами 6 мм2. Все провода по ГОСТ (у ТУшных сечение даже на вид меньше), металл жил чистый, светлый, мягкий. В котле три ТЭНа по 3 кВт (я пробовал разные блоки, рассчитанные и на включение треугольником, и на включение звездой). Все равно лампочки накаливания заметно пригасали, когда котел включался, и наоборот. :) Так было с самого начала, окисляться было нечему. :)
  • +1
    Что будет если подать на вход ТЭНа только положительную полуволну сетевого напряжения? Правильно, мы получим 50% выходной мощности нагрева.

    Все так, а ещё Вы будете подмагничивать постоянным током сердечник силового трансформатора на электроподстанции, смещая рабочую облась петли гистерезиса и сокращая тем самым максимально допустимую мощность силового трасформатора. Следите, чтобы среднее значение, потребляемого Вашим алгоритмом тока, было равно нулю.
    • 0
      Это может иметь значение либо для мощностей хотя бы в десятки киловатт на маломощный трансформатор типа сельского, либо для согласованного между множеством потребителей смещения «точки равновесия». При нынешнем бардаке с поведением нагрузок единицы «перекошенных» киловатт даже при единственном потребителе погоды не сделают, а при массовом потреблении они компенсируются другими перекосами, которые с точки зрения трансформатора практически случайны.
      • 0
        Главное, чтобы сферические сельские радиолюбители в какууме не стали проектировать на этом принципе регуляторы мощности для электродуховок и включать их в моменты пикового электропотребления.
        • 0
          Это безусловно. А так-то однополупериодных выпрямителей в маломощных бытовых устройствах до черта, и в советские времена их там хватало.
          • 0
            Да, есть такое. Я просто хотел обратить внимание на эту проблему, т.к. в статье описан способ управления силовой нагрузкой.
  • 0
    ЕМНИП данный принцип (регулирование мощности коммутацией полупериодов целиком) был описан в аппаратном регуляторе у Шевкопляса в Микропроцессорных структурах — там решалась задача наилучшей равномерности распределения полупериодов по оси времени для заданного среднего уровня мощности — кстати, с учетом бесконечности временной оси (то есть для нарисованных графиков — закольцованности начала и конца линий). Навскидку — вроде бы с использованием детектора нуля, ПЗУ (в нем была зашита карта оптимального расположения полупериодов) и сдвигового регистра и/или счетчика. Чему был отдан приоритет — минимизации DC в бесконечном временном промежутке или временной равномерности — не помню, да и в общем, это несущественно — алгоритм в табличной форме все равно шился в ПЗУ. А вот насчет Брезенхама в целочисленном поле вместо табличной функции — идея классная, нужно только оценить а) насколько длиннее алгоритм чем битовая маска для приемлемой на практике точности (скажем, шага в 5%) и б) всегда ли он дает равномерность при закольцованном времени, или требуется его модификация, чтобы гладко сшить начало с концом

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.