Керування релейним стабілізатором змінної напруги на Arduino Uno

Детектори напруги, струму. Схеми з підсиленням струму, перетворювачі та регулятори потужності, MOSFET транзистори
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 99
З нами з: 16 травня 2017 18:18

Керування релейним стабілізатором змінної напруги на Arduino Uno

Повідомлення Arduino »

Стабілізатори змінної напруги релейного типу широко розповсюджені і випускаються на широкий діапазон потужностей - від сотні ват до десятка кіловат і різними виробниками.

Ремонт таких стабілізаторів, які виготовляються за різними принциповими схемами, вимагає наявності цих схем і наявності різноманітної елементної бази, часто спеціалізованої.
Стабілізатори релейного типу, в яких в ролі комутуючих елементів використовуються симістори, працюють за аналогічною схемою.

Наявність популярних і недорогих мікроконтролерів серії Arduino дозволило виготовити універсальний вузол керування релейним стабілізатором, який може бути використаний при ремонті або модернізації релейного стабілізатора практично будь-якого типу і потужності.
Відсутність елементів регулювання (всі настройки робляться програмним шляхом) дозволяє легко адаптувати вузол під різну кількість ступенів регулювання, різні виконавчі органи, різну швидкість реакції на зміни вхідної напруги тощо.
rele-stab-1.jpg
ФОТО№ 1
Такий вузол керування було розроблено і виготовлено для заміни плати управління стабілізатора мережі типу ССП (ССП 220/2.0) потужністю 2.0 кВт виробництва підприємства “Маяк” (м. Вінниця , 1992 р.) (див. фото 1). Рідна схема керування містить 18 мікросхем (див. фото 2) малого рівня інтеграції, десятки транзисторів і її ремонт на сьогоднішній день є технічно і економічно недоцільним. В той же час силова частина - автотрансформатор, симістори ТС122-25, є добротними і надійними виробами і можуть працювати ще довго.
Для узгодження вихідних сигналів з Arduino Uno була виготовлена окрема плата узгодження з оптопарами типу MOC3082 (можуть бути замінені аналогічними інших виробників).
rele-stab-2.jpg

ФОТО№ 2
Розроблено і створено програму для Arduino. За вихідні дані для програми було взято паспортні характеристики стабілізатора ССП - діапазон зміни вхідної напруги (160...260В), кількість ступенів регулювання (6), швидкодія перемикання (менше 140 мс), наявність контролю пробою симісторів та інші паспортні параметри. Наявність потужного мікропроцесора дозволила ввести додаткові параметри, які підвищують експлуатаційні характеристики відновленого стабілізатора, наприклад, регульований час реакції на швидкі зміни вхідної напруги і регульований гістерезис порогів спрацювання.
Плата Arduino Uno і плата узгодження встановлені на перехідній пластині, яка закріплена на існуючій платі управління стабілізатора ССП і використовує її як перехідник для уникнення переробок електросхеми стабілізатора, а також як джерело живлення (див. фото 3).

Такий вузол керування було розроблено і виготовлено для заміни плати управління стабілізатора мережі типу ССП (ССП 220/2.0) потужністю 2.0 кВт виробництва підприємства “Маяк” (м. Вінниця , 1992 р.) (див. фото 1). Рідна схема керування містить 18 мікросхем (див. фото 2) малого рівня інтеграції, десятки транзисторів і її ремонт на сьогоднішній день є технічно і економічно недоцільним. В той же час силова частина - автотрансформатор, симістори ТС122-25, є добротними і надійними виробами і можуть працювати ще довго.
Для узгодження вихідних сигналів з Arduino Uno була виготовлена окрема плата узгодження з оптопарами типу MOC3082 (можуть бути замінені аналогічними інших виробників).
Розроблено і створено програму для Arduino. За вихідні дані для програми було взято паспортні характеристики стабілізатора ССП - діапазон зміни вхідної напруги (160...260В), кількість ступенів регулювання (6), швидкодія перемикання (менше 140 мс), наявність контролю пробою симісторів та інші паспортні параметри. Наявність потужного мікропроцесора дозволила ввести додаткові параметри, які підвищують експлуатаційні характеристики відновленого стабілізатора, наприклад, регульований час реакції на швидкі зміни вхідної напруги і регульований гістерезис порогів спрацювання.

Плата Arduino Uno і плата узгодження встановлені на перехідній пластині, яка закріплена на існуючій платі управління стабілізатора ССП і використовує її як перехідник для уникнення переробок електросхеми стабілізатора, а також як джерело живлення (див. фото 3).
rele-stab-3.jpg
ФОТО№ 3
Застосування запропонованого рішення дає можливість оперативно повертати до життя симісторні стабілізатори напруги з одночасним розширенням їх функцій. А заміна плати узгодження на транзисторну дає можливість використовувати таку модифікацію вузла керування в стабілізаторах з електромагнітними реле.

Виготовлений вузол керування з програмою було випробувано на стенді з симісторами КУ208Г і регульованим автотрансформатором типу ЛАТР (див. відео 1).

Автор: Ігор Фегецин fehecyn_i@i.ua

Програма для Ардуіно Уно
bool LoopState;
bool OutSyn;

int PinInSyn = 2; //дискр. вхід синхр. з мережі
int PinLoopState = 4; //дискр. вихід, індикація роботи осн. циклу програми: перемикається в кожному циклі
int PinOutSyn = 5; //дискр. вихід емулятора мережі
int PinItrrDur = 6; //дискр. вихід: 1- час в перериванні

bool UseAnSensorVal;
int AnSensorVal = 0;

int PinAnSensor = A1; //ан. вхід з давача напруги
int PinUseAnSensorVal = A0; //дискр. вхід вибору даних давача: 0- з входу PinAnSensor; 1- з послід. порта
int PinHyster = A2; //ан. вхід з задавача величини гістерезису

bool Out1, Out2, Out3, Out4, Out5, Out6;
bool OutI;
int PinOut1 = 8; //дискр. вихід керування, активний стан 1
int PinOut2 = 9; //дискр. вихід керування, активний стан 1
int PinOut3 = 10; //дискр. вихід керування, актвиний стан 1
int PinOut4 = 11; //дискр. вихід керування, активний стан 1
int PinOut5 = 12; //дискр. вихід керування, активний стан 1
int PinOut6 = 13; //дискр. вихід керування, активний стан 1

volatile bool CanChangeOut= false;

int OutVal;

#define HysterLow 0 //нижня (ліва) межа гістерезису
#define HysterHigh 50 //верхня (права) межа гістерезису
int HysterVal= HysterHigh; //величина гістерезису (в кодах АЦП)

//порогові рівні з давача напруги (в кодах АЦП)
#define AnLevel1 160
#define AnLevel2 320
#define AnLevel3 480
#define AnLevel4 640
#define AnLevel5 800
//#define AnLevel6 960
//
//#define AnLevel1 10
//#define AnLevel2 20
//#define AnLevel3 30
//#define AnLevel4 40
//#define AnLevel5 50
////#define AnLevel6 60

int DigLevelPrev= -1;
int DigLevel= 0;
bool DigLevelStable= false;

unsigned long PrevTime;
unsigned long CurTime;
signed long Delta;
#define ModFreqPeriod 500 //тривалість періоду мод. частоти, мкс
#define ModFreqDur0 250 //тривалість "0" в періоді мод. частоти, мкс

#define SynFreqPeriod 20 //тривалість періоду синхр. частоти, мс
#define SynFreqDur0 1 //тривалість "0" в періоді синхр. частоти, мс

void setup() {
Serial.begin(115200);
CurTime= 0;
pinMode(PinOut1, OUTPUT); pinMode(PinOut2, OUTPUT); pinMode(PinOut3, OUTPUT); pinMode(PinOut4, OUTPUT); pinMode(PinOut5, OUTPUT); pinMode(PinOut6, OUTPUT);
digitalWrite(PinOut1, false); digitalWrite(PinOut2, false); digitalWrite(PinOut3, false); digitalWrite(PinOut4, false); digitalWrite(PinOut5, false); digitalWrite(PinOut6, false);
pinMode(PinInSyn, INPUT_PULLUP);
pinMode(PinLoopState, OUTPUT);
pinMode(PinOutSyn, OUTPUT);
pinMode(PinItrrDur, OUTPUT);
pinMode(PinUseAnSensorVal, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PinInSyn), IntrServ, FALLING);
}

void loop() {
LoopState= !LoopState; digitalWrite(PinLoopState, LoopState);
if (digitalRead(PinUseAnSensorVal)== LOW) UseAnSensorVal= true; else UseAnSensorVal= false;
CurTime= micros();
if ((millis()% SynFreqPeriod)< SynFreqDur0) OutSyn= false; else OutSyn= true;
if ((CurTime% ModFreqPeriod)< ModFreqDur0) OutI= false; else OutI= true;

int c;
bool fSA= false;
if (Serial.available()){
fSA= true;
c= (char)Serial.read();
switch(c){
case 'q': OutVal++; break;
case 'a': OutVal--; break;
case 'Q': OutVal+= 8; break;
case 'A': OutVal-= 8; break;
}
if (OutVal< 0) OutVal= 0;
if (OutVal> 1023) OutVal= 1023;
}
GetDigLevel();
if (fSA) {
Serial.println(AnSensorVal);
Serial.print("DigLevel:"); Serial.println(DigLevel);
}
if (!DigLevelStable){
Out1= false; Out2= false; Out3= false; Out4= false; Out5= false; Out6= false;
switch (DigLevel){
case 1: Out1= true; break;
case 2: Out2= true; break;
case 3: Out3= true; break;
case 4: Out4= true; break;
case 5: Out5= true; break;
default: Out6= true;
}
CanChangeOut= true;
while (CanChangeOut) { // !!!
digitalWrite(PinOutSyn, OutSyn);
if ((millis()% SynFreqPeriod)< SynFreqDur0) OutSyn= false; else OutSyn= true;
digitalWrite(PinOut1, false); digitalWrite(PinOut2, false); digitalWrite(PinOut3, false); digitalWrite(PinOut4, false); digitalWrite(PinOut5, false); digitalWrite(PinOut6, false);
};
}
switch (DigLevel){
case 1: Out1= OutI; break;
case 2: Out2= OutI; break;
case 3: Out3= OutI; break;
case 4: Out4= OutI; break;
case 5: Out5= OutI; break;
default: Out6= OutI;
}
digitalWrite(PinOut1, Out1); digitalWrite(PinOut2, Out2); digitalWrite(PinOut3, Out3); digitalWrite(PinOut4, Out4); digitalWrite(PinOut5, Out5); digitalWrite(PinOut6, Out6);
digitalWrite(PinOutSyn, OutSyn);
}

void GetDigLevel(){
int dl;
dl= analogRead(PinHyster);
dl= map(dl, 0, 1023, HysterLow, HysterHigh); dl= constrain(dl, HysterLow, HysterHigh);
HysterVal= dl;

AnSensorVal= analogRead(PinAnSensor);
if (!UseAnSensorVal) AnSensorVal= OutVal;
while (1) {
if (AnSensorVal<= AnLevel1) {dl= 1; break;};
if (AnSensorVal<= (AnLevel1+ HysterVal)) {dl= -1; break;};

if (AnSensorVal<= AnLevel2) {dl= 2; break;};
if (AnSensorVal<= (AnLevel2+ HysterVal)) {dl= -2; break;};

if (AnSensorVal<= AnLevel3) {dl= 3; break;};
if (AnSensorVal<= (AnLevel3+ HysterVal)) {dl= -3; break;};

if (AnSensorVal<= AnLevel4) {dl= 4; break;};
if (AnSensorVal<= (AnLevel4+ HysterVal)) {dl= -4; break;};

if (AnSensorVal<= AnLevel5) {dl= 5; break;};
if (AnSensorVal<= (AnLevel5+ HysterVal)) {dl= -5; break;};

dl= 6; break;
}
if (dl< 0) {
dl= abs(dl);
if (DigLevel!= dl) dl= dl+ 1;
};
DigLevel= dl;
if (DigLevelPrev!= DigLevel) {
DigLevelPrev= DigLevel;
DigLevelStable= false;
} else
DigLevelStable= true;
}

void IntrServ(){
digitalWrite(PinItrrDur, true);
if (CanChangeOut) {
digitalWrite(PinOut1, false); digitalWrite(PinOut2, false); digitalWrite(PinOut3, false); digitalWrite(PinOut4, false); digitalWrite(PinOut5, false); digitalWrite(PinOut6, false);
digitalWrite(PinOut1, Out1); digitalWrite(PinOut2, Out2); digitalWrite(PinOut3, Out3); digitalWrite(PinOut4, Out4); digitalWrite(PinOut5, Out5); digitalWrite(PinOut6, Out6);
CanChangeOut= false;
}
digitalWrite(PinItrrDur, false);
}
Відповісти

Повернутись до “Датчики і регулятори струму та напруги”