Мгновенное значение напряжения

Feralist
Offline
Зарегистрирован: 28.02.2015

Доброго дня, товарищи!

Имеется задачка измерять мгновенное напряжение сети 0.4 кВ и др. параметры сети. Собрана схема как показано на картинке и чего то ни как не могу понять как бы мне измерить мгновенное напряжение. Конкретно не пойму как быть с задержкой между измерениями. Примерно надо получить 20 точек за 1 период и все эти значения записать на флешку. Прошу Вашей помощи.

Arduino AC voltage input circuit diagram

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А период-то какой?

И змерять чем собираетесь? Если ардуиной, то какой именно?

Feralist
Offline
Зарегистрирован: 28.02.2015

Частота в сети 50 Гц, период соответственно 0.02 секунды. Ардуина Мега имеется

b707
Offline
Зарегистрирован: 26.05.2017

Feralist пишет:

Частота в сети 50 Гц, период соответственно 0.02 секунды. Ардуина Мега имеется

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

Feralist
Offline
Зарегистрирован: 28.02.2015
int analogPin = A9;

void setup()
{
 analogReference(EXTERNAL); // выбираем опорное напряжение 5V
 Serial.begin(9600);
}

void loop() 
 float analogValue = analogRead(analogPin); // читаем значение на аналоговом входе
 float U1 = ((5/1024.0)*analogValue);
 Serial.println(U1); // выводим его в последовательный порт
 delay(1);
}

Код выше. Использую опорное напряжение 5В. 

Дает примерно следующие значения: 

2,5
3,27
3,58
3,94
3,73
2,9
2,08
1,41
1,11
1,38
2,25
3,06
3,71
3,94
3,57
2,68
1,89
1,28
1,1
1,57
2,47
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если мега 2561, то самый аккуратный способ измерять с определённой частотой - это сконфигурировать АЦП, так, чтобы он автоматически измерял напряжение по таймеру 0 или 1 (можно по сравнению, а можно по переполнению) (см. разд. 26.3 и 26.8 даташита) и выдавал прерывание. Тогда останется только сконфигурировать таймер на нужную частоту (1kHz в Вашем случае) и снимать готовые показания в программе-обработчике прерывания, а дольше делайте с ними что хотите, хоть на бумажку записывайте.

Если требования к точности интервалов некритичны, то можно безо всяких хитрых кофигураций читать analogRead раз в миллисекунду (например, через delayMicroseconds(1000) или через micros()).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы уверены, что знаете, что делаете в этой строке?

analogReference(EXTERNAL); 

Т.е. у Вас реально на соответсвующий пин подведено 5В?

Feralist
Offline
Зарегистрирован: 28.02.2015

Уверен. Замерено точным хорошим мультиметром и выставлено жестко 5В.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На пине ARef, так? Ну, тогда всё замечательно.

В Вашем скетче есть систематическая ошибка. Период измерения всегда больше 1ms на время работы строк 10-12. Хотите точнее, делайте с micros(). Ну, а наиболее точно - с ADC от таймера, как я описывал выше.

ВН
Offline
Зарегистрирован: 25.02.2016

еще бы не мешало засинхронизироваться с сетью, программно или аппаратно

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Feralist пишет:

int analogPin = A9;

void setup()
{
 analogReference(EXTERNAL); // выбираем опорное напряжение 5V
 Serial.begin(9600);
}

void loop() 
 float analogValue = analogRead(analogPin); // читаем значение на аналоговом входе
 float U1 = ((5/1024.0)*analogValue);
 Serial.println(U1); // выводим его в последовательный порт
 delay(1);
}

Давайте для начала разберем, с какой частотой у нас будет осуществляться опрос (т.е. каков интервал между измерениями).

строка 10:

- аналого-цифровое преобразование - 112 мкс,

- преобразование из целого в плавающую точку - около 15 мкс,

строка 11: 

- умножение с плавающей точкой - еще 15 мкс.

строка 12: вывод в последовательный порт:

- от 4 до 7 мс (4000-7000 мкс!),

строка 13 - задеоржка в 1000 мкс.

Итого: в среднем около 6.5-7 мс. Т.е. 3 раза за период. Вы считаете этого достаточно?

Как сделал бы я:

- завел массив на 20 (или больше) значений типа int,

- в цикле analogRead() без преобразования пишется прямо в массив + delayMicroseconds(885).

Т.е. одна итерация цикла будет выполняться как раз около 1000 мкс.

А когда массив будет заполнен - обрабатывать его по желанию: переводить в Вольты, искать максимум или минимум и т.п. и уже обработанное выводить в последовательный порт.

nik182
Offline
Зарегистрирован: 04.05.2015

Посмотрите как микроконтроллер подключён к сети: http://www.ti.com/lit/df/tidr430/tidr430.pdf

Раньше на сайте TI лежал документ slaa391 с описанием всего, расчётами, блок-схемами, сейчас я его найти не могу, но есть другие со схемами и теорией как измерять параметры сетевого напряжения. Ищется по ключевым словам  Three Phase Electronic Watt Hour meter Design. 

 

GarryC
Offline
Зарегистрирован: 08.08.2016

Я что то не понял, в чем проблема - у Вас все правильно померяло и даже тайминг неплохой - 10 измерений на период, уберите строку 13 и будет Вам счастье :)