Как боротся с данным явлением

DimaP.
Offline
Зарегистрирован: 21.04.2013

Добрый день всем, прошу помощи вот в каком вопросе, Собрал на макетке я вот такую схему

подал на 3 входа по 220 вольт и настроил делители напряжения, получив на выходе примерно по 1.2 вольта,

Подключил к осцелографу все в норме!

Потом я к одному из входов подключил ЛАТР

и получилось вот что если U1 = U2 = U3 то на всех выходах мы имеем примерно по 1.2 вольта 

Но если С помощью ЛАТРа уменьшить одно из напряжений примерно до 180 вольт и меньше, напряжение на выходе не падает ниже 0.8 вольт.

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

Если разорвать обвязку земли на схеме то данное явление пропадает!!

Подскажите почему это происходит и как с этим бороться!

 

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Если не секрет для чего такая схемотехника?

DimaP.
Offline
Зарегистрирован: 21.04.2013

Да пытался сделать 3 фазный вольтметр!!! цифровую часть готова, а вот с алоговой проблема!!

Rednaxela
Offline
Зарегистрирован: 26.08.2013

А зачем так сложно, просто по одному диоду и делителю на двух резисторах на каждую фазу и далее на входы контроллера (среднеквадратическое 5В как опорное).  Вот Вам напряжение на каждой фазе.

Общий - от нижнего резистора делителя на GND.

 

 

Adno
Offline
Зарегистрирован: 21.09.2012

DimaP. пишет:

Если разорвать обвязку земли на схеме то данное явление пропадает!!


В какой мере разорвать? Разделить каналы или отключить землю?
И потом это реальное подключение к сети 220 или модель в Протеусе? То есть вопрос по реальной цепи или теоретической?

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

Dimap, вольтметр так и не доделали?

DimaP.
Offline
Зарегистрирован: 21.04.2013

Michal пишет:

Dimap, вольтметр так и не доделали?

Так вот до сих пор и занимаюсь им!!! 1 фазное измерение дает хорошие результаты!! А вот как пытаюсь сделать что либо 3х фазное получается билеберда(  Так было и с ОУ, и теперь с выше показанной схемой проблемы!! 

DimaP.
Offline
Зарегистрирован: 21.04.2013

Adno пишет:
DimaP. пишет:

Если разорвать обвязку земли на схеме то данное явление пропадает!!

В какой мере разорвать? Разделить каналы или отключить землю? И потом это реальное подключение к сети 220 или модель в Протеусе? То есть вопрос по реальной цепи или теоретической?

Разорвать это значит каждый канал рассматривать отдельно!! Проверял на реальном осцелографе!

Причем в протеусе моделирование данной схемы, вышеописанной проблемы не проявляется!

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

на работу дойду, гляну схему 3Ф стабилизатора. Как там сделано

На сколько помню, там просто 3 канала измерения U и датчик обрыва фазы на кондерах.

дома нашел... давай мыло, скину схему

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

   Попробуйте изменять ЛАТРом напряжение и в других каналах (поочерёдно). Возмжно проблема только в данном канале?

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

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

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

DimaP.
Offline
Зарегистрирован: 21.04.2013


dimok-sab-man@rambler.ru

заранее благодарен за схему!!

DimaP.
Offline
Зарегистрирован: 21.04.2013

gena пишет:

   Попробуйте изменять ЛАТРом напряжение и в других каналах (поочерёдно). Возмжно проблема только в данном канале?

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

нет проблема общая для всех каналов!!

Хотел использовать в реальном устройстве! но на других форумах дидный мост все хают за его не прецизионность!! хотя когда 1 фазу я мерил, получалось точность менее 1%. я считаю это достаточно неплохо!  но при изменении температуры наверняка напряжение плавало в диапазоне 3 вольт! Но это опять же "я так Думаю"

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

отправил

DimaP.
Offline
Зарегистрирован: 21.04.2013

 

Michal пишет:

отправил

спасибо большое схему посмотрел!! вроде все понятно!!!ОУ применен аналог LM324. единственно в чем вопрос, в протеусе эта схема моделируется идеально и все вроде хорошо! но вот при реальном ее воплощении получается синусоида вида

т.е одна на другую накладывается, Это наверное происходит из за большого Uсм lm324.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

ну там есть подстроечный резистор в ОС ОУ

единственное что (я хз почему), если поменять HA17324 на LM324(вроде как аналог), железка начинает работать нестабильно. В др схемах, где ОУ LM324 входные сопротивления порядка 2 х 300к в каждом плече

DimaP.
Offline
Зарегистрирован: 21.04.2013

Попробую собрать на R-to-R операционниках MCP617 вроде у них напряжение смещение низкое! ! вот только про сопративления в плечах оу пока непонятно это по сути делитель напряжения получается??? 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

та вроде делитель, но в той схеме чо я те скинул используют HA17324. И там в плечах сопротивление полуучается под 3МОм(2.85), в ОС 8к2 , для LM324 китайские братья в плечах берту 2х300кОм и обратная свзяь в ОУ 2.8К и  опорное напряжение 2В подается через 2.8к.

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

Я сам не электронщик, но думаю это связано как то с входным сопротивлением ОУ.

DimaP.
Offline
Зарегистрирован: 21.04.2013

Michal пишет:

 думаю это связано как то с входным сопротивлением ОУ.

это врядли т.к входное сопративление ОУ измеряется если не гигаомами то сотнями мегом, а вот проблема с lm324 непонятная, если ставишь по 600 килоом в плече то получается напряжение на выходе выше нормы при достижении Uвх примерно 150 вольт.

Вообщем я попробую собрать схему на прецизионных ОУ и посмотрим что получится из этого всего! 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

а в обратной связи меняешь сопротивления, там по 2.8к надо ставить

DimaP.
Offline
Зарегистрирован: 21.04.2013

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

DimaP.
Offline
Зарегистрирован: 21.04.2013

собрал схему сегодня

подключил к осцелографа, нормальная синусоида поднятая 2 вольта и при подаче пременного напряжения изменяется в пределах вольта

как только подключил к устройству и попробовал покрутить ЛАТРом получается 

ЛАТР  (V)       Индикатор(V)
0                              39
50                            60
100                          97
200                          200
220                          218
240                          238
250                          243

вот незнаю в чем дело((

вот скеч

#include <LiquidCrystal_I2C.h>


// Подключаем стандартную библиотеку LiquidCrystal

#include <Wire.h>
#include <DS1307.h> //Подключение библиотеки для DS1307
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


/* переменные работающие в обработчике прерывания */
volatile int Umass_A[200]; //масив переменных для хранения мгновенных напряжений фазы А

volatile int Umass_B[200]; //масив переменных для хранения мгновенных напряжений фазы B

volatile int Umass_C[200]; //масив переменных для хранения мгновенных напряжений фазы С

int Ucor = 0;

long Uism_A = 0; // переменная для хранения измеренного напряжения и квадрата фазы А
long Usumm_A = 0; // переменная для хранения сумм квадратов фазы А 
long Uism_B = 0; // ------В-----
long Usumm_B = 0;//------В------
long Uism_C = 0; 
long Usumm_C = 0;


volatile byte counter = 0; // счетчик в обработчике прерывания


int ADC0 = 0; // аналоговый вход 0 для переменной Ucor!



#define ADC1    1  
#define ADC2    2
#define ADC3    3


volatile byte flag = 0;
/* переменные для усреднения напряжений*/
byte cntr = 0;
int Ure = 0;
int Umi = 0;
int Usi = 0;
int Umean_A = 0;
int Umean_B = 0;
int Umean_C = 0;



float sqrtUsum_A = 0;
float sqrtUsum_B = 0;
float sqrtUsum_C = 0;
int real_U_A = 0;
int real_U_B = 0;
int real_U_C = 0;
float coff = 0.095;


unsigned long timeOut = 0;// переменная для хранения времени!!!

//массивы
byte mass_SEC[10];
byte mass_MIN[10];
byte mass_HR[10];
byte mass_DATE[10];
byte mass_MTH[10];
int store_U_A[10];
int store_U_B[10];
int store_U_C[10];

// кнопки и светодиоды
const int buttEnter = 10;
const int buttDown = 9;// кнопка для прокрутки вниз
const int ledRed = 13; //светодиод наличия данных в памяти
const int ledGreen = 2; // светодиод нормальной работы

// переменные для работы с кнопками
boolean Enter_position = false; //переменная для хранения положения кнопки enter
boolean Down_position = false; // переменная для хранения состояния кнопки прокрутки
byte val = 0; 
byte regim = 0;
byte ledstate = 0;


/*разного рода переменные*/
boolean waitTime = false; // выдержка времени для того чтобы не сыпалось много значений 
unsigned long time = 0; // для работы со временем и millis
byte massVal = 0; //  переменная для сохранения данных и определения индекса массивов
boolean latch = false; //защелка запрещает / разрешает писать данные в массив
boolean enterFlag = false; // 
byte enterRegim = 1; // переменная режима кнопки enter
byte scroll = 1; //переменная для прокручивания результатов
boolean downFlag = false; //
unsigned long time_delite = 0; // для работы со временем и millis
byte value_delite = 0; //для выдержки времени при удалении
const byte Hi = 245;
const byte Low = 195;
void setup()  
{ 
    pinMode(buttEnter, INPUT);
    pinMode(buttDown, INPUT);
    pinMode(ledRed, OUTPUT);
    pinMode(ledGreen, OUTPUT);
    TIMSK2 = 0b00000000;         // запрещение прерывания по совпадению таймера/счетчика Т2  
    TCCR2A = 0b00000100;       // режим работы СТС
    TCCR2B = 0b00000011;     // предделитель на 32
    ASSR &= ~(1<<AS2);    // Выбор источника синхронизации таймера(от системного генератора
                                         
    OCR2A = 50;           // срабатывание таймера 16000000/32/100=5000 раз в секунду 100 раз за секунду
    
    ADMUX = (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
    ADCSRA = 0b10000111;
     lcd.init();                 
    // lcd.begin(16, 2);
     lcd.backlight();
     
         //set the year
  RTC.start(); 
}


void loop()
{

   
   if(millis()-timeOut > 300)
     {
       timeOut = millis();
       metod();
      }
   
   
   if(flag == 3)
   {
     for ( int i = 0; i<199; i++)
     {  
       Uism_A =  Umass_A [i];
       Uism_A -= Ucor;// убираем подьем синусоиды на 2 вольт
       Uism_A *= Uism_A;// возводим значение в квадрат
       Usumm_A += Uism_A;// склдываем квадраты измерений
    
       Uism_B =  Umass_B [i];
       //Uism_B -= Ucor; // убираем подьем синусоиды на 2 вольт
       Uism_B *= Uism_B;// возводим значение в квадрат
       Usumm_B += Uism_B; // склдываем квадраты измерений
    
       Uism_C =  Umass_C [i];
       //Uism_C -= Ucor; // убираем подьем синусоиды на 2 вольт
       Uism_C *= Uism_C;// возводим значение в квадрат
       Usumm_C += Uism_C; // склдываем квадраты измерений 
      }
      sqrtUsum_A = sqrt(Usumm_A); //вычисляем квадратный корень из суммы квадратов
      real_U_A = coff * sqrtUsum_A; //вычисляем реальное напряжение для фазы А
    
      sqrtUsum_B = sqrt(Usumm_B); //вычисляем квадратный корень из суммы квадратов
      real_U_B = coff * sqrtUsum_B; //вычисляем реальное напряжение для фазы В
    
      sqrtUsum_C = sqrt(Usumm_C); //вычисляем квадратный корень из суммы квадратов
      real_U_C = coff * sqrtUsum_C; //вычисляем реальное напряжение для фазы 
       Usumm_A = 0;
       Usumm_B = 0;
       Usumm_C = 0;
       counter = 0;
       flag = 0;
       mean_and_print();     
   }
   
  
   
  
if((real_U_A >= Hi || real_U_A <= Low) || (real_U_B>= Hi || real_U_B <= Low) || (real_U_C >= Hi || real_U_C <= Low ))
 {
  if(waitTime == false)
   { 
    waitTime = true;
    massVal++;
    latch = true; // переменая для сохранения результатов "защелка"
    if(massVal>10){massVal = 1;}
   }
 }
 /* else if(((245 <= real_U_A) || (245 <= real_U_B) || (245 <= real_U_C)) && waitTime == false )
  {
    massVal++;
    if(massVal>10){massVal = 1;}
    waitTime = true;
  }*/

 if(massVal >= 1)
{
 digitalWrite(ledGreen, LOW);
 digitalWrite(ledRed, HIGH);
 
} 
else 
{
 digitalWrite(ledRed, LOW);
 digitalWrite(ledGreen, HIGH);
}


// выдержка времени для ожидания между сохранениями результатов
if(waitTime == true)
{
  if(millis() - time > 1000)
  {
    time = millis();
    val++;
  }
}
else {val=0;}
if(val >= 60)
{
  waitTime = false;
   val = 0;
}

if(latch == true)
{
  //mass_SEC[massVal] = RTC.get(DS1307_SEC,false);
  mass_MIN[massVal] = RTC.get(DS1307_MIN,false);
  mass_HR[massVal] = RTC.get(DS1307_HR,true);
  mass_DATE[massVal] = RTC.get(DS1307_DATE,false);
  mass_MTH[massVal] = RTC.get(DS1307_MTH,false);
  store_U_A[massVal] = real_U_A;
  store_U_B[massVal] = real_U_B;
  store_U_C[massVal] = real_U_C;
  latch = false;
}
//вывод памяти
Enter_position = digitalRead(buttEnter);
Down_position = digitalRead(buttDown);
if(Enter_position == true && enterFlag == false && Down_position == false) //если нажата кнопка интер и не нажата кнопка прокрутки 
{
 enterRegim++; //увеличиваем переменную  режимов на 1
 enterFlag = true; 
 lcd.clear();
 if(enterRegim > 2){ enterRegim = 1; }//если больше 2 режимов переходим к первому
} 
if(Enter_position == false && enterFlag == true) // отпустили кнопку обнулили Флаг
{
  enterFlag = false;
}

if(enterRegim == 1)// первый режим постоянно выводит время и средние значения напряжения пофазно
{
  standBy();
  
}
if(enterRegim == 2)// второй выводит сохраненные значения мгновенных напряженияй
{
  data_save();
}

if(Enter_position == true && Down_position == true)
{
  if(millis()-time_delite>1000)
  {
    time_delite = millis();
    value_delite++;
  }
}
else 
  {
  value_delite = 0;
  }
  if(value_delite >=10)
  {
    massVal = 0;
    value_delite = 0;
    scroll = 1;
    waitTime = false;
  }
  

}
  
void standBy()
{
  // вывод времени и даты!
   if(RTC.get(DS1307_HR,true)<=9)
    { 
      lcd.setCursor(11,0);
      lcd.print("0");
      lcd.print(RTC.get(DS1307_HR,true)); // печатаем час
    }
    else
    {
      lcd.setCursor(11,0);
      lcd.print(RTC.get(DS1307_HR,true)); // печатаем час
    }

  lcd.setCursor(13,0);
  lcd.print(":"); // печатаем разделитель
  if(RTC.get(DS1307_MIN,false)<=9)
  {
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.print(RTC.get(DS1307_MIN,false)); // печатаем минуты
  }
  else
  {
   lcd.setCursor(14,0); 
   lcd.print(RTC.get(DS1307_MIN,false)); // печатаем минуты
  }
  if(RTC.get(DS1307_DATE,false)<=9)
  {
   lcd.setCursor(0, 0);
   lcd.print("0");
   lcd.print(RTC.get(DS1307_DATE,false));
  }
  else
  {
    lcd.setCursor(0, 0);
    lcd.print(RTC.get(DS1307_DATE,false));
  }
  lcd.setCursor(6, 0);
  lcd.print(RTC.get(DS1307_YR,false));
  lcd.print(".");
  //Отображение текущего месяца
  lcd.setCursor(2, 0); //указываем место печати названия месяца
  switch (RTC.get(DS1307_MTH,false)) // в зависимости от значения месяца печатаем название
  {
    case 1:    lcd.print("-01-");    break;
    case 2:    lcd.print("-02-");    break;
    case 3:    lcd.print("-03-");    break;
    case 4:    lcd.print("-04-");    break;
    case 5:    lcd.print("-05-");    break;
    case 6:    lcd.print("-06-");    break;
    case 7:    lcd.print("-07-");    break;
    case 8:    lcd.print("-08-");    break;
    case 9:    lcd.print("-09-");    break;
    case 10:   lcd.print("-10-");    break;
    case 11:   lcd.print("-11-");    break;
    case 12:   lcd.print("-12-");    break;
  }
  
  
  /*выводим состояния напряжений пофазно*/
  // печатаем вторую строку
    if(real_U_A < 20)
  {
   lcd.setCursor(0, 1);
   lcd.print("A=");
   lcd.print("0  ");
  }
  else
  { 
   lcd.setCursor(0, 1);
   lcd.print("A=");
   lcd.print(real_U_A);
  }
  if(real_U_B<20)
  {
   lcd.setCursor(5, 1);
   lcd.print("B=");
   lcd.print("0  ");
  }
  else
  {
   lcd.setCursor(5, 1);
   lcd.print("B=");
   lcd.print(real_U_B);
  }
  if(real_U_C <20)
  {
   lcd.setCursor(10, 1);
   lcd.print("C=");
   lcd.print("0  ");
  }
  else
  {
   lcd.setCursor(10, 1);
   lcd.print("C=");
   lcd.print(real_U_C);  
 }
  
}

void data_save()
{
  if(Down_position == true && downFlag == false && Enter_position == false)
  {
    downFlag = true;
    scroll++;
    lcd.clear();
    if(scroll > 10) { scroll = 1; }
  }
  if(Down_position == false && downFlag == true)
  {
    downFlag = false;
  }
 if(massVal >= 1)
 {
  lcd.setCursor(0, 0);
  lcd.print(scroll);
  lcd.print(".");
  if(mass_DATE[scroll] <=9)
  {
    lcd.setCursor(3, 0);
    lcd.print("0");
    lcd.print(mass_DATE[scroll]);
  }
    else
    {
      lcd.setCursor(3, 0);
      lcd.print(mass_DATE[scroll]);
    }
  lcd.print("/");
  if(mass_MTH[scroll] <=9)
  {
    lcd.setCursor(6, 0);
    lcd.print("0");
    lcd.print(mass_MTH[scroll]);
  }
  else
  {
    lcd.setCursor(6, 0);
    lcd.print(mass_MTH[scroll]);
  }
    
  lcd.print(".");
  if(mass_HR[scroll]<=9)
  {
    lcd.setCursor(9, 0);
    lcd.print("0");
    lcd.print(mass_HR[scroll]);
  }
  else 
  {
    lcd.setCursor(9, 0);
    lcd.print(mass_HR[scroll]);
  }
    
    lcd.print(":");
  if(mass_MIN[scroll]<=9)
  {
    lcd.setCursor(12, 0);
    lcd.print("0");
    lcd.print(mass_MIN[scroll]);
  }
  else
  {
    lcd.setCursor(12, 0);
    lcd.print(mass_MIN[scroll]);
  }
  
  if(store_U_A[scroll] < 50)
  {
   lcd.setCursor(0, 1);
   lcd.print("A=");
   lcd.print("0");
  }
  else
  { 
   lcd.setCursor(0, 1);
   lcd.print("A=");
   lcd.print(store_U_A[scroll]);
  }
  if(store_U_B[scroll]<50)
  {
   lcd.setCursor(5, 1);
   lcd.print("B=");
   lcd.print("0");
  }
  else
  {
   lcd.setCursor(5, 1);
   lcd.print("B=");
   lcd.print(store_U_B[scroll]);
  }
  if(store_U_C[scroll] <50)
  {
   lcd.setCursor(10, 1);
   lcd.print("C=");
   lcd.print("0");
  }
  else
  {
   lcd.setCursor(10, 1);
   lcd.print("C=");
   lcd.print(store_U_C[scroll]);  
 }
}

 else
 {
  lcd.setCursor(0, 0);
  lcd.print("No DATA, click");
  lcd.setCursor(0, 1);
  lcd.print( "ENTER to exit");
 }

  
}

void metod()
{
   Ucor = analogRead(ADC0);
   TIMSK2 |= (1<<OCIE2A); // разрешаем прерывание
   while(flag<3);
   TIMSK2 = 0b00000000; // останавливаем таймер     
}

void mean_and_print()//подпрограмма для усреднения измеренных напряжений и вывода данных на дисплей!!
{
 cntr++;
    
     if(cntr<11)
   {
     Umi += real_U_A;
     Ure += real_U_B;
     Usi += real_U_C;
     if(cntr == 10)
     {
       Umean_A = Umi/10;
       Umean_B = Ure/10;
       Umean_C = Usi/10;
       Umi = 0;
       Usi = 0;
       Ure = 0;
       cntr = 0;
     }
   }
   
}

word read_adc(byte adc_input)
{
         ADMUX = adc_input | (ADMUX & 0xF0);
//задержка для стабилизации входного напряжения
   delayMicroseconds(10);
//начинаем преобразование (ADSC = 1)
         ADCSRA |= (1<<ADSC);
         while((ADCSRA & 0x10)==0); //ждем, пока АЦП закончит преобразование (ADIF = 0)
        ADCSRA|=0x10;//устанавливаем ADIF
        return ADCW;//ADCW - содержит ADCH и ADCL как нам нужно
}
	 
	//****************обработчик прерывания********************
	
ISR(TIMER2_COMPA_vect) 
	
{  
  counter++;
  if((counter<= 199)&&flag == 0)
  {
    Umass_A[counter] = read_adc(ADC1);  
    if(counter == 199)
    {
      flag = 1;
      counter = 1;
    }
  }
 if((counter<=199)&&flag == 1)
 {
   Umass_B[counter] = read_adc(ADC2);
   if(counter == 199)
   {
     flag = 2;
     counter = 1;
   }
 }
 if((counter<=199)&&flag ==2)
 {
   Umass_C[counter] = read_adc(ADC3);
   if(counter == 199)
   {
     flag = 3;
      
   }
 }
 }   

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

мне кажется на мусор похоже в аналоговой части

а ОУ какой поставили?

DimaP.
Offline
Зарегистрирован: 21.04.2013

MCP617 вроде как специально для измерительных приборов заточен!

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

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

мож это тот случай чо я выше описывал(где вместо HA17324 порставил lm324). Там тож все нормально измеряет, но иногда проскакивает такой же мусор и железка начинает жестко переключать обмотки :)

DimaP.
Offline
Зарегистрирован: 21.04.2013

Вот с одной проблемой врод бы разобрался в каде небольшой косяк был

в обработке массива, переберались элементы с 0 по 198 , а в ISR я сохранял в массив с 1 по 199 и поэтому в нулевом адресе хранился 0 и вычитая из него подьем на вольта мы получали вот погрешность большую!

но точности все равно пока никакой Помех наверное аналоговая чать ловит много!