Фазоимпульсное управление силовым симистором.

Многие конструкции подразумевают управление мощной нагрузкой. В статье, к примеру,  микроконтроллер управлял нагревом паяльника. Но там паяльник запитывается постоянным током, и, поэтому вся регулировка сводится к формированию Ш?М-а на силовом транзисторе. Если же нужно регулировать мощную нагрузку в цепи переменного тока, то реализация сего выйдет немного посложней. Вот эту проблему мы сейчас и рассмотрим. Пару слов теории… Управлять отдаваемой в нагрузку мощностью можно просто регулируя количество периодов/полупериодов сетевого тока через эту нагрузку. Можно просто включать/выключать ток через нагрузку с определённым соотношением, что по сути тот же метод, что и указанный выше. Эти методы регулировки подойдут для сильно инерционных нагрузок (ТЭНы, нагреватели и пр.). Для регулировки, допустим, яркости свечения лампы накаливания такие методы не подойдут по причине заметного и утомительного для глаз мерцания. Поэтому для построения диммеров (устройств регулировки яркости) применяют фазоимпульсный метод управления. Суть его проста. Рассматриваем положительную волну синусоиды. В определённый момент времени tз, который отсчитывается от перехода синусоиды через «ноль» t01,  на симистор подаётся открывающий импульс. Симистор остаётся открытым и пропускает в нагрузку ток до момента следующего перехода сетевой синусоиды через «ноль» t10. Очевидно, что чем ближе tз  к t01, и, соответственно дальше от t10, тем большая часть полуволны тока будет отдана в нагрузку.  ?, наоборот, чем дальше от t01 и ближе к t10, чем меньше тока пройдёт через нагрузку. Для отрицательной полуволны синусоиды всё то же самое, только t01 и t10 меняются местами (отсчёт ведётся от t10) . Для определения моментов перехода сетевой синусоиды через «ноль» , т.е. для определения моментов времени t01 и t10, служит устройство называемое детектором нуля или Zero Cross по буржуйски.
?з микроконтроллерного конструктора я возьму блок с  ATmega8A и периферийный блочок с установленным на нём симистором, схемой детектора нуля и соответствующим обвесом. Нагрузкой послужит обычная лампа накаливания 40 Вт.

Основным критерием проектирования узлов я считаю простоту — это определяет надёжность и повторяемость. Не забудем также и о безопасности — для этого я сделал опторазвязку, чтобы не было гальванической связи микроконтроллера с сетью. Слева по схеме — детектор нуля, цепь Zero Cross. Конструктивно она представляет собой параметрический стабилизатор (R1,VD1) который «обрезает» положительную полуволну синусоиды на уровне напряжения стабилизации стабилитрона, в нашем случае около 6,8 В. Резистор R2 ограничивает ток светодиода оптопары U1. Контакт 4 SV1 (коллектор транзистора той же оптопары ) подключается к выводу микроконтроллера, который определён входом с pull-up резистором — т.е. питает этот транзистор. Контакт 3 Sv1 (эмиттер транзистора) подключается к минусу питания, т.е. к «земле». В момент нарастающего фронта импульса Zero Cross t01 зажигающийся светодиод открывает транзистор оптопары, и вход микроконтроллера оказывается подключенным к «земле» через этот транзистор. Соответственно при ниспадающем фронте Zero Cross t10 светодиод гаснет, транзистор закрывается, и вход микроконтроллера «подтягивается» к напряжению питания pull-up резистором. Конечно, фронты Zero Cross немного не совпадают с истинным переходом через ноль сетевого напряжения. Но эта погрешность не критична — единицы микросекунд. Справа по схеме — цепь управления силовым симистором через оптосимистор, взята из даташита и особенностей не имеет.
Соединяем всё проводами, т.е. подготавливаем макет устройства. Не забудем о развязывающем трансформаторе (на время опытов), а то можно осциллограф сжечь)))
Устанавливать мощность отдаваемую в нагрузку симистором,  можно дистанционно, используя любой имеющийся интерфейс, или с помощью органов ручного управления: — энкодера (пример его подключения в этом посте); — переменного резистора, включив его потенциометром, и заведя сигнал с ползунка на какой-либо вход АЦП; — двух кнопок, что проще всего. ?менно под вариант с кнопками я написал код. Как и обычно, исходник подробно прокомментирован, поэтому тратить Ваше внимание на его разбор я не буду. Ну и для понятности приведу осциллограммы работы узлов диммера.
Жёлтая осциллограмма — это Zero Cross. Ниспадающий фронт t01, а нарастающий t10. Синяя осциллограмма — открывающие импульсы симистора Triac Control в момент времени .

На этой осциллограмме показан ток через нагрузку при условиях показанных осциллограммой выше, т.е. t01 — tз = 2,5 мс.

Здесь уже t01 — tз = 7,5 мс.

??, соответственно ток через нагрузку такой.

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

Запись опубликована в рубрике Микроконтроллерный конструктор с метками , . Добавьте в закладки постоянную ссылку.

104 комментария на «Фазоимпульсное управление силовым симистором.»

  1. clawham говорит:

    Стоило бы добавить тот факт что симисторы работающие в фазоимпульсном режиме на мощную нагрузку ( > 200 ватт) создают шумы в радиочастотах средних и длинных волн а так же очень сильно портят синусоиду сети изза чего трансформаторы гудят и греются а провода — свистят или стрекотят…

    во избежание этих всех «прелестей» нужно использовать алгоритм брезенхема для регулирования мощности инерционных видов мощной нагрузки…..суть метода в открывании симистора на весь период синусоиды единоразово а потом 99 периодов — держать закрытым — результат 1% мощности….лампочка будет «вспыхивать» каждые две секунды ели-красным накалом, мотор будет получать лёгкий толчек а тен будет немного теплым
    при мощности скажем в 50% каждый четный полный период симистор будет открываться а каждяй нечетный — закрыт — лампочка будет моргать как через диод мотор будет крутиться как на 120 вольтах а тен будет работать в пол накала…
    при этом ввиду включения симистора в моменты перехода через ноль — исключены все шумы и помехи и вообще какие-либо влияния на питающую цепь
    я «игрался» с нагревателями кушающими 60 ампер тока и метод брезенхема — получил неоспоримое лидерство по всем параметрам….ни какие устройства вообще не замечали наличия такого мощного потребителя который включался эпизодически…при фазоимпульсном режиме даже лампочки свистели и трещали с частотой 100 герц…
    потому вывод…удел фазоимпульсников это схема
    http://shemki.ru/images/articles/359-01.jpg такого рода где ключ — это двунаправленный динистор….тогда схема получается проще некуда работает от нуля до 99%(если подобрать сопротивление переменника и ёмкость кондера … но это «перделка» для лампочки не более того!!!

  2. s_black говорит:

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

  3. Maxim говорит:

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

  4. s_black говорит:

    ?звините… А Вы не ошиблись? Каким боком в фазоимпульсном управлении симистором алгоритм Брезенхема???

  5. clawham говорит:

    нагрузки 0…200 ватт обычно и регулируют фазоимпульсно
    но нагрузки в 10-100 ампер рулятся уже либо брезенхемом либо синус выпрямляется и дальше либо полевики либо ?ГБТ

    выпрямитель тож не просто диоды а нормальный с PFC системой «правильный» выпрямитель

    по поводу брезенхема…дык…всё то же самое только вместо простого мока ставится мок зеро крос 3063 например
    ну и алгоритм для МК очень прост

    typedef struct
    {
        signed char Ena;
        signed char MAXPOWER;
        signed char Delta;
        signed char Target;
        signed char Phase_number;
        signed char Out;
        unsigned int curr_Step;
        unsigned int Divider;
    } brez;
     
    brez b[maxBrez];
     
    void UpdPhase()
    {
        char n=0;
        for(n=0;nb[n].Divider)
                {
                    b[n].curr_Step=0;
                    b[n].Delta+=b[n].Target;
                    if(b[n].Delta>0)
                    {
                        b[n].Delta -= b[n].MAXPOWER;
                        b[n].Out    = 1;
                    }
                    else
                        b[n].Out    = 0;
     
                    if(--b[n].Phase_number==0)
                    {
                       b[n].Phase_number    = b[n].MAXPOWER;
                       b[n].Delta           = (-(b[n].MAXPOWER/2));
                    }
                }       
            }
        }
    }
     
    void brezinit()
    {    
        char n=0;
        for(n=0;n<maxBrez;n++)
        {
           b[n].Ena             = 1;
           b[n].MAXPOWER        = 100;
           b[n].Phase_number    = 100;  
           b[n].Delta           = -50;
           b[n].Out             = 0; 
           b[n].Target          = 0;
           b[n].curr_Step       = 0;
           b[n].Divider         = 0;
           if(n==2)
            b[n].Divider         = 50;
     
        }
    }

    этот код проверен и работает
    всё что нужно — раз в положительную полуволну (неважно в каком месте) вызывать UpdPhase() и в структуре(структурах если много таких) в переменной Out будет результат(1 — надо включить симистор, 0- погасить светодиод МОКа)

  6. Maxim говорит:

    Спасибо большое за информацию !

  7. Max говорит:

    Отличная статья. Напиши как расчитать номиналы R4, R5.

  8. s_black говорит:

    Спасибо. Эти номиналы взяты из даташита на MOC3023 (типовая схема включения).

  9. BDW говорит:

    В варианте с BT137, 139 резистор R5 зело греться любит. причем зависит от симистора часто непредсказуемо — от партии к партии.
    BTA4xxx гораздо более стабильны, хоть и малость дороже.

  10. Pro говорит:

    Судя по рисунку необходимо определить сначала где фаза, где ноль? А потом уж и в розетку совать? ?ли все равно ….

  11. s_black говорит:

    Определять не нужно — суйте как понравится.

  12. ?горь говорит:

    Zero Cross — специфическая штучка, вовсе не подходящая для индуктивностей, которых полно: трансы, соленоиды, двигатели. Прямо печалит эйфория на это Zero Cross, когда сплошь нужны датчики нуля тока: не только же лампами накаливаниями и резистивными грелками живы быт и промышленность…

  13. s_black говорит:

    В этой статье освещён вопрос управления НЕ?НДУКТ?ВНОЙ нагрузкой!

  14. Серега говорит:

    Вопрос по поводу кода.Как вы добились опроса кнопок в 65 Мс через Таймер 0 если
    при 8Мгц и дилителе 1024 (1/7813)*256=32 Мс ?

  15. s_black говорит:

    Если Вы внимательно смотрели makefile — там указана частота 1 МГц, т.е период 1 мкс. Запускаем с делителем 256, соответственно период 256 мкс. Умножаем на 256 (таймер 8-ми разрядный) и получаем 65536 мкс = 65, 536 мс.

  16. мигель говорит:

    Безенхем штука хорошая. Только вот с малоинерционными нагрузками нехорошо получится. ? точность регулирования низковата.

  17. s_black говорит:

    Так ведь в статье описана регулировка не по алгоритму Брезенхема!

  18. мигель говорит:

    Ну да, пардон, это я по поводу комментария clawham, который выше.

  19. rai17 говорит:

    Брезенхем конечно круто…
    Делал несколько устройств по этому принципу.
    Регулятор мощности для паяльника на 42В, 40Вт. Трансформатор «цокает» в моменты включения (естественно включение при переходе через «0»).
    Канальный нагреватель в вентиляционном канале, мощностью 6 кВт. Период коммутации 1,28 с. В моменты коммутации естественно идёт просадка напряжения. ? лампы накаливания в помещении об этом свидетельствуют 😉
    Частично проблема решилась разделением нагрузки надвое и сдвигом в коммутации каждой нагрузки на половину периода (0,64 с).

  20. Андрей говорит:

    Здравствуйте!

    Понравилась схемка. Спасибо за то что выложили.

    Хочу воспроизвести, но что-то никак не пойму что такое PC2501. никак не найду, может описка?

    Спасибо,
    Андрей.

  21. s_black говорит:

    PC2501 — это оптрон, по схеме хорошо видно. Необходим для гальванической развязки.

  22. Андрей говорит:

    s_black, спасибо за ответ.

    я вижу что это оптрон. но я не могу найти _эту_ модель. вот и думаю, может описка?

  23. Alex говорит:

    s_black скажи пожалуйста каким ёбразом схема Zero Cross обрабатывает вторую полуволну, на осцилограммах видно что она обрабатывает обе полуволны, вопрос как?

  24. s_black говорит:

    А она обрабатывает только положительную полуволну ))) Просто конец положительной полуволны — это начало отрицательной (переход через ноль). Соответственно, конец отрицательной полуволны — это начало положительной ( обратный переход через ноль).

  25. Alex говорит:

    s_black Если я правильно понял, сначала прерывание срабатывает по переходу +-, а потом -+ . Я бы всё же поставил 2 оптопары для обработки каждой полуволны, если исходить из логики (точнее планировал до того как не наткнулся на данную статью).
    Кстати статья довольно позитивная, за что, естественно, респект.

  26. s_black говорит:

    Да, правильно. Прерывание настроено на любое изменение уровня.
    Спасибо за оценку!

  27. Alex говорит:

    s_black.
    Есть, кстати, интересные оптопары, например: PC814
    http://www.w-r-e.de/robotik/data/opt/pc814.pdf
    точнее их очень много интересных 🙂

  28. Alex говорит:

    После поиска в сети наткнулся на схемку zero-crossing detector. Схемка порадовала тем что все детали SMD и самое главное что там нечему греться, поскольку токи мизерные. Это пригодиться кому требуется минимизировать размеры печатной платы.
    Заработала почти сразу: пришлось уменьшить сопротивление R4 раза в 2-3 поскольку оптопару поставил 4n26.
    ?звиняюсь заранее если посчитаете рекламой(хотя это не так).

  29. Эвас говорит:

    Не могли бы посоветовать или дать ссылку как организовать управление трехфазной нагрузкой от Arduino. нагрузка тэны 9кВт (3х3кВт). Особенность в том что сеть может (особенно зимой) не выдержит. ?дея включать на 70% мощности и при достижении заданной температуры снижать до 50% мощности. ?з ваших комментариев я понял что применение Z/C технологии в моем случае не пойдёт из за шумов в сети (гармоник).

  30. s_black говорит:

    Управление трёхфазной нагрузкой описано здесь но не ардуиной, а обычным контроллером.

  31. Эвас говорит:

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

  32. BDW говорит:

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

  33. s_black говорит:

    Непонятно где Вы поставили диодный мост… Если есть подозрения об обработке только одного полупериода — выставьте яркость на максимум — должны явно наблюдаться пульсации света.

  34. Ewas говорит:

    спасибо s_black за инфо о трехфазной опробую, как только детатальки получу. Какую схему посоветовали использовать для управления вентилятором, поскольку весь колхоз собираю на ардуинке нужно изменят обороты. Как понимаю не совсем подходит схема с детектором ноля но тут как бы реализовал именно по такой аналогии и как бы , по словам автора всё работает.

  35. Ewas говорит:

    Доп информация. Пропустил. Двигатель вентилятора однофазный асинхронный 220в 0.5А.

  36. s_black говорит:

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

  37. BDW говорит:

    + вопрос мощности станет на низких оборотах — лучше не ввязываться, ?МХО

  38. Ewas говорит:

    управляя вентилятором можно не понижать на столь, чтобы потом были проблемы, поставить ограничение. Но всё же много сегодня и на продаже разных бытовых регуляторов оборотов с разными схемами реализации, вот одна из популярных

  39. s_black говорит:

    Это те же яйца, только в профиль…
    Для коллекторного двигателя эта схема подойдёт, а для асинхронного — нет.

  40. Ewas говорит:

    так может где нибудь видали и для асинхрона?

  41. Ewas говорит:

    тут трактат типа по ученому

  42. s_black говорит:

    Самое простое решение здесь.

  43. Федор говорит:

    Cделал похоже. Только вместо VD1 поставил диодный мост и убрал R4.
    Вот софт. Строго не судите — только учусь.
    Управление еще не делал. Главное — поймать полуволну! 🙂

    //by Fedy Savin. плата arduino pro micro usb
    // выход 9 нога
    // вход  3 нога
    int PinA=3; //#define PinA  2 (nfr было в оригинале) вход 
    static boolean output = HIGH; 
    volatile int on=0;
    int lamp=9; // нога выход на лампу
    int light=7; // слабая яркость (от 0 до 8)
    void setup()  
     {    
      Serial.begin(9600); 	
      pinMode(PinA, INPUT);  
      pinMode(lamp, OUTPUT);  
      digitalWrite(PinA, HIGH);     // подключить подтягивающий резистор 
      attachInterrupt(0, int_on, FALLING);  //(LOW)  настроить прерывание interrupt 0 на pin 3 
    /*
    LOW - чтобы вызвать прерывание всякий раз, когда подан сигнал низкого уровня,
    CHANGE - чтобы вызвать прерывание всякий раз, когда изменяется значение контактный
    RISING - чтобы вызвать если вывод идет от низкого к высокому,
    FALLING - для того, когда контактный идет от высокого к низкому.
    */
     }   
     
    void loop() // главный цикл
     { 
       if (on==1) 
       {
          delay (light);
          digitalWrite (lamp,1);  
          delayMicroseconds(100);   
          digitalWrite (lamp,0);  
          on=0;
        }
     } 
     
    void  int_on() // обработка прерывания 
     { 
        on=1;
     }
  44. ewas говорит:

    Вот нашёл фирменную схемку фазо-импульсного для движка, но она тоже «режет» двигатели особо на малых оборотах. Так же надо как то вместо ручного управления прикрутить к ардуину- вместо потенцика Р1. Тут нужна развязка от сети. Вот источник и схема с платами.
    А тут на полевиках и меандр более красивый 🙂 но и дороже. Если это включать более объёмный проект, то наверное стоит — во всяком двигатель продержит несколько дольше прежней схемы.

  45. ?ВЦ говорит:

    У меня жуткий дребезг на прерывании после 4n35.
    Кто-нибудь борол проблему?

  46. ?ВЦ говорит:

    — Точнее — после опторазвязки zero-cross detector`а

  47. s_black говорит:

    Какой может быть «дребезг» в транзисторе оптрона ?!?!

  48. ?ВЦ говорит:

    Не в транзисторе. что-то происходит неладное.
    накинул анализатор уровней на пин прерывания — при переходе через ноль — дрыгалка — int1 вызывается раз пять до нуля и после. дрыгает все. а мне надо чисто. я по фронту каунтер хочу пускать. а тут — каша.
    думаю R2 сделать 5к, как то так…

  49. s_black говорит:

    А вывод INT1 Вы как объявили? Может он в Z-состоянии?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.