регулятор мощности

rencom
Offline
Зарегистрирован: 17.05.2015

Помогите сделать красиво .  

Есть мощный регулятор на ардуинке . 4х канальный .  4 переменный резистора  и 4 мощных сиристора на выходе . 

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

 

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

Помогите , как сделать красивее . Для 2х каналов я придумал . А вот для 4х ?  

Программы последний раз писал 20 лет назад . ( 

 

int COUNT_POWER=31;   // счётчик циклов 

{


    POWER1 = analogRead(POWER1_IN)/32;   // читаем значения регуляторов переводим в 32 градаций . 
      POWER2 = analogRead(POWER2_IN)/32;
          POWER3 = analogRead(POWER3_IN)/32;
              POWER4 = analogRead(POWER4_IN)/32;
 
while (COUNT_POWER!=0){
    if (POWER1>=COUNT_POWER){ digitalWrite(POWER1_OUT, HIGH); //15
     }
    else digitalWrite(POWER1_OUT, LOW);
    if (POWER2>=COUNT_POWER) {digitalWrite(POWER2_OUT, HIGH);
     ;}
    else digitalWrite(POWER2_OUT, LOW);
    if (POWER3>=COUNT_POWER){digitalWrite(POWER3_OUT, HIGH);
     ;}
    else digitalWrite(POWER3_OUT, LOW);
    if (POWER4>=COUNT_POWER) { digitalWrite(POWER4_OUT, HIGH);
   ;}
    else digitalWrite(POWER4_OUT, LOW);
    COUNT_POWER=COUNT_POWER-1;
delay(5);

}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

rencom
Offline
Зарегистрирован: 17.05.2015

Умничаешь ? )) 

Код сам написал . 

кусок , потому что там много лишнего наворочено . К вопросу заданному не  касающещегося . 

Если ничего не понятно , ну не вникай . Зачем это тебе ? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

Умничаешь ? )) 

Код сам написал . 

кусок , потому что там много лишнего наворочено . К вопросу заданному не  касающещегося . 

Если ничего не понятно , ну не вникай . Зачем это тебе ? 

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

rencom
Offline
Зарегистрирован: 17.05.2015

если ты что то не понял , возможно это не чужая беда . 

НУ да ладно . Надеюсь на более адекватных участников форума 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

если ты что то не понял , возможно это не чужая беда . 

НУ да ладно . Надеюсь на более адекватных участников форума 

гыыыы, вот вы опять делаете ошибку всех новичков...

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

ваш код тупо не будет компилироватся... и в формате ардуино он просто глупо написан...

rencom
Offline
Зарегистрирован: 17.05.2015
Хорошо . Выкинул лишнее почти всё лишнее , выкладываю целиком . 

#define SERIAL_SPEED 9600 // скорость работы Serial
#define POWER1_OUT  8      // номер первого канала 
#define POWER2_OUT  9      // номер ..... канала 
#define POWER3_OUT  10      // номер ..... канала 
#define POWER4_OUT  11      // номер четвёртого канала 


#define POWER1_IN  A0      // номер первого канала 
#define POWER2_IN  A1      // номер ..... канала 
#define POWER3_IN  A2      // номер ..... канала 
#define POWER4_IN  A3      // номер четвёртого канала 


int POWER1 = 0;      // Мощность первого канала 
int POWER2 = 0;      // Мощность второго канала 
int POWER3 = 0;      // Мощность третьего канала 
int POWER4 = 0;      // Мощность четвёртого канала 
int DELYY_POWER=5;   // Пауза цикла регулировки 
int COUNT_POWER=31;   // счётчик циклов
int I=0;                // убрать . Счётчик цикла , для отладки 

void setup() {
  // задаем режим выхода для порта, 

  pinMode(POWER1_OUT, OUTPUT); 
    pinMode(POWER2_OUT, OUTPUT); 
      pinMode(POWER3_OUT, OUTPUT); 
        pinMode(POWER4_OUT, OUTPUT); 
    
  // задаем скорость работы ком-порта
  Serial.begin(SERIAL_SPEED);
}
  
void loop()
{
    POWER1 = analogRead(POWER1_IN)/32;   // читаем значения регуляторов переводим в 32 градаций . 
      POWER2 = analogRead(POWER2_IN)/32;
          POWER3 = analogRead(POWER3_IN)/32;
              POWER4 = analogRead(POWER4_IN)/32;
        
    Serial.print(" Current time:");
    Serial.println(millis());
 
        Serial.print(" power2:");
    Serial.print(POWER2);
        Serial.print(" power3:");
    Serial.print(POWER3);


while (COUNT_POWER!=0){
    if (POWER1>=COUNT_POWER){ digitalWrite(POWER1_OUT, HIGH); //15
     }
    else digitalWrite(POWER1_OUT, LOW);
    if (POWER2>=COUNT_POWER) {digitalWrite(POWER2_OUT, HIGH);
     ;}
    else digitalWrite(POWER2_OUT, LOW);
    if (POWER3>=COUNT_POWER){digitalWrite(POWER3_OUT, HIGH);
     ;}
    else digitalWrite(POWER3_OUT, LOW);
    if (POWER4>=COUNT_POWER) { digitalWrite(POWER4_OUT, HIGH);
   ;}
    else digitalWrite(POWER4_OUT, LOW);
    
I=I+1;
delay(DELYY_POWER);
    COUNT_POWER=COUNT_POWER-1; // отладка 
}

COUNT_POWER=31; // отладка 
 
 
}

 

rencom
Offline
Зарегистрирован: 17.05.2015

а проблема , что мощность регулируется скважностью . 

При малой мощности , все 4 канала включаясь одновременно на короткое время мусорят в сеть .  

Хотеся время включения каналов сделать не одновременным , а со сдвигом . 

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

гыыы так они и будут все включаться сразу,что им еще делать то...грубо все 31 цикла за полсекунды пролетают :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

rencom
Offline
Зарегистрирован: 17.05.2015

Неожиданно . Я тоже это заметил . 

если с 2мя каналами сделать не сложно . Один с начала цикла включать , второй наоборот в конце . 

ТО как с 4мя поступать ? 

 

задержку разную ставил . Проблема не исчезает . Одновременное включение 8 кw даёт изрядную помеху 

rencom
Offline
Зарегистрирован: 17.05.2015

может и было . Это вторая прога написанная для ардуины . Первой понятно светодиодом моргал по разному . 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

разную? а если сделать 50 000?

rencom
Offline
Зарегистрирован: 17.05.2015

Проблема  в одновременном включении каналов . есть поставить 50000 , помеха станет реже . 

А вот если включать все 4 канала со сдвигом на четверть цикла . , то станет гораздо красивее . 

Но код аккуратный придумать не могу . 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

Проблема  в одновременном включении каналов . есть поставить 50000 , помеха станет реже . 

А вот если включать все 4 канала со сдвигом на четверть цикла . , то станет гораздо красивее . 

Но код аккуратный придумать не могу . 

ГЫЫЫЫ опять сделали смешно...

что бы вчключать со сдвигом 4 канала. то нафиг такой огород вообще?

rencom
Offline
Зарегистрирован: 17.05.2015

короче всё понятно с тобой ) 

Продолжаю надеятся , что тут адекватные люди есть . 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

короче всё понятно с тобой ) 

Продолжаю надеятся , что тут адекватные люди есть . 

что именно ясно? то что вы больны на всю голову и расчитываете на халяву?

int POWER1_OUT = 8; 
int POWER2_OUT = 9;    
int POWER3_OUT = 10;   
int POWER4_OUT = 11;  

void setup(){
  pinMode(POWER1_OUT, OUTPUT);
  pinMode(POWER2_OUT, OUTPUT);
  pinMode(POWER3_OUT, OUTPUT);
  pinMode(POWER4_OUT, OUTPUT);

  digitalWrite(POWER1_OUT, HIGH);
  delay(10000);
  digitalWrite(POWER2_OUT, HIGH);
  delay(10000);
  digitalWrite(POWER3_OUT, HIGH);
  delay(10000);
  digitalWrite(POWER4_OUT, HIGH);
}
void loop(){}

 

rencom
Offline
Зарегистрирован: 17.05.2015

Это что за бред ? 

Цель его написания ? 

 

код  должен регулировать мощность по каналам . Притом независимо и одноврменно . 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

код  должен регулировать мощность по каналам . Притом независимо и одноврменно . 

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

rencom
Offline
Зарегистрирован: 17.05.2015

Ну понятно вникнуть в код сил и желания не хватило . 

НА аналоговых входах меняется напряжение от 0 до 5 

На цифровых выходах меняется скважность сигнала . Независимо 

цикл для того и нужен . 

За счёт этого мощность и регулируется .  ( да , устройство работает нормально ) 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

Ну понятно вникнуть в код сил и желания не хватило . 

НА аналоговых входах меняется напряжение от 0 до 5 

На цифровых выходах меняется скважность сигнала . Независимо 

цикл для того и нужен . 

За счёт этого мощность и регулируется .  ( да , устройство работает нормально ) 

все нафиг убил сапсем...

напряжение меняется... скважность меняется... я так понимаю по основной специальности вы сантехник в ЦЭРНЕ? тип слова вумные слышал, а нафиг и к чему не понял?

судя по первому посту напряжение меняется перемеными резисторами :) и они то уж скважность выставляют :)

rencom
Offline
Зарегистрирован: 17.05.2015

Брысь гуманитарий )) 

Толку от тебя всё равно не никакого . 

Резисторы , не резисторы. Хоть ЦАПами . какая разница то ? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

rencom пишет:

Брысь гуманитарий )) 

Толку от тебя всё равно не никакого . 

Резисторы , не резисторы. Хоть ЦАПами . какая разница то ? 

Дядь, ты дурак?

Попробуй напряги место куда еш.

Если на входе ничего не меняется. Или там диджей сидит и крутит все 4 регулятора в разные стороны под ритм барабанов?

А выход у тебя цифровой либо включено, либо выключено... какие скважности? какие регуляторы?

rencom
Offline
Зарегистрирован: 17.05.2015

пояснб алгоритм регулировки  . 

 

В цикле счётчик COUNT_POWER уменьшается от 31 до 0  

при исполнений цикла COUNT_POWER сравнивается с analogRead(POWER*_IN)/32 ну и включается , выключается цифровой выход . 

 

Если на аналоговом входе 0 , то цифровой выход будет выключен постоянно . при 5v постоянно включен . 

Промежуточные значения соотвественно . 

Так вот например при analogRead(POWER3_IN)/32 = 1 , время включения будет 1/31 от нагрузки . 

Но проблема в том что все выхода срабатывают одновременно . 

Как разнести по времени ?  

 

Puhlyaviy несмотря на все понты , примитивный кусок кода осознать и понять  не смог . )))

 

 

Als
Offline
Зарегистрирован: 17.05.2015

int COUNT_POWER=128;   // счётчик циклов 

01 {
02  
03  
04     POWER1 = 0+analogRead(POWER1_IN)/8;   // читаем значения регуляторов переводим в 128 градаций .
05     POWER2 = 1+analogRead(POWER2_IN)/8;
06     POWER3 = 2+analogRead(POWER3_IN)/8;
07     POWER4 = 3+analogRead(POWER4_IN)/8;

 

rencom
Offline
Зарегистрирован: 17.05.2015

Понял . Но проблемы то вовсе не решает .  

Ещё раз проблему сформулирую . 

вот дааграмма работы  программмы  ( не художник я )  

Серым включение канала . Так вот при малой мощности все 4 канала включаются в конце цикла . Все вместе .

А вот что хочется  что бы каналы включались со сдвигом на четверть цикла 

 

 

Als
Offline
Зарегистрирован: 17.05.2015

мой пример как раз организует сдвиг включения между каналами. 

rencom
Offline
Зарегистрирован: 17.05.2015

Да , но сдвиг меньше процента . А хочется 25%

Или недопонял ? 

Als
Offline
Зарегистрирован: 17.05.2015

можно таким способом организовать межканальный сдвиг на 25% (ранее про 25% ничего не говорилось):

09 while (COUNT_POWER!=0){
10     if (POWER1>=(COUNT_POWER+0) mod 32){ digitalWrite(POWER1_OUT, HIGH); //15
11      }
12     else digitalWrite(POWER1_OUT, LOW);
13     if (POWER2>=(COUNT_POWER+8) mod 32) {digitalWrite(POWER2_OUT, HIGH);
14      ;}
15     else digitalWrite(POWER2_OUT, LOW);
16     if (POWER3>=(COUNT_POWER+16) mod 32) {digitalWrite(POWER3_OUT, HIGH);
17      ;}
18     else digitalWrite(POWER3_OUT, LOW);
19     if (POWER4>=(COUNT_POWER+24) mod 32) { digitalWrite(POWER4_OUT, HIGH);
20    ;}
21     else digitalWrite(POWER4_OUT, LOW);
22     COUNT_POWER=COUNT_POWER-1;
 

 

maksim
Offline
Зарегистрирован: 12.02.2012
byte COUNT_POWER = 0;   // счётчик циклов

void loop()
{
  POWER1 = analogRead(POWER4_IN)/32-0; 
  POWER2 = (analogRead(POWER4_IN)/32-8)&31;
  POWER3 = (analogRead(POWER4_IN)/32-16)&31;
  POWER4 = (analogRead(POWER4_IN)/32-24)&31;

  digitalWrite(POWER1_OUT, (POWER1 < COUNT_POWER) ? HIGH : LOW);
  digitalWrite(POWER2_OUT, (POWER2 < COUNT_POWER) ? HIGH : LOW);
  digitalWrite(POWER3_OUT, (POWER3 < COUNT_POWER) ? HIGH : LOW);
  digitalWrite(POWER4_OUT, (POWER4 < COUNT_POWER) ? HIGH : LOW);

  COUNT_POWER++;
  COUNT_POWER &= 31;
  delay(DELYY_POWER);
}

Так вот если бы Puhlyaviy из вас клещами не вытащил чего вы хотите, ни кто бы вам не помог...

И почитайте что такое массив (array) и цикл for, тогда ваш код уменьшится в 4 раза.

rencom
Offline
Зарегистрирован: 17.05.2015

Можно пояснить что такое mod  ?

Как это работает , не могу понять . 

 

Про массив спасибо . Не знал что такое есть ) 

Als
Offline
Зарегистрирован: 17.05.2015
rencom
Offline
Зарегистрирован: 17.05.2015

надо вникать .  не понимаю пока  

Вот что в этой строке происходит ?

(POWER2>=(COUNT_POWER+8) mod 32)

код maksim пока  понимаю лишь частично )))  

Спасибо всем  . 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

maksim пишет:


  POWER1 = analogRead(POWER4_IN)/32-0; 

Ой! Не ожидал такого от тебя ))))

Als
Offline
Зарегистрирован: 17.05.2015

rencom пишет:

Вот что в этой строке происходит ?

(POWER2>=(COUNT_POWER+8) mod 32)

попробуй нарисовать на бумаге в клетку циклограмму работы всех 4х каналов, для случая когда power1=power2=power3=power4= 10

 

что происходит описано в мануале:

x = 7 % 5;   // x имеет значение 2
x = 9 % 5;   // x имеет значение 4
x = 5 % 5;   // x имеет значение 0
x = 4 % 5;   // x имеет значение 4

 

Als
Offline
Зарегистрирован: 17.05.2015

JollyBiber пишет:

  Ой! Не ожидал такого от тебя ))))

компилятор сам деление заменит на сдвиг, -0 отбросит. А человеку с его аналоговым мозгом проще для понимания.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Als пишет:

JollyBiber пишет:

  Ой! Не ожидал такого от тебя ))))

компилятор сам деление заменит на сдвиг, -0 отбросит. А человеку с его аналоговым мозгом проще для понимания.

мало того, он код еще и самостоятельно в двоичный код переведет.

bwn
Offline
Зарегистрирован: 25.08.2014

rencom!  А то, что такие нагрузки рекомендуется коммутировать в момент перехода синусоиды через ZERO, вы никогда не слыхали? И никаких циклов + счастливые соседи.

rencom
Offline
Зарегистрирован: 17.05.2015

Слышали конечно . И прежняя схема аналоговая так и работала . 

Но во первых реализация хлопотная будет . точной синхронизации добится будет сложно при 4х каналах . 

И что важнее переключение через 0 сейчас  реализовано в ключах силовых )))  Так и проще , так и надёжней . 

Помеха была не тиристорная , а от просадки сети . 

 

Но вообще , если чисто академически , интересно конечно . как в коде реализовать . 

bwn
Offline
Зарегистрирован: 25.08.2014

Это здесь . Ваши потенциометры надо будет привести к диапазону 0-254 . На 8кВт не пробовал, 1-2 суммарно работают без проблем.

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

    bwn      ...........рекомендуется коммутировать в момент перехода синусоиды через ZERO, вы никогда не слыхали?........

Сейчас тяжелее найти готовые SSR которые позволяют фазовое управление чем "обычные",
где  детектор нуля из серии "всё включено в комплекте"
Помех не будет
А использовать фазное регулирование для нагревателей с их инерцией....
Уж лучше за копейки ПИД контроллер купить готовый.....
 

bwn
Offline
Зарегистрирован: 25.08.2014

trembo пишет:

Сейчас тяжелее найти готовые SSR которые позволяют фазовое управление чем "обычные",
где  детектор нуля из серии "всё включено в комплекте"
Помех не будет
А использовать фазное регулирование для нагревателей с их инерцией....
Уж лучше за копейки ПИД контроллер купить готовый.....
 

Таки у ТС освещение(((. Чем ему ПИД и SSR помогут? Да и ПИД за 150-200 российских вряд ли найдете.

 

rencom
Offline
Зарегистрирован: 17.05.2015

Таки у меня тэны )

bwn
Offline
Зарегистрирован: 25.08.2014

rencom пишет:
Таки у меня тэны )

Пардон, зарапортовался))). Тогда действительно не прав((((

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

Выбор огромный.

http://www.aliexpress.com/item/Dual-Digital-RKC-PID-Temperature-Controller-REX-C100-with-thermocouple-K-Relay-Output/638549196.html?spm=2114.32010308.4.11.dpxwiT

Или похожие. Этот под реле.  Есть только под термопару, есть с платиновыми пт100.
Есть под SSR.

http://www.aliexpress.com/item/48-48mm-RKC-digital-Temperature-Controller-Thermocouple-RTD-Input-SSR-Output-Free-shipping/596001171.html?

Что в них вкусного усть-  режим автоматической насторойки  коэффициентов.
И датчики любых форм-размеров: болты, трубки,зонды,  трубочки (PT100)