Диммер переменного тока на MOC3042 или аналог (цель - убрать период)

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Здравствуйте. Стоит задача снизить количество тактов помпы Ulka EX5 на 50% (помпа - обычный электромагнит, дёргающий поршень 25 раз в секунду), для этого мне нужно пропускать каждый второй период синусоиды.

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

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

rkit
Offline
Зарегистрирован: 23.11.2016

andreykrasnodar пишет:

готовые диммирующие устройства для Arduino

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

apg_777
Offline
Зарегистрирован: 22.09.2020

andreykrasnodar пишет:

снизить количество тактов помпы Ulka EX5 на 50%

Если только 50%, то подключить через диод. И никакая ардуина не нужна.

rkit
Offline
Зарегистрирован: 23.11.2016

apg_777 пишет:

andreykrasnodar пишет:

снизить количество тактов помпы Ulka EX5 на 50%

Если только 50%, то подключить через диод. И никакая ардуина не нужна.

Нет. Так ты сократишь пополам амплитуду движения поршня, и качать не будет. Если не сгорит от насыщения сердечника соленоида

apg_777
Offline
Зарегистрирован: 22.09.2020

rkit пишет:

Нет. Так ты сократишь пополам амплитуду движения поршня, и качать не будет. Если не сгорит от насыщения сердечника соленоида

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

rkit
Offline
Зарегистрирован: 23.11.2016

apg_777 пишет:

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

Понятия не имеешь, о чем идет речь.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

apg_777 пишет:

Не важно период убирать или половину.

Важно.

Хотя бы потому, 50 или 25 Гц.

apg_777
Offline
Зарегистрирован: 22.09.2020

andriano пишет:

apg_777 пишет:

Не важно период убирать или половину.

Важно.

Хотя бы потому, 50 или 25 Гц.

Если убрать одну волну, то новый период будет 12.5 Гц, если полуволну — период останется 25. 50 Гц не будет.
Что касается диода, то он уже стоит в помпах Ulka EX5 с напряжением питания ниже 24 вольт, они уже работают на полупериоде.
В принципе убрать волну не сложно, просто выпрямить питающее напряжение, резистор со стабилитроном на 3.6-4.7 вольта для ограничения и этот сигнал подать на вход прерывания. Каждые два вызова менять состояние ключа. Или просто подать эти импульсы на пару T-триггеров и второй будет управлять тем же ключом.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Можно самому сделать.
И схему нарисуют и код напишут, если обратиться в тему "Ищу исполнителя"

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

apg_777 пишет:

Если убрать одну волну, то новый период будет 12.5 Гц, если полуволну — период останется 25. 50 Гц не будет.

Расскажите это своей учительнице. (если не опасаетесь за средний балл аттестата)

Гриша
Offline
Зарегистрирован: 27.04.2014

andreykrasnodar пишет:

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

покупай готовый, меняй МОС на тот, что с zero cross - патамштэ так проще. Под такую плату проще код написать, обычные digitalRead и digitalWrite и пара флагов, ну и мозг конечно.

как выше сам и написал, тебе не нужен ФИМ, а синхронизироваться на полуволне не сложно. Ну или на D триггере собери - и ардуино не нужно.

rkit
Offline
Зарегистрирован: 23.11.2016

Гриша пишет:

покупай готовый, меняй МОС на тот, что с zero cross - патамштэ так проще.

Да. Съездить за оптопарой, выпаять старую, впаять новую. Гораздо проще, чем написать две строчки кода.

apg_777
Offline
Зарегистрирован: 22.09.2020

andriano пишет:

apg_777 пишет:

Если убрать одну волну, то новый период будет 12.5 Гц, если полуволну — период останется 25. 50 Гц не будет.

Расскажите это своей учительнице. (если не опасаетесь за средний балл аттестата)

Ну подсчитал от 25 Гц вместо 50, так что сразу аттестат? :) Уже давно не опасаюсь.
Это не принципиально, а утверждать что если срезать половину периода, то мощность упадёт, а если срезать период из двух то нет — точно не так.
Но для решения исходной задачи ардуинка в принципе лишняя.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Ох и понаписали же тут! В насосе уже стоит диод, установка ещё одного или не решит задачу, или снизит мощность до нуля.

Повторюсь: мне нужно пропускать целый период. Для того, чтобы больше не делили и не писали про полупериоды, давайте задача будет такой: пропустить два периода.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Гриша пишет:

andreykrasnodar пишет:

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

покупай готовый, меняй МОС на тот, что с zero cross - патамштэ так проще. Под такую плату проще код написать, обычные digitalRead и digitalWrite и пара флагов, ну и мозг конечно.

как выше сам и написал, тебе не нужен ФИМ, а синхронизироваться на полуволне не сложно. Ну или на D триггере собери - и ардуино не нужно.

 

Я купил готовый диммер от RobotDyn http://out.arduino.ru/?redirect=https%3A%2F%2Faliexpress.ru%2Fitem%2F328... . На нём MOC3021, что для моей задачи, как я понимаю, не подходит: он диммирует только лампу, срезая от каждого периода по 1...100% (я так понимаю, в произвольном месте).

Можно пошагово - выпаиваю MOC3021 (хоть руки не из того места, но эта задача мне по силам), какой впаивать на его место и как действовать дальше?

rkit
Offline
Зарегистрирован: 23.11.2016

andreykrasnodar пишет:

 он диммирует только лампу, срезая от каждого периода по 1...100%

Ничего он НЕ ДИММИРУЕТ.

Диммирует ТВОЯ ПРОГРАММА.

НАПИШИ ДРУГУЮ ПРОГРАММУ, которая пропускает периоды, и он будет пропускать периоды.

Plasteroid
Plasteroid аватар
Offline
Зарегистрирован: 15.07.2020

andreykrasnodar пишет:

 В насосе уже стоит диод,

Фотку насоса с диодом выложи.

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Много лет назад это называлось "бегущий огонь"
И даже счётчик был подходящий - декадный ИЕ8.

http://www.joyta.ru/7402-mikrosxema-k561ie8-opisanie-i-sxema-vklyucheniya/

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

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

rkit пишет:

andreykrasnodar пишет:

 он диммирует только лампу, срезая от каждого периода по 1...100%

Ничего он НЕ ДИММИРУЕТ.

Диммирует ТВОЯ ПРОГРАММА.

НАПИШИ ДРУГУЮ ПРОГРАММУ, которая пропускает периоды, и он будет пропускать периоды.

Вы сильно ошибаетесь, возможности железа накладывают свои ограничения.

Попробуйте сами написать программу определения момента пересечения нуля без детектора нуля.

OK0
Offline
Зарегистрирован: 06.03.2020

andreykrasnodar пишет:

Попробуйте сами написать программу определения момента пересечения нуля без детектора нуля.

Да нет ничего сложного, написать грубый детектор ноля...

Но смешно другое, на этом модуле детектор есть

 

 

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Покупая модуль, я думал так же. Но когда я его стал тестировать, оказалось, что детектор нуля не работает. Вопросы на форуме привели к тому, что припаянная на него оптопара (MOC3021) без детектора нуля.

То есть, перепаяв 6 контактов, я смогу получить то же самое устройство, но с детекцией нуля.

rkit
Offline
Зарегистрирован: 23.11.2016

andreykrasnodar пишет:

 Но когда я его стал тестировать, оказалось, что детектор нуля не работает. Вопросы на форуме привели к тому, что припаянная на него оптопара (MOC3021) без детектора нуля.

Нет, идиот. У тебя просто дефектный модуль. Если бы ты сразу это написал, вместо того чтобы додумывать чушь про вещи, которых не понимаешь, тебе бы сразу ответили.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rkit пишет:

andreykrasnodar пишет:

 Но когда я его стал тестировать, оказалось, что детектор нуля не работает. Вопросы на форуме привели к тому, что припаянная на него оптопара (MOC3021) без детектора нуля.

Нет, идиот. У тебя просто дефектный модуль. Если бы ты сразу это написал, вместо того чтобы додумывать чушь про вещи, которых не понимаешь, тебе бы сразу ответили.

Ркит! Ты перечитай, что ТС написал! ;)))) У него моська на модуле без детектора перехода через ноль, а с модулем - все нормально.

Я же эти темы, как "анекдот.ру" читаю... ;))

OK0
Offline
Зарегистрирован: 06.03.2020

andreykrasnodar пишет:

 припаянная на него оптопара (MOC3021) без детектора нуля.

При чем здесь MOC3021? Вот детектор: (белая микросхема 4N25)

 

 

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

OK0 пишет:

andreykrasnodar пишет:

 припаянная на него оптопара (MOC3021) без детектора нуля.

При чем здесь MOC3021? Вот детектор: (белая микросхема 4N25)

 

 

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

Погуглил теперь про эту микросхему - действительно, есть детектор.
Теперь вопрос, почему плата работает с родным RBDDIMMER.H, а код ниже (в частности, получение сигнала о пересечении нуля в прерывании - строка 39 и далее) не работает

//Zerro crossing подключен к D2
#define TRIAC_PIN 5  // Dimmer
#define AC_DELAY 13
#define REG_MAX (100)   //количество уровней регулировки (2-127)
volatile uint8_t gACdelay_cnt;
volatile signed short gRegError = REG_MAX / 2;
volatile unsigned short gPowerPercent=0;    //текущий уровень мощности  0- REG_MAX
/*
   Установка уровня мощности
    Level - 0- REG_MAX
*/
void  SetNewPLevel(uint8_t Level)
{
  if (Level>REG_MAX) Level = REG_MAX;
  cli();
  gRegError = REG_MAX / 2;
  gPowerPercent = Level;
  sei();
}

void do_bresenham()
{
  gRegError = gRegError - gPowerPercent;
  if (gRegError <= 0)
  {
    gRegError = gRegError + REG_MAX;
    digitalWrite(TRIAC_PIN, HIGH); //SwitchOn();
  }
  else
  {
    digitalWrite(TRIAC_PIN, LOW); //SwitchOff();
  }
}
uint8_t inline readACpin()
{
  return PIND & _BV(PD2);
}

ISR(INT0_vect)
{
  for (uint8_t cnt = 0; cnt < 5; ++cnt)
  {
    if (readACpin()) return; //не реагируем на помехи
  }
  gACdelay_cnt = 0; //disable AC interrupts for AC_DELAY ms
  EIMSK &= ~_BV(INT0);//DisableAC_Int();
  do_bresenham();
}
// 1 mSec interrupts
ISR(TIMER0_COMPA_vect)
{
  gACdelay_cnt++;
  if (gACdelay_cnt >= AC_DELAY)
  {
    EIMSK |= _BV(INT0);//EnableAC_Int();
  }
  //   do_encoder();
  //  if (gStartKeyScan) do_button();           //check and de-bounce button
}

void setup() {

  pinMode(TRIAC_PIN, OUTPUT);
  pinMode(2, INPUT);
  EICRA = 2;  //Falling endge interrupt
  EIMSK |= _BV(INT0);//EnableAC_Int();
  OCR0A = 0xAF;  //1ms прерыания
  TIMSK0 |= _BV(OCIE0A);
}

uint8_t i;
void loop() {
  i++;
  if(i>REG_MAX) i=0;
  SetNewPLevel(i);
  delay(3000);

}
      
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А куда у вас пин диммера ZC подключен?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

asam пишет:

А куда у вас пин диммера ZC подключен?

У меня arduino nano v3, аппаратное прерывание на 2 пине.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

andreykrasnodar пишет:

asam пишет:

А куда у вас пин диммера ZC подключен?

У меня arduino nano v3, аппаратное прерывание на 2 пине.

Ну, у arduino nano v3 аппаратное прерывание может быть почти на всех пинах.

Так все же. Куда подключен пин диммера ZC? Ко 2му пину? Если да вы пробовали просто подключить туда кнопку и проверить срабатывают ли прерывания?

imp
Offline
Зарегистрирован: 20.06.2020

to andreykrasnodar. Извините за глупый вопрос, а почему Вам не выпрямить эти 24 вольта и не сделать простой генератор с регулируемой частотой на выходе. Тогда Вы сможете выставить нужную частоту без всяких танцев с бубном?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

imp, Вы думаете силовой выпрямитель и мощный генератор - будет проще?

imp
Offline
Зарегистрирован: 20.06.2020

Смотря что понимать под понятием проще. Схемотехнически скорее всего нет, а вот время и общая стоимость разработки может быть ниже. Да, еще и точность регулировки производительности насоса будет не сравнимо выше. Вопрос, рассматривалась ли такая возможность и если да, то почему от нее отказались?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

imp пишет:

to andreykrasnodar. Извините за глупый вопрос, а почему Вам не выпрямить эти 24 вольта и не сделать простой генератор с регулируемой частотой на выходе. Тогда Вы сможете выставить нужную частоту без всяких танцев с бубном?

220 вольт. Я и не подумал, что можно было поставить обычный диодный мост, а дальше сделать абсолютно любую частоту... но, разве это не костыль, так вообще делают?

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

И да, мне мешает неопытность в вопросах, связанных с электричеством.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

asam пишет:

Так все же. Куда подключен пин диммера ZC? Ко 2му пину?

Да.

void setup() {

...

pinMode(2, INPUT);

 

asam пишет:

Если да вы пробовали просто подключить туда кнопку и проверить срабатывают ли прерывания?

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andreykrasnodar пишет:

220 вольт. Я и не подумал, что можно было поставить обычный диодный мост, а дальше сделать абсолютно любую частоту... но, разве это не костыль, так вообще делают?

Выходит, все импульсные БП собираются исключительно на костылях.

Гриша
Offline
Зарегистрирован: 27.04.2014

rkit пишет:

Гриша пишет:

покупай готовый, меняй МОС на тот, что с zero cross - патамштэ так проще.

Да. Съездить за оптопарой, выпаять старую, впаять новую. Гораздо проще, чем написать две строчки кода.

andreykrasnodar пишет:

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

я имел ввиду, если в модуле (микросхеме МОС) есть детектор нуля - вся схема превращается в мигание светодиодом. МОС будет запускаться только в начале полуволны (сама).

схема пост 23 (переделка под задачу) меняем диодный мост на 1 диод, получаем меандр. Имея меандр и оптопару, которая сама видит пересечение - задача становится чрезвычайно простой даже для новичка, все сводится к зажиганию светодиодика по нажатию кнопки. 

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

OK0
Offline
Зарегистрирован: 06.03.2020

andreykrasnodar пишет:

нужно пропускать каждый второй период синусоиды

#define PWM 3
#define ZC 2
#define PAUSE 19
void setup()
{
  pinMode(PWM , OUTPUT );  pinMode(ZC, INPUT );
}
void loop()  {
  if (digitalRead(ZC)) { digitalWrite(PWM, !digitalRead(PWM));  delay(PAUSE); }
}

Это плохой вариант, но с этого можно было бы начинать... и это работает ...