Управление 220В насосом.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

axill пишет:

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

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

axill
Offline
Зарегистрирован: 05.09.2011

Probelzaelo пишет:

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

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

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

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

axill пишет:

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

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

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

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

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

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

Если стоит сглаживающий конденсатор то нормального сигнала Вы уже не получите. Снимать сигнал нужно с трансформатора и через диод+резистивный делитель подавать на аналоговый вход. А пытатся усиливать постоянку нет смысла, потому что будут также усиливаьтся и помехи контроллера.  

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

Ну поймали Вы например момент напряжения 50в и что дальше? Мне Ваша логика не понятна

 

Цитата:
Если использовать в качестве "датчика фазы" светодиод оптопары с ограничивающим ток сопротивлением, то пойманный момент будет не слабо гулять в зависимости от самых разных причин и искажений синуса в сети, что происходит и часто и запросто...

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

   Схема с оптроном работоспособная и давно проверенна на практике, если изобретать велосипед, то лучший вариант dimmer, сделать на датчике тока ACS712

 

 

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

carduino.ru пишет:

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

Если стоит сглаживающий конденсатор то нормального сигнала Вы уже не получите.

С этим я пожалуй легко соглашусь.

carduino.ru пишет:

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

Ну поймали Вы например момент напряжения 50в и что дальше? Мне Ваша логика не понятна

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

carduino.ru пишет:

Если синус в сети искажен то ничего страшного в этом нет, ловить то нужно нулевую точку перехода от (+) к (-) и наоборот. Если даже и проскочит какая нибудь помеха, то уже нет большой разницы чем ловить нуль, компаратором или оптроном, в обоих случаях нуль определится неправильно, но вы этого не заметите, потому что лампочка имеет инертность
   Схема с оптроном работоспособная и давно проверенна на практике, если изобретать велосипед, то лучший вариант dimmer, сделать на датчике тока ACS712

Еще раз поясню. Ловить можно любую точку периода, или если очень хочется то две, в каждом из полупериодов. как это делалось в той программе которую вы приводили.  но если вы внимательно посмотрели, то там ловятся ДВЕ точки в ОДНОМ периоде, точка роста напряжения и потом точка спада а далее просто делается программный отсчет 1000us как задержка для перехода во второй период ))  В точной анологии, можно было не делать обработки второго прерывания, а просто повторить открытие симистора через 1/50 секунды после первого. те получим не 100 прерываний в секунду, а только 50.

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Probelzaelo пишет:

 

Еще раз поясню. Ловить можно любую точку периода, или если очень хочется то две, в каждом из полупериодов. как это делалось в той программе которую вы приводили.  но если вы внимательно посмотрели, то там ловятся ДВЕ точки в ОДНОМ периоде, точка роста напряжения и потом точка спада а далее просто делается программный отсчет 1000us как задержка для перехода во второй период ))  В точной анологии, можно было не делать обработки второго прерывания, а просто повторить открытие симистора через 1/50 секунды после первого. те получим не 100 прерываний в секунду, а только 50.
 

Тогда проще использовать оптрон HA11AA814 . С его помощью можно будет ловить отрицательный и положительный полупериод. Можно также перед оптроном PC817 установить диодный мост что бы все полупериоды сделть одной полярности.

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

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

carduino.ru пишет:

Тогда проще использовать оптрон HA11AA814 . С его помощью можно будет ловить отрицательный и положительный полупериод. Можно также перед оптроном PC817 установить диодный мост что бы все полупериоды сделть одной полярности.

Да, оба варианта буут и проще и удобнее. И код будет стабильнее и проще.

carduino.ru пишет:

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

Использовать delay в прерывании не следует ни в коем случае... ибо это решение совершенно не правильное. И вообще delay надо избегать всегда и везде где только возможно...

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Probelzaelo пишет:

 

Использовать delay в прерывании не следует ни в коем случае... ибо это решение совершенно не правильное. И вообще delay надо избегать всегда и везде где только возможно...

Я использую _delay_us() , а это совершенно разные вещи, так как библиотека avr/delay.h не использует прерывания и таймеры. Используется nop цикл в нем производится подсчет тактов процессора.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

carduino.ru пишет:

Probelzaelo пишет:

 

Использовать delay в прерывании не следует ни в коем случае... ибо это решение совершенно не правильное. И вообще delay надо избегать всегда и везде где только возможно...

Я использую _delay_us() , а это совершенно разные вещи, так как библиотека avr/delay.h не использует прерывания и таймеры. Используется nop цикл в нем производится подсчет тактов процессора.

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

Мне интересно, чем же закончится ситуевина, если, совершенно случайно, произойдет еще одно прерывание, до того как закончатся все delay() в обработчике? просто от другого источника, а следующее? стек то нерезиновый.   Или мы будем игнорировать все остальные события как ни чего не значащие, и затея установки контроллера сводится к функции мяхко гря RC цепочки?

смотрим исходник delay.h

void
_delay_us(double __us)
{
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;
if (__tmp < 1.0)
__ticks = 1;
else if (__tmp > 255)
{
_delay_ms(__us / 1000.0);
return;
}
else
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
}

самый что ни на есть прямой цикл... который реально можно использовать лишь внутри Loop() и вызываемых оттуда функциях/прог8раммах, с целью отсчитать временную паузу, но только не внутри обработчика прерываний где ну никак не нужно задерживаться лишку чтоб не испортить всю работу.

 

 

Evgeny
Offline
Зарегистрирован: 04.02.2013

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

Не сочтите за рекламу.

Скажите, а вот такую штукенцию получиться использовать вместе с Ардуино? Только вместо потенциометра подключить соответственно к Ардуино?

Цена вроде бы не особо кусучая.

Интересно, насколько сей девайс надежен? Может аналоги есть недорогие?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Evgeny пишет:
а вот такую штукенцию получиться использовать вместе с Ардуино? Только вместо

прямого ответа дать невозможно. все зависит от внутренней схемотехники устройства, нам это не известно. 

Какой принцип регулирования, что именно делает данный потенциометр, какие напряжения на управляющем конце? очень много вопросов. Но! есть один практически универсальный вариант )) использовать для вращения потенциометра не большой сервопривод (рулевую машинку) купленную в магазине для моделистов.  С сервоприводами Ардуино умеет обращаться прекрасно.  ))

Evgeny
Offline
Зарегистрирован: 04.02.2013

Нет информации об этом приборе. Только одно - судя по скринам он китайский.

Да, с сервой это вообще идея!

Может еще подскажете. Нашел у МастерКита (опять же не сочтите за рекламу) несколько девайсов: NF247, BM247, MK071.

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

С Ардуино интересно можно подружить?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

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

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

Сможет ли устройство управлять двигателем насоса, зависеть будет уже не от устройства а от двигателя, сможет ли он управляться без ущерба для себя.

Основной принцип заложенный во все эти устройства неизменно один и тот же. но для управления этими устройствами напрямую ардуина не очень приспособлена.

 

Evgeny
Offline
Зарегистрирован: 04.02.2013

Probelzaelo пишет:

Сможет ли устройство управлять двигателем насоса, зависеть будет уже не от устройства а от двигателя, сможет ли он управляться без ущерба для себя.

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

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

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

sirota
Offline
Зарегистрирован: 18.08.2015

Так на чем остановились? Болт-он решение управление 220В двигателем с шим имеется? У меня коллекторный однофазный двигатель. Надо плавно стартовать на определенную мощность и затем управлять ею. Спасибо за помощь.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Alexander пишет:

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

R2-R3 == 1,5К 1/2W. BT139-600E. МОС3041.

Если резистор и соединение T2 с G убираю, работает.

Когда отключен оптосимистор напряжение не уходит в ноль, а остаётся около 10V, но ток в районе погрешности мультиметра.

Можно ли такой обрезанной схемой (без R3) питать мотор насоса 1100W?

sirota
Offline
Зарегистрирован: 18.08.2015

https://www.dropbox.com/s/n74i6pcuibr3efn/Dimmer.png?dl=0

100% работающая схема. Хоть лампочка, хоть двигатель, хоть что.

 

#include <noDELAY.h>
#include <BUTTON.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <TimerOne.h>


//const uint8_t delay_button = 100;

#define shimPin 9
#define zeroPin 2

#define relayPin 14

//оборотов
uint16_t revol = 0;
uint16_t revolNow = 0;

#define revolPerCycle 1
uint16_t revolCycle = 0;

uint16_t buttonShag = 0;

//Частота шим
uint16_t shimNow = 0;
uint16_t shim = 100;
#define shimStart 50
uint8_t tic;



// Определяем переменные для кнопок
BUTTON BUTTON_LEFT(8);
BUTTON BUTTON_ENTER(10);
BUTTON BUTTON_RIGHT(11);

noDELAY nD_LEFT;
noDELAY nD_LEFT_Long;
noDELAY nD_RIGHT;
noDELAY nD_RIGHT_Long;
uint16_t nD_Long = 0;
#define nD_Long_Tick 10

#define revPLUS1 (revol < 9999) ? revol++ : revol = 9999
#define revPLUS2 (revol < 9989) ? revol+=10 : revol = 9999
#define revPLUS3 (revol < 9899) ? revol+=100 : revol = 9999
#define revMINUS1 (revol > 0) ? revol-- : revol = 0
#define revMINUS2 (revol > 10) ? revol-=10 : revol = 0
#define revMINUS3 (revol > 100) ? revol-=100 : revol = 0
#define shimPLUS1 (shim < 255) ? shim++ : shim = 255
#define shimPLUS2 (shim < 245) ? shim+=10 : shim = 255
#define shimMINUS1 (shim > 0) ? shim-- : shim = 0
#define shimMINUS2 (shim > 10) ? shim-=10 : shim = 0

//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1000; // длительность отслеживания нажатия и удержания.
//================================================================


// mode = 0 - Пауза
// mode = 1 - Работа
//
uint8_t mode = 0;

// Создаём объект LCD-дисплея, используя конструктор класса LiquidCrystal
//* с 6ю аргументами. Библиотека по количеству аргументов сама определит,
//* что нужно использовать 4-битный интерфейс.
//* Указываем, к каким пинам Arduino подключены выводы дисплея:
//*   RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(7, 6, 5, 4, 12, 13);

//
//Перменные для TIMER
//
//
unsigned long currentTime;
unsigned long loopTimeDraw;
unsigned long loopTimeShim;
bool waitTimeStartMotor = false;
unsigned long loopTimeStartMotor;
#define timeRedraw 100
#define timeSetUpShim 10
#define timeStartMotor 1000
//
//
//Перменные для TIMER
//
//

void engineStop() {
  digitalWrite(relayPin, HIGH);
  loopTimeStartMotor = millis();
  waitTimeStartMotor = true;
}

void engineStart() {
  digitalWrite(relayPin, LOW);
  waitTimeStartMotor = false;
}


void SetPWM() {
  if (mode != 2) {
    //digitalWrite(ledPin, LOW);
    detachInterrupt(0);
    detachInterrupt(1);
    shimNow = shimStart;
    digitalWrite(shimPin, LOW);
  }
  else {
    //digitalWrite(ledPin, HIGH);
    attachInterrupt(0, detect_up, FALLING);
  }
}

void draw_disp() {
  String up_s = "revol=" + String(revol) + "         ";
  String dn_s = "P W M=" + String(shim) + "         ";
  if (mode == 0) up_s.setCharAt(15, '<');
  if (mode == 1) dn_s.setCharAt(15, '<');
  if (mode == 2) {
    up_s.setCharAt(11, '|');
    if (revolNow>=1000) up_s.setCharAt(12, (revolNow/1000)%10 + '0');
    if (revolNow>=100) up_s.setCharAt(13, (revolNow/100)%10 + '0');
    if (revolNow>=10) up_s.setCharAt(14, (revolNow/10)%10 + '0');
    up_s.setCharAt(15, revolNow % 10 + '0');
    dn_s.setCharAt(11, '|');
    dn_s.setCharAt(12, ' ');
    if (shimNow>=100) dn_s.setCharAt(13, (shimNow/100)%10 + '0');
    if (shimNow>=10) dn_s.setCharAt(14, (shimNow/10)%10 + '0');
    dn_s.setCharAt(15, shimNow % 10 + '0');
  }
  //lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(up_s);
  //lcd.print("1234567890");
  lcd.setCursor(0, 1);
  lcd.print(dn_s);
  loopTimeDraw = millis();
}

void main_button() {
  BUTTON_LEFT.read();
  BUTTON_RIGHT.read();
  BUTTON_ENTER.read();
  nD_LEFT.read(100);
  nD_RIGHT.read(100);


  if (BUTTON_LEFT.click_down) {
    if (mode == 0) revMINUS1;
    if (mode != 0) shimMINUS1;
    SetPWM();
  }
  if (BUTTON_LEFT.retention) {
    nD_LEFT.start();
  }
  if (BUTTON_LEFT.click_up) {
    nD_LEFT.stop();
    nD_Long = 0;
  }
  if (nD_LEFT.push_tick) {
    nD_Long++;
    if (mode == 0) (nD_Long<nD_Long_Tick) ? revMINUS2 : revMINUS3;
    if (mode != 0) (nD_Long<nD_Long_Tick) ? shimMINUS1 : shimMINUS2;
    SetPWM();
  }

  if (BUTTON_RIGHT.click_down) {
    if (mode == 0) revPLUS1;
    if (mode != 0) shimPLUS1;
    SetPWM();
  }
  if (BUTTON_RIGHT.retention) {
    nD_RIGHT.start();
  }
  if (BUTTON_RIGHT.click_up) {
    nD_RIGHT.stop();
    nD_Long = 0;
  }
  if (nD_RIGHT.push_tick) {
    nD_Long++;
    if (mode == 0) (nD_Long<nD_Long_Tick) ? revPLUS2 : revPLUS3;
    if (mode != 0) (nD_Long<nD_Long_Tick) ? shimPLUS1 : shimPLUS2;
    SetPWM();

  }

  if (BUTTON_ENTER.click_down) {
    if (mode == 2) {
      mode = 0;
      if (revol > 0)
      revol -= revolNow;
      engineStop();
      SetPWM();
    }
    else (mode==0) ? mode = 1 : mode = 0;
  }

  if (BUTTON_ENTER.retention) {
    if (mode!=2) {
      engineStart();
      mode = 2;
      shimNow = shimStart;
      revolCycle = 0;
      revolNow = 0;
      attachInterrupt(1, detectcycle, FALLING);
      /*
      RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
      FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
      */
      SetPWM();
    }
  }

}

//
//
//Функции TIMER
//
//
void timer() {
  if ((mode == 2) && (currentTime >= loopTimeShim + timeSetUpShim)) {
    if (shim > shimNow) shimNow++;
    else
    if (shim < shimNow) shimNow--;
    else shimNow = shim;
    loopTimeShim = millis();
  }
  if (currentTime >= (loopTimeDraw + timeRedraw)) {
    draw_disp();
  }
  if (( waitTimeStartMotor ) && (currentTime >= loopTimeStartMotor + timeStartMotor)) {
    engineStart();
  }
}
//
//
//Функции TIMER
//
//


//********************обработчики прерываний*******************************

void detectcycle() {
  //Serial.println("in detect cycle");
  revolCycle++;
  if (revolCycle >= revolPerCycle) {
    revolCycle = 0;
    revolNow++;
  }
  if (revolNow == revol) {
    mode = 0;
    revol = 0;
    SetPWM();
    engineStop();
  }
  //draw_disp();
}

void halfcycle()  //прерывания таймера
{
  tic++;  //счетчик
  if(255 - shimNow < tic ) if (mode == 2) digitalWrite(shimPin, HIGH);  //управляем выходом
}

void detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту синусоиды
{
 tic=0;          //обнулить счетчик
 Timer1.resume();   //запустить таймер
 attachInterrupt(0, detect_down, RISING);  //перепрограммировать прерывание на другой обработчик
}

void detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту синусоиды
{
 Timer1.stop(); //остановить таймер
 digitalWrite(shimPin, LOW); //логический ноль на выходы
 tic=0;    //обнулить счетчик
 attachInterrupt(0, detect_up, FALLING); //перепрограммировать прерывание на другой обработчик
}

void setup() {

  //pinMode(ledPin, OUTPUT);
  //digitalWrite(ledPin, LOW);

  pinMode(shimPin, OUTPUT);
  digitalWrite(shimPin, LOW);
  pinMode(relayPin, OUTPUT);
  engineStart;
  pinMode(zeroPin, INPUT);

  //attachInterrupt(0, detect_up, FALLING);  // настроить срабатывание прерывания int0 на pin 2
  Timer1.initialize(40);              // Интервал срабатывания таймера в мкс
  Timer1.attachInterrupt(halfcycle);   //будет вызыватся каждый раз при отсчете заданого времени
  Timer1.stop();

  lcd.begin(16, 2);

  draw_disp();
  //Определения TIMER
  currentTime = millis();
  loopTimeDraw = currentTime;
  //Определения TIMER
  //shim = 255;
  analogReference(EXTERNAL);
}

void loop() {
  main_button();
  //SetPWM();
  currentTime = millis();
  timer();
}

Вот общая схема проекта с применением данного диммера:

https://www.dropbox.com/s/vbvvotqze2c6pcc/stanokForTrans.PDF?dl=0

Это проект по управлению намоточным станком. Механика умерла, перевели на электронику.