Диммер переменного тока (AC Dimmer RBDDimmer)
- Войдите на сайт для отправки комментариев
Пнд, 05/10/2020 - 00:29
Здравствуйте. Возникла необходимость диммировать насос, подключающийся в 220В/50Гц, для этих целей купил RBDDimmer, способный, как я понял из описания, диммировать, как срезая часть синусоиды, так и пропуская полупериод (мне как раз надо диммировать пропуская период).
Скачал, подключил RBDdimmer.h, полез в документацию и с удивлением обнаружил, что для диммирования есть одна функция:
dimmer.setPower(n); // где n принимает значения от 0 до 100
Но эта функция именно срезает часть синусоиды, мне же необходимо часть пропускать.
Как это реализовать на RBDdimmer.h?
P.S. Пока писал, придумал костылик с включением и отключением самого модуля:
dimmer.setPower(100);//синусоида не срезается
dimmer.setState(ON);//включаю устройство
delay(50);//жду 1 период
dimmer.setState(OFF);//выключаю устройство
delay(50);//жду 1 период
Вот таким способом я снизил мощность насоса на 50%, но это именно костыль. Как сделать по уму?
Здравствуйте. Возникла необходимость диммировать насос, подключающийся в 220В/50Гц, для этих целей купил RBDDimmer, способный, как я понял из описания, диммировать, как срезая часть синусоиды, так и пропуская полупериод (мне как раз надо диммировать пропуская период).
Заклинит насос. Не надо так.
Для равномерного распределения пропущенных периодов надо использовать алгоритм Брезинхема
Или у меня с утра что-то клинит, или период сети ~220в все-таки - 20 мсек. Тогда откуда взялся "delay(50);//жду 1 период" ?
Кроме того, в реальной сети далеко не "точно-точно" 50 Гц. Этот параметр немного, но гуляет. И что мы получим, когда ошибка накопится? Вывод: ищем на сайте (тут есть точно!) реализацию Брезенхема и детектор перехода напряжения через ноль. Объединяем и получаем искомый результат.
реализацию Брезенхема
Этот бред вы от какого умника подхватили?
Этот бред вы от какого умника подхватили?
Ну непонятно, в чем бред? Надо бы раскрыть вопрос. Уточню, что с двигателями не работал, а вот ТЭН на 4500вт у меня отличным образом именно Брезенхемом (пропуском полупериодов) регулируется. Программную часть надыбал именно на нашем форуме. Детектор нуля - кажется тоже здесь кто-то выкладывал.
Заклинит насос. Не надо так.
Не заклинит - принцип его таков, что полпериода (или период) электродвигатель тянет поршень вверх, затем пружина возвращает поршень обратно. Не суть - главное пропускать периоды для уменьшения мощности.
Или у меня с утра что-то клинит, или период сети ~220в все-таки - 20 мсек. Тогда откуда взялся "delay(50);//жду 1 период" ?
Кроме того, в реальной сети далеко не "точно-точно" 50 Гц. Этот параметр немного, но гуляет. И что мы получим, когда ошибка накопится?
У вас с утра, а делал-то я всё ночью, когда дети уснули - тут немудрено было перепутать частоту со временем.
Не суть, 50 мсек насос работает, 50 отдыхает (это слышно по звуку, а если использовать штатный dimmer.setPower(50); , срезаной синусоиды не хватает, чтобы насос качнул хотя бы раз - он просто гудит), в библиотеке и в самом модуле уже есть детекция нуля, так что насос на 50% мощности работает. Но не суть - меня интересует как штатным способом (библиотека к модулю же прилагается не просто так) снизить мощность не срезая полупериоды.
Если накопится ошибка, то на 99 циклов работы насоса получим 101 цикл простоя, то есть, реальная мощность составит не 50%, а 49.5% - не критично.
Вывод: ищем на сайте (тут есть точно!) реализацию Брезенхема и детектор перехода напряжения через ноль. Объединяем и получаем искомый результат.
Реализацию Брезенхема нашёл - алгоритм простейший, но сам я бы не догадался до такого.
Если найду детектор перехода напряжения через ноль, то и библиотека RBDDimmer.h не нужна будет?
P.S. Я так понимаю, когда кто-то производит устройство (диммер) и пишет для него библиотеку, в этой библиотеке должно быть всё реализовано - это же логично.
Этот бред вы от какого умника подхватили?
Ну непонятно, в чем бред?
Да это ж rkit, не обращайте на него внимания.
Реализацию Брезенхема нашёл - алгоритм простейший, но сам я бы не догадался до такого.
Если найду детектор перехода напряжения через ноль, то и библиотека RBDDimmer.h не нужна будет?
Да библиотка будет не нужна. Кстати глянул в ее код... Ну, скажем, далека она от совершенства. Лучше выкинте.
А детектор перехода через 0 это просто сделать на внешнем прерывании. У вас какая ардуина?
Этот бред вы от какого умника подхватили?
Ну непонятно, в чем бред? Надо бы раскрыть вопрос. Уточню, что с двигателями не работал, а вот ТЭН на 4500вт у меня отличным образом именно Брезенхемом (пропуском полупериодов) регулируется. Программную часть надыбал именно на нашем форуме. Детектор нуля - кажется тоже здесь кто-то выкладывал.
Алгоритм для оптимизации производительности, совершенно не играющей роли в данной задаче. Пустая трата времени программиста. Из пушки по воробьям.
Алгоритм для оптимизации производительности, совершенно не играющей роли в данной задаче.
Ну, вообще, это алгоритм рисования линии по пикселам изначально.
Ну и как же надо?
Алгоритм ОПТИМИЗИРОВАННОГО рисования линии. Читай википедию до конца, раз уж начал. В случае с диммером достаточно деления с округлением. У тебя 16 миллионов тактов в секунду есть.
Да библиотка будет не нужна. Кстати глянул в ее код... Ну, скажем, далека она от совершенства. Лучше выкинте.
А детектор перехода через 0 это просто сделать на внешнем прерывании. У вас какая ардуина?
Никогда не имел дело с написанием своего серьёзного на ардуино, только подключал библиотеки, брал нужную функцию и выводил на экран/в порт/мигал лампочками. А тут прям своя детекция нуля...
У меня arduino nano v3, аппаратное прерывание на 2 пине.
Алгоритм ОПТИМИЗИРОВАННОГО рисования линии. Читай википедию до конца, раз уж начал. В случае с диммером достаточно деления с округлением. У тебя 16 миллионов тактов в секунду есть.
Ну, приведи код, или изложи алгоритм, хотя бы.
А тут прям своя детекция нуля...
Тоже ничего странного и сложного. Если есть желание - киньте письмо (хоть пустое) на bma280156@mail. Пришлю схемы и скетчи. Всё нормально работает (по крайней мере, на моих ТЭНах). Хотя вообще-то для регулирования работы движка в Вашем случае (мне так представляется) достаточно ему давать периодически пинка. То есть, при здравом рассуждении и привязываться к переходу через ноль не очень-то надо. Действительно, можно с нужной периодичности открывать управляющий симистор. Тут и диммер-то, как таковой, ни к чему: ардуина, мос3041 (или 3061), симистор соответствующей мощности и снабберная цепь из резистора и конденсатора. И всё. Другой вопрос, что параметры этой периодичности надо подобрать, чтоб двигатель трезвон не выдавал, но это вопрос второй (кстати, программный). Щас меня запинают, но "я художник, мне так видится". :)
Скачал, подключил RBDdimmer.h, полез в документацию и с удивлением обнаружил, что для диммирования есть одна функция:
Вот таким способом я снизил мощность насоса на 50%, но это именно костыль. Как сделать по уму?
если ответить только на выделенный фрагмент... так же как я на коврике :)
т.е. ставим потенциометр, делаем ему:
int
val = analogRead(0);
val = map(val, 0, 1023, 0, 100);
а потом извращаемся с (MOC3061-M MOC3062-M MOC3063-M MOC3162-M MOC3163-M)
и оно будет убирать полупериоды (т.к. есть детектор нуля). Если синхронизоваться - достаточно точно, а если нет то +- полупериод.
есть 2 варианта открывать МОС: импульсами (правильно но думать нужно, фазировать) или тупо как светодиодом (не правильно) но работает и ничего с ней не случится.
Это просто вариант, я не настаиваю или не правильно понял задачу.
а исчЁ есть 555й тамер, подбираем частоту, а управляем скважностью (где-то попадались готовые платки) и это на МОСхххх с детектором нуля и ардуинку на синюю изоленту :))) но это не интересно.
Хотя вообще-то для регулирования работы движка в Вашем случае (мне так представляется) достаточно ему давать периодически пинка.
чего я там выше писал - это для лягушки!!!!
Это просто вариант, я не настаиваю или не правильно понял задачу.
Мне тоже так показалось. Один вопрос: ежели движок достаточно мощный, то возможно мигание лампочек на его фазе из-за просадки.
Мне тоже так показалось. Один вопрос: ежели движок достаточно мощный, то возможно мигание лампочек на его фазе из-за просадки.
я про вибрациаонный -писал, для мотора с конденсатором я отдавал в перемотку движок на 3 фазы (220) его переобвязали + купил китайский частотник
электродвигатель тянет поршень вверх, затем пружина возвращает поршень обратно. Не суть - главное пропускать периоды для уменьшения мощности.
Миль пардон (пропустил). Это что, насос "Малыш"? Тогда нафик все эти диммеры. Как уже сказано, периодически включать и выключать его. И всё, только подобрать периодичность включения.
Товарищи, у меня уже есть диммер https://aliexpress.ru/item/32802025086.html , который, судя по описанию, может:
Димминг может быть достигнут путём модуляции по скачкам импульсов (англ. PSM). С PSM:
вот и не парьте мозг, если это не мотор, а электромагнитный - самое оно.
Миль пардон (пропустил). Это что, насос "Малыш"? Тогда нафик все эти диммеры. Как уже сказано, периодически включать и выключать его. И всё, только подобрать периодичность включения.
Де нада. Это Ulka EX-5 (EP-5), качающая воду до 15 бар. Мощность 48 Вт.
Вопрос и был - как используя именно RBDDimmer.h включать/выключать, обеспечив снижение количества тактов в секунду с 50 до 49,48, ... 2,1 в секунду. Может, параметр какой есть. И пока я додумался лишь до
для снижения потока воды в 2 раза.
Ну как и ожидалось, кроме раскидывания польцев rkit не способен.
Вот код управления симистором по брезенхему. Выдернул из рабочего проекта, и в на железе данный скетч не проверял, но должен работать.
Судя по просмотру ссылки на Ulka EX-5 (бегло, по диагонали) - это вибрационный насос. "Малыш" из той же породы. То есть, обычный соленоид, а что он дергает (плунжер, шторку, шток...) - не суть важно. В смысле насоса его можно и Вашим диммером руководить и более простыми устройствами, выполняющими ту же функцию. Результат (подача жидкости) будет один и тот же. Так что, выбираем наиболее простой (для Вас) вариант и применяем. При этом совсем необязательно привязываться именно к 1 периоду. Мощность никакая, влиять на сеть не будет. Значит можно вообще для 50% производительности включать и выключать его хоть раз в секунду, хоть в две. При этом даже точность повысится :)
Вот код управления симистором по брезенхему. Выдернул из рабочего проекта, и в на железе данный скетч не проверял, но должен работать.
Во, у меня практически полная аналогия. Так что, курочим под себя этот код и пользуем.
PS: Пардон, строчка кода какого-то впихнулась, а убрать не могу.
строчка кода какого-то впихнулась. убрать не могу...
Самая левая кнопка в редакторе сообщения - "Источник" - позволяет непосредственно редактировать HTML-код сообщения.
Всем спасибо за участие. Возник у меня другой вопрос:
а если не использовать библиотеку вообще, могу ли я (я не могу, поэтому подскажите как) получить сигнал zero-cross на 2м пине и просто на управляющий пин отправлять один сигнал высокого уровня, 49 - низкого (2 высокого, 48 низкого и т.д.) и тем самым получать на выходе устройства 1, 2, 3... синусоиды в секунду вместо 50?
То есть,
power - значение от 0 до 100
low = 50 - power/2; //тут число пропусков (ноль, низкий сигнал)
high = power/2; //тут число подач высокого сигнала
Ну будет регулировка с шагом в 2 процента - да и ладно.
dimmer.setPower(0);
Всем спасибо за участие. Возник у меня другой вопрос:
а если не использовать библиотеку вообще, могу ли я (я не могу, поэтому подскажите как) получить сигнал zero-cross на 2м пине и просто на управляющий пин отправлять один сигнал высокого уровня, 49 - низкого (2 высокого, 48 низкого и т.д.) и тем самым получать на выходе устройства 1, 2, 3... синусоиды в секунду вместо 50?
так я же привел код который это делает. Причем распределяет пропуски равномерно по интервалу. Что не устраивает?
Ну, приведи код, или изложи алгоритм, хотя бы.
Серьезно?
пропуск_периода[n] = (n % (1 / скважность)) < 1
Дело в том, что такой сложный код мне вообще непонятен. Скажите, например, где здесь получение сигнала о пересечении нуля?
В прерывании ...
В прерывании ...
ТС же сказал - сложно...
ответ в строке 1 кода или 64...
Скажите, например, где здесь получение сигнала о пересечении нуля?
строки 39-48
Серьезно?
пропуск_периода[n] = (n % (1 / скважность)) < 1
И что это за бред? Скважность может быть от 1 до бесконечности. Т.е при любой скважности больше 1 выражение 1/скважность в целочисленной арифметике дает 0 и в (n % (1 / скважность)) мы получаем деление на 0. А для плавучки оператор % не применим.
Дело в том, что такой сложный код мне вообще непонятен. Скажите, например, где здесь получение сигнала о пересечении нуля?
Ну непонятен и ладно. Просто бери и пользуйся. Пин к которому подключен диммер (симистр) определяется в строке 2, а выход детектора нуля (ZC) должен быть подключен к D2
функция SetNewPLevel() задает процент мощности.
Скетч выше компилируется, загружается в Arduino ... и ничего не происходит.
Pni Z-C оставил вторым, переназначил только TRIAC_PIN на 4 и в void loop() { прописал SetNewPLevel(50);
Не работает... Видимо, какая-то команда для моего диммера пропущена... Например, в оригинальной библиотеке была инициализация портов, таймера и внешнего прерывания от zero-cross:
dimmer.begin(NORMAL_MODE, OFF);
в зависимости от схемы модуля может потребоваться поменять строки (обе сразу)
36 на
return
!(PIND & _BV(PD2));
65 на
EICRA = 3;
в зависимости от схемы модуля может потребоваться поменять строки (обе сразу)
36 на
return
!(PIND & _BV(PD2));
65 на
EICRA = 3;
Спасибо. Поменял, но полная тишина.
Удивительно вот что: через секунд так 30 после включения без наличия фазы и нуля на диммере, его индикатор включается как при 100% мощности и так дальше горит.
При наличии 220 вольт на входе в плату диммера, он так и не заводится.
Удивительно вот что: через секунд так 30 после включения без наличия фазы и нуля на диммере, его индикатор включается как при 100% мощности и так дальше горит.
При наличии 220 вольт на входе в плату диммера, он так и не заводится.
А схема диммера есть?
А схема диммера есть?
Схемы не нашёл, есть только фото с компонентами, схема расположения компонентов с размерами и фото печатной платы.
https://forum.arduino.ua/img/members/538/RobotRyn.png
http://m1.is.jc9.ru/static/kn1/3236/products/description/a4/22/a422f2175...
https://fastnvr.ru/image/cache/data/a93/Mod-Dimmer-5A-1L-3-600x600.jpg
Почему я пишу, что код не понимаю, а не тупо использую то, что непонятно?
Дело в том, что, понимая, я мог бы проверить, видит ли ардуино переход через ноль или нет и от этого уже плясать.
Пробую разобрать почти построчно:
Мож пропустил... какая цель димировать или снижать мощность насоса?
Снизить поток воды, в конечном итоге контролировать давление (там из-за "несжимаемости" воды не так всё просто, как кажется: нет линейных зависимостей и при работе насоса давление может долго держаться на отметке в 1 бар и за секунду резко подняться до 9)
Почему я пишу, что код не понимаю, а не тупо использую то, что непонятно?
Дело в том, что, понимая, я мог бы проверить, видит ли ардуино переход через ноль или нет и от этого уже плясать.
Пробую разобрать почти построчно:
Что бы понять срабатывает ли переход через 0 надо настроить сериал на 115200, а после строки 40 поместить
Serial.print("i");
} uint8_t i; //я так понимаю, тут просто объявили переменную. Почему здесь - не понимаю. а где надо? void loop() { //основной бесконечный цикл i++; //инкремент if(i>REG_MAX) i=0; //если i превысит 100, сброс i SetNewPLevel(i); // есть процедура в самом начале - установить мощность. Сначала 1, потом 2, 3, 4...99,100,0,1 да delay(3000); //задержка }
Снизить поток воды, в конечном итоге контролировать давление (там из-за "несжимаемости" воды не так всё просто, как кажется: нет линейных зависимостей и при работе насоса давление может долго держаться на отметке в 1 бар и за секунду резко подняться до 9)
asam, огромное спасибо. Половину кода уже понимаю. Почему устройство не работает, непонятно...
есть такое слово "гидрофор"
Насос нужно включить на 100%, а при достижении небольшого давления постепенно снижать давление.
Упростим задачу: помните, в школе "в бассейн по одной трубе...". Вот представьте себе бассейн, в который мощным насосом вливают по кубометру воды в минуту, чтобы наполнить его до нужного значения. Минуту заливают, минуту ждут - такой насос. Понятное дело, это создаёт волны на поверхности. А задача набрать бассейн ровно до отметки 1.5 метра и поддерживать этот объём в течение часа (... а по второй трубе из бассейна уходит...).
Что бы понять срабатывает ли переход через 0 надо настроить сериал на 115200, а после строки 40 поместить
Serial.print("i");
Спасибо. А куда писать
Serial.begin(115200);
Написал в 40 строке, надеюсь, так можно - не видит моя плата высокий сигнал на 2м пине (или модуль диммера её не шлёт).