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


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

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


  1. MichaelBorisov
    02.04.2015 13:39
    +9

    Хорошая идея.

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

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

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


    1. oWart Автор
      02.04.2015 13:49
      +2

      Спасибо за объективный комментарий. Перефразировал предложение про помехи.


      1. MichaelBorisov
        02.04.2015 14:01
        +3

        Вообще ваша идея мне очень нравится. Область ее применения простирается за пределы описанного вами. Ваш метод позволяет оптимизировать спектр выходных помех, смещая их в более высокочастотную область, и тогда их легче отфильтровать. Я думаю, что производителям МК следовало бы встроить аппаратную поддержку этого метода вместо или в дополнение к модулям ШИМ, которые есть в практически любом МК.


    1. Alexeyslav
      02.04.2015 14:13
      +5

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


      1. MichaelBorisov
        02.04.2015 14:24

        Да, вы правы. Тут уж я ошибся.


  1. emusic
    02.04.2015 17:13
    +2

    Для таких инертных устройств, как нагреватель печи, нет особого смысла в точности отсечения на уровне полупериода. Вполне достаточно отсекать пакеты из N полных периодов за время, соответствующее M периодам. При M=1с точность будет на уровне 2%, при M=2с = 1%. У меня так регулятор паяльника работает. :)


    1. oWart Автор
      02.04.2015 17:22
      +2

      Суть алгоритма от этого не меняется. Работать можно что с полупериодом, что с полным. Просто симистор отключается на полупериоде, вот и все.


      1. emusic
        02.04.2015 17:34

        Пардон, не по той кнопке попал, а удалить комментарий нельзя. :(


    1. igor_suhorukov
      02.04.2015 19:13

      А у вас есть детектор перехода через ноль? Если использовать MOC3063 с встроенным ZC и не снять импульс в момент перехода через 0, то оптосемистор будет все равно открыт до следующего перехода через 0


    1. barabanus
      03.04.2015 00:34

      Почему «нет особого смысла в точности отсечения на уровне полупериода»? Для вашего паяльника, может, и не нужна такая точность, а для других задач — бесплатная точность в два раза выше, бери и пользуйся. В вашем примере при М=1с точность будет на уровне 1%, при М=2с = 0.5%


      1. emusic
        03.04.2015 05:50

        Смысла нет не в самом увеличении точности, как таковом, а в ее увеличении «быстрыми» методами вроде модуляции на уровне полупериода. Нагреватель, что в паяльнике, что в печи — элемент очень инертный, ему периода даже в несколько секунд достаточно. А точность здесь получается не бесплатной — более «тонкие» вычисления, более частые прерывания. Тупое увеличение периода регулирования выходит дешевле.


  1. emusic
    02.04.2015 17:32

    Я к тому, что алгоритм Брезенхема сложнее в реализации. Но красивее, да. :)


    1. oWart Автор
      02.04.2015 18:53

      Не видя Вашего алгоритма, не соглашусь. Данный алгоритм сводится к одному циклу с целочисленным сложением и подергиванием ногой в нужные моменты времени для открытия оптопары.


      1. emusic
        02.04.2015 19:54

        Алгоритм там примитивный до крайности. :) Упомянутый регулятор для паяльника — аналоговый, я его делал лет 25 назад, там мультивибратор с регулируемой скважностью, отмеряющий нужное количество периодов/полупериодов (в зависимости от работы на переменном или пульсирующем токе) и детектор перехода через нуль, чтобы включать/выключать ключ только в моменты переходов.

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

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


  1. igor_suhorukov
    02.04.2015 19:21
    +1

    emusic прав про управление ТЭН!

    Алгоритмом брезенхема последний раз на asm под DOS линию рисовал в универе. Необычное применение у вас)
    Про регулирование мощности, понятно, но вопрос к oWart какой алгоритм для управления печью вы используете: ПИД, ПД или ПИ?


    1. oWart Автор
      02.04.2015 19:32

      Печь грубо говоря еще в проекте. В идеале буду городить ПИД, но возможно дифф составляющую не осилю :)


      1. igor_suhorukov
        03.04.2015 00:00
        +1

        Как-то я уже спрашивал здесь про то кто как паяет smd детали olartamonov давал ссылку на свою печь, со схемой и прошивкой


      1. Int_13h
        03.04.2015 11:15

        А Д для нагревателей и не требуется.


        1. Alexeyslav
          03.04.2015 11:36

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


          1. emusic
            03.04.2015 19:33
            +2

            Только если на жале есть датчик температуры, хорошо отражающий температуру в зоне пайки. Датчики вроде тех, что стоят в нагревателях паяльников китайских станций (типичный представитель — Lukey 852D/D+), зачастую даже не имеющие хорошего контакта с жалом, никакой дифференциальный анализ не спасет. :) По слухам, паяльники, не перегревающиеся на холостом ходу, но за секунды реагирующие на быстрый отбор тепла, получаются только на эффекте Кюри, но там отдельное жало под каждую рабочую температуру. :(


          1. buratino
            07.04.2015 13:40

            Даже без непредсказуемого отбора.
            Особенно для случаев, когда есть задержка между нагревом и моментом, когда нагрев доходит до нагреваемого объекта (типа гистерезиса). Например — печка с вентилятором нагревает воздух, воздух нагревает емкость с жидкостью. Без Д получаются классические колебания с периодом в несколько минут.


  1. VDG
    02.04.2015 22:00

    1. igor_suhorukov
      02.04.2015 23:54

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


      1. VDG
        04.04.2015 00:36

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


        1. igor_suhorukov
          04.04.2015 10:31

          Возвращаясь к вашей ссылке про коммутацию с пропуском периодов. Вы сравниваете теплое с мягким!
          Если комутировать нагрузку в момент перехода напряжения через 0 и только периодами(рис. в), то помехи и воздействие на питающую электро сеть минимальные. Управление реактивной нагрузкой, к которой относится ТЭН — простое!

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

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

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

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



          Картинка в. — это ШИМ метод управления


          1. Alexeyslav
            04.04.2015 21:02

            Помехи-то в сеть такой метод даёт минимальные, но он не устраняет проблему моргания освещения. Ведь ТЭН даёт нагрузку на сеть, соответственно просаживается напряжение в сети когда он включается. даже если коммутировать целыми полупериодами слишком частая коммутация приводит к заметным колебаниям яркости освещения. Да даже и редкая — момент перехода между состояниями четко прослеживается по освещению.
            И чем хуже проводка на объекте, тем заметней эффект.


            1. igor_suhorukov
              04.04.2015 21:37

              Ну да, предполагаем что проводка нормальная, что это не деревенская линия где в трехфазной сети оборвало нулевой провод и напряжения в фазе гуляет в зависимости от нагрузок в других фазах
              Эх, классный предмет был в универе ТОЭ!)))


              1. Alexeyslav
                04.04.2015 22:45

                А нормальная проводка это какая? по 10мм толщины медного провода на киловатт нагрузки? даже 4кВт электрокотёл в доме рассчитанном на 20кВт электроплиту заметно влияет на яркость освещения.
                Правда, проблему замечать со временем будет сложнее и сложнее ибо светодиодные лампочки имеют какой-никакой а стабилизатор.


                1. igor_suhorukov
                  05.04.2015 00:11

                  У соседей свет мерцает при включении вашего электрокотла?
                  — Если нет, то подключите электрокотел отдельными проводами к щитку, добавьте УЗИП на основную линию с освещением.
                  В проводке есть старые скрутки с окислившимися и подгоревшими контактами? Или есть скрутка меди с алюминием или в клемниках раскрутились винты?
                  — Если да, то дело точно не в сечении и расчетной мощности!

                  И обязательно обратитесь к специалистам-электрикам! Самолечение может быть опасным)))


                  1. Alexeyslav
                    05.04.2015 00:29

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


                  1. emusic
                    05.04.2015 05:51

                    Ну вот у нас в деревенском доме стоит электрокотел на 9 кВт, которым отапливались, пока не подвели газ. Подключение к сети трехфазное, провода 25 мм2, в щитке провода 6 мм2, от щитка к котлу идет отдельный трехфазный кабель с проводами 6 мм2. Все провода по ГОСТ (у ТУшных сечение даже на вид меньше), металл жил чистый, светлый, мягкий. В котле три ТЭНа по 3 кВт (я пробовал разные блоки, рассчитанные и на включение треугольником, и на включение звездой). Все равно лампочки накаливания заметно пригасали, когда котел включался, и наоборот. :) Так было с самого начала, окисляться было нечему. :)


  1. mkarev
    03.04.2015 19:26
    +1

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

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


    1. emusic
      03.04.2015 19:44

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


      1. mkarev
        03.04.2015 20:01

        Главное, чтобы сферические сельские радиолюбители в какууме не стали проектировать на этом принципе регуляторы мощности для электродуховок и включать их в моменты пикового электропотребления.


        1. emusic
          03.04.2015 20:05

          Это безусловно. А так-то однополупериодных выпрямителей в маломощных бытовых устройствах до черта, и в советские времена их там хватало.


          1. mkarev
            03.04.2015 20:15

            Да, есть такое. Я просто хотел обратить внимание на эту проблему, т.к. в статье описан способ управления силовой нагрузкой.


  1. gleb_l
    22.04.2015 00:39

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