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

подал на 3 входа по 220 вольт и настроил делители напряжения, получив на выходе примерно по 1.2 вольта,
Подключил к осцелографу все в норме!
Потом я к одному из входов подключил ЛАТР

и получилось вот что если U1 = U2 = U3 то на всех выходах мы имеем примерно по 1.2 вольта
Но если С помощью ЛАТРа уменьшить одно из напряжений примерно до 180 вольт и меньше, напряжение на выходе не падает ниже 0.8 вольт.
А на осцилографе подключенному к выходу на котором мы получаем 0.8 вольт я увидел вот такую форму сигнала

Если разорвать обвязку земли на схеме то данное явление пропадает!!
Подскажите почему это происходит и как с этим бороться!
Если не секрет для чего такая схемотехника?
Да пытался сделать 3 фазный вольтметр!!! цифровую часть готова, а вот с алоговой проблема!!
А зачем так сложно, просто по одному диоду и делителю на двух резисторах на каждую фазу и далее на входы контроллера (среднеквадратическое 5В как опорное). Вот Вам напряжение на каждой фазе.
Общий - от нижнего резистора делителя на GND.
Если разорвать обвязку земли на схеме то данное явление пропадает!!
В какой мере разорвать? Разделить каналы или отключить землю?
И потом это реальное подключение к сети 220 или модель в Протеусе? То есть вопрос по реальной цепи или теоретической?
Dimap, вольтметр так и не доделали?
Dimap, вольтметр так и не доделали?
Так вот до сих пор и занимаюсь им!!! 1 фазное измерение дает хорошие результаты!! А вот как пытаюсь сделать что либо 3х фазное получается билеберда( Так было и с ОУ, и теперь с выше показанной схемой проблемы!!
Если разорвать обвязку земли на схеме то данное явление пропадает!!
Разорвать это значит каждый канал рассматривать отдельно!! Проверял на реальном осцелографе!
Причем в протеусе моделирование данной схемы, вышеописанной проблемы не проявляется!
на работу дойду, гляну схему 3Ф стабилизатора. Как там сделано
На сколько помню, там просто 3 канала измерения U и датчик обрыва фазы на кондерах.
дома нашел... давай мыло, скину схему
Попробуйте изменять ЛАТРом напряжение и в других каналах (поочерёдно). Возмжно проблема только в данном канале?
Далее. Вы планируете контролировать реальное трёхфазное напряжение именно с такой гальванической развязкой или это тренировочный макет (что бы не стукнуло током)?
как бы еще протеус ничо такого не намоделировал, а то у него есть загоны :)
заранее благодарен за схему!!
Попробуйте изменять ЛАТРом напряжение и в других каналах (поочерёдно). Возмжно проблема только в данном канале?
Далее. Вы планируете контролировать реальное трёхфазное напряжение именно с такой гальванической развязкой или это тренировочный макет (что бы не стукнуло током)?
нет проблема общая для всех каналов!!
Хотел использовать в реальном устройстве! но на других форумах дидный мост все хают за его не прецизионность!! хотя когда 1 фазу я мерил, получалось точность менее 1%. я считаю это достаточно неплохо! но при изменении температуры наверняка напряжение плавало в диапазоне 3 вольт! Но это опять же "я так Думаю"
отправил
отправил
спасибо большое схему посмотрел!! вроде все понятно!!!ОУ применен аналог LM324. единственно в чем вопрос, в протеусе эта схема моделируется идеально и все вроде хорошо! но вот при реальном ее воплощении получается синусоида вида
т.е одна на другую накладывается, Это наверное происходит из за большого Uсм lm324.
ну там есть подстроечный резистор в ОС ОУ
единственное что (я хз почему), если поменять HA17324 на LM324(вроде как аналог), железка начинает работать нестабильно. В др схемах, где ОУ LM324 входные сопротивления порядка 2 х 300к в каждом плече
Попробую собрать на R-to-R операционниках MCP617 вроде у них напряжение смещение низкое! ! вот только про сопративления в плечах оу пока непонятно это по сути делитель напряжения получается???
та вроде делитель, но в той схеме чо я те скинул используют HA17324. И там в плечах сопротивление полуучается под 3МОм(2.85), в ОС 8к2 , для LM324 китайские братья в плечах берту 2х300кОм и обратная свзяь в ОУ 2.8К и опорное напряжение 2В подается через 2.8к.
Просто сам столкнулся с проблемой: при ремонте стабилизатора тупо поменял HA17324 на LM324, вроде как аналоги. В результате стабилизатор начинает через случайный момент времени показывать неправильное напряжение, ну и клинет его :)
Я сам не электронщик, но думаю это связано как то с входным сопротивлением ОУ.
думаю это связано как то с входным сопротивлением ОУ.
это врядли т.к входное сопративление ОУ измеряется если не гигаомами то сотнями мегом, а вот проблема с lm324 непонятная, если ставишь по 600 килоом в плече то получается напряжение на выходе выше нормы при достижении Uвх примерно 150 вольт.
Вообщем я попробую собрать схему на прецизионных ОУ и посмотрим что получится из этого всего!
а в обратной связи меняешь сопротивления, там по 2.8к надо ставить
я попробую разные варианты!!! переменный многооборотный резистор, покручу и посмотрю через осцелограф что получится.
собрал схему сегодня
подключил к осцелографа, нормальная синусоида поднятая 2 вольта и при подаче пременного напряжения изменяется в пределах вольта
как только подключил к устройству и попробовал покрутить ЛАТРом получается
вот незнаю в чем дело((
вот скеч
#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; } } }мне кажется на мусор похоже в аналоговой части
а ОУ какой поставили?
MCP617 вроде как специально для измерительных приборов заточен!
Да может и мусор, а почему тогда напряжение стабильно, не плавает.
мож это тот случай чо я выше описывал(где вместо HA17324 порставил lm324). Там тож все нормально измеряет, но иногда проскакивает такой же мусор и железка начинает жестко переключать обмотки :)
Вот с одной проблемой врод бы разобрался в каде небольшой косяк был
в обработке массива, переберались элементы с 0 по 198 , а в ISR я сохранял в массив с 1 по 199 и поэтому в нулевом адресе хранился 0 и вычитая из него подьем на вольта мы получали вот погрешность большую!
но точности все равно пока никакой Помех наверное аналоговая чать ловит много!