хотел еще спросить, а поможет установка керамического конденсатора после резисторов R2 и R3 параллельно входу по переменке диодного моста, чтобы уменьшить помехи на входе? И какие требования к этому конденсатору по напряжению? Так как наблюдается смещение импульса перехода через 0.
Добрый вечер! Хотел посоветоваться по поводу алгоритма двухканального диммера. После просмотра различных реализаций диммеров на микроконтроллерах, а больше интересовали на ESP8266 выудил такую информацию: 1. Если требуется один канал, то в программе делаются два обработчика прерываний. Первое прерывание по переходу через 0, второе по таймеру. При вызове обработчика перехода через 0 переводится вывод симистора в низкий уровень и в регистр таймера заносится задержка, пропорциональная требуемой мощности. При вызове обработчика таймера вывод симистора переводится в высокий уровень, и в регистр таймера заносится длительность управляющего импульса, и запускается таймер, после его срабатывания вывод симистора переводится в низкий уровень и ожидается следующий вызов обработчика перехода через 0. 2. Второй алгоритм позволяет реализовать многоканальный диммер. В нем также при вызове обработчика перехода через 0 в таймер заносится значение задержки, пропорциональное требуемой мощности, при вызове обработчика таймера вывод симистора переводится в высокое состояние и ожидается следующий переход через 0, в котором вывод симистора переводится в низкий уровень. Во втором алгоритме есть недостаток, если переход через 0 имеет небольшие флуктуации, то возникает мерцание. Проблема в том, что на ESP один доступный таймер, и реализовать несколько каналов проблематично.
керамику и надо ставить. Никаких электролитов. если нужен пережёг электричества, то вполне пойдёт 2 вариант, если по уму, то первый. При достаточном токе через симистор, управляющий импульс может быть длительностью 1-2 мкс.
просто не могу допереть, как можно используя ресурсы ESP реализовать два канала диммера. Библиотеки которые находил - RobotDynOfficial / RDBDimmer, схема / диммер, https://github.com/fabiuz7/Dimmable-Light-Arduino Все используют второй алгоритм. А с ним мерцание появляется, из-за того что есть помехи в сети, смещается на 300 мкс переход через 0 и так как управляющий импульс длинный, возникает мерцание.
Поставить второй МК. У любого современного МК абсолютно нормальные таймеры с несколькими блоками сравнения.
Допустим нужно 100 срабатываний: одно на 0,1сек и 99 на 1 сек. Заводим таймер на 0,1 сек и делаем в нем 99 счетчиков до 10.
Да конечно можно сделать произвольное число каналов и на одном таймере и программном сравнении. Можно определять, какой канал должен сработать первым, загружать его интервал в таймер, потом вычислять время до следующего события, загружать в таймер время до него. Можно тикать минимальный интервал, и проверять нужно ли что то делать или ждать следующего тика. Одним словом, в этом случае, нужно разбираться с кодом, подсказанным на другом форуме, и переписывать его. Ну и пробовать, смотреть как будет работать диммер, как это будет влиять на работу WiFi.
Вот пример многоканального диммера на ESP. Вроде даже не мелькает на видео. Этот проект под MOSFET, с диммированием по заднему фронту. Но его можно переделать на симистор под диммирование по переднему фронту. Или по аналогии вставить многоканальность в свой проект.
Спасибо, видел этот проект. В нем детектор нуля организован также, как и в первом моем прототипе. И я заметил такой глюк. При указании типа источника внешнего прерывания для ESP, она некорректно определяет фронт или спад импульса перехода через 0. Как заметил один товарищ, на другом форуме, проблема может быть в флуктуациях сетевого напряжения на спаде или фронте импульса и возникают ложное прерывание, либо прерывание возникает и на фронте и на спаде импульса и начинается мерцание, поэтому я и озадачился поиском другой схемы перехода через ноль. По вышеуказанной схеме спад импульса очень неплох, но при все равно проскакивают ложные сработки. А если импульс управления симистора длинный, до конца полупериода, то будет мерцание.
Я Вам схему своего диммера привел в посте #6 Она сильно отличается от Вашей? У меня обработка "zero cross" сделана через прерывание, по PCINT: Код (C++): ISR(PCINT0_vect) // Отработчик PCINT, zero cross detect, нам нужен фронт (спад сетевого напряжения) { if ( !(PINB & (1<<PINB3)) && TCNT1 < 120 && Errflag==0) // минимизируем помехи в рабочем режиме. 10мс - 156,25 отсчетов таймера. Должны попадать сюда на отсчетах таймера 155-158 return; GTCCR |= 2; // сбросим счетчики предделителей TCNT1 = 0; // сбросим таймер if( dimming_0_nofad == 0 ) { if (dimming_0_cur>dimming_0 ) { OCR1A=dimming_0_cur--; // пропишем в регистр сравнения значение уровня диммирования нагрузки 0 } else if(dimming_0_cur<dimming_0) { OCR1A=dimming_0_cur++; // пропишем в регистр сравнения значение уровня диммирования нагрузки 0 } else { OCR1A=dimming_0_cur; // пропишем в регистр сравнения значение уровня диммирования нагрузки 0 } } else { dimming_0_cur = dimming_0; OCR1A=dimming_0_cur; // пропишем в регистр сравнения значение уровня диммирования нагрузки 0 } if( dimming_1_nofad == 0 ) { if (dimming_1_cur>dimming_1) { OCR1B=dimming_1_cur--; // пропишем в регистр сравнения значение уровня диммирования нагрузки 1 } else if (dimming_1_cur<dimming_1) { OCR1B=dimming_1_cur++; // пропишем в регистр сравнения значение уровня диммирования нагрузки 1 } else { OCR1B=dimming_1_cur; // пропишем в регистр сравнения значение уровня диммирования нагрузки 1 } } else { dimming_1_cur = dimming_1; OCR1B=dimming_1_cur; // пропишем в регистр сравнения значение уровня диммирования нагрузки 1 } PORTB &= ~( 1 << AC_LOAD_0 ); // Выключим оптопару PORTB &= ~( 1 << AC_LOAD_1 ); // Выключим оптопару Errflag=0; // рабочий режим, сбросим режим ошибки } Вы пишите, что "проблема может быть в флуктуациях сетевого напряжения на спаде или фронте импульса и возникают ложное прерывание, либо прерывание возникает и на фронте и на спаде импульса и начинается мерцание". Но у меня-то нет никакого мерцания, во всем диапазоне регулировки, на двух каналах. По этому поводу я ответил Вам первой фразой того же поста #6 Посмотрите код выше, там все откомментировано. В обработчик прерывания я попадаю только на спаде напряжения сети, сбрасываю таймер, и больше не захожу в обработчик прерывания пока значение таймера не превысит 120. А прерывание срабатывает и на подъеме сетевого напряжения. Но это игнорируется. Тем самым отсеивается дребезг детектора. Я же вам написал, что нужно сделать.
У Вас реализация сделана на AVR. С ними проблем нет, а вот на ESP возникают разные подводные камни. Вот ниже осциллограмма детектора нуля и управляющего импульса на симистор правда не видно джиттера управляющего импульса, но в динамике он виден.
Я вам дал ссылку на диммер на ESP. Он многоканальный. Вы пишите: А а в чем разница в детекции ноля между ESP и AVR? Я Вам уже говорил, что что бы Вы не делали, при спаде напряжения будет возникать дребезг на выходе детектора. Есть два варианта устранения этого дребезга - аппаратный и программный. Программный вариант проще при наличии процессора, и он легко прикручивается к проекту предложенному в сообщении #29.
Согласен, но в нем и деталей больше. А у меня и с этим проблем нет, причем совсем. Это у ТС проблемы и с одним и со вторым.
а вот интересно - современные светодиодные лампы понимают такой "димминг"? Т.е. счётчик диммера считает до 100? А как же логарифмическая кривая яркости? Я попробовал считать до 50000 на 16-ти битном счётчике. Но есть опасность ухода счёта на второй круг, т.к. я накапливаю ошибку счёта и добавляю её к стартовому значению. Поэтому пересчитал все значения на 25000. Честно, не думал, что лампа на 12 вольт из икеа диммируется. Диммируется, ещё и как! Правда, в очень узком диапазоне. Зажигается примерно за 3.5 мс до перехода через ноль. Интересно, как у взрослых ламп?
Попробовал диммер на разных лампах, какие нашлись в доме. Очень интересно едёт себя лампа IKEA: гудит, на ранние углы открытия не реагирует вообще (не берёт "нагрузку"). Зажигаться начинает только при напряжении Vrms=80 вольт. А гаснет при меньшем напряжении. Прямо как лампа накаливания. Лампа gauss не гудит, но периодически моргает. Что ей не хватает - хз. Больше всего понравилась филаментная gauss: уже при Vrms=20 зажигается, при 15 вольтах гаснет, что даёт очень плавный и красивый розжиг.