Чтение переменного напряжения в Arduino


8

Используя Arduino Nano и трансформатор тока (CT), я пытаюсь почувствовать ток, протекающий через линию 120 В 60 Гц.

схема

Выходы КТ в 0-1 Vсоответствии с его спецификациями Этот выход смещен AREF/2= 2,5 В.

Введите описание изображения здесь

analogRead Ценности

Ось X представляет номер индекса образца АЦП, а ось Y представляет значение АЦП (0-1024). Частота дискретизации составляет около 9 кГц. Разница между пиками составляет около 1026 образцов.

Введите описание изображения здесь

Это форма волны, что вы ожидаете от CT? Почему существуют регионы, где значения являются плоскими, а не постоянно меняются?

Кроме того, если мы посмотрим на кривую часть графика, почему Arduino читает значения выше 512и ниже 512попеременно? Он читает значение выше 512, затем значение ниже 512, затем значение выше 512и так далее.

Время, затраченное на analogReadизмерение, составило 110 микросекунд для моей установки, и между пиками формы сигнала было 1026 выборок. Это означает, что в течение 1 секунды будет около 9 пиков, хотя я ожидаю 60 пиков, поскольку мы ощущаем линию 60 Гц. Что вы делаете из этого? В C1цепи есть конденсатор, это как-то связано с этим?

Подходят ли эти значения analogRead для расчета среднеквадратичного напряжения и, следовательно, среднеквадратичного тока, проходящего через измеряемый провод? Конечной целью этого является вычисление потребления энергии после определения действующего значения тока, протекающего через провод.

Эскиз, используемый для получения значений для сюжета

void setup() {
    Serial.begin(9600);
}

void loop() {
   double sensorValue = analogRead(1);
   Serial.println(sensorValue)
}

Фактические analogReadданные в точках рельефа

487
534
487
535
488
537
484
536
487
538
486
536
484
540
484
539
485
540
483
540
484
541
481
539
481
540
484
540
480
543
484
539
481
540
484
541
486
542
485
538
485
538
488
535
489
534
491
530
491
529
493
531
492
526
498
526
499
524
499
520
503
518
502
518
507

График аналоговых значений

Значения analogRead теперь сохраняются в буфере перед передачей через последовательный порт. В настоящее время существует 55 точек данных АЦП, составляющих 1 период. Учитывая, что время аналогового чтения составляет 110 мкс, каждый цикл занимает 6,05 мс, что дает нам частоту 165 Гц! Что могло пойти не так?

Введите описание изображения здесь

void loop() {
    double sensorValue = analogRead(1);
    char buf[32];

    dtostrf(sensorValue, 8, 2, buf);
    value = buf;

    if (stop == 0) {
        if (i < 10000) {
            message += ',';
            message += value;
            i++;
        }
        else {
            stop = 1;
            Serial.println(message);
        }
    }
}

Вы можете разместить свой код? Это выглядит не совсем правильно. Когда вы говорите «Предполагая, что 100 мс проходит», почему мы это предполагаем?
Cybergibbons

@Cybergibbons Опубликовал код, используемый для генерации значений для графика. Извините, я только что измерил время, затраченное на, analogRead()и обнаружил, что оно составляет 110 микросекунд. Обновил вопрос.
Nyxynyx

Какую нагрузку вы используете для сети. В идеале вы хотите что-то довольно стабильное, как лампа накаливания. Если у вас есть что-то сложное, например, блок питания для ноутбука, который может иметь различную нагрузку, вы можете ожидать сложного результата.
Salix alba

1
Большая часть времени в цикле будет потрачена на отправку последовательного соединения со скоростью 9600 бит / с. Вы будете сдвигать только 960 символов в секунду, т.е. каждое чтение занимает 4 мс.
Cybergibbons

@Salixalba Нагрузка - это настольный компьютер с импульсным источником питания. Я попробую измерить другую нагрузку, например, нагреватель.
Nyxynyx

Ответы:


5

Что касается ваших измерений, я бы полностью проигнорировал первый набор с Serial.println () в цикле. Я ожидаю, что время этого будет ненадежным.

Ваш второй набор данных, которые вы записали в буфер, выглядит правильно, но ваша оценка / синхронизация частоты может быть неправильной. Я бы инвертировал цифровой выход на каждой итерации цикла. Вы можете измерить частоту этого с помощью мультиметра, и ваша частота дискретизации АЦП будет вдвое больше этого значения.

Для блока питания ПК или ноутбука это довольно распространенная форма сигнала тока.

Без эффективной коррекции коэффициента мощности текущий сигнал, показанный ниже, будет довольно типичным (источник: http://www.nlvocables.com/blog/?p=300 ).

http://www.nlvocables.com/blog/?p=300

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

Вот инструкция, которую я написал о том, как создать и кодировать монитор электричества на основе Arduino Yun с поддержкой облака / Temboo и Google Drive. Это должно вам помочь.


Спасибо! КТ, который вы использовали, выдает -1В до 1В. Чтобы использовать 10-битный АЦП, увеличите ли вы выход SCT на 2,5, используя операционный усилитель? Или установите AREF на 2 В и
сместите

Нет, я не усиливал это или изменял Ареф.
akellyirl

Как вы могли получить этот график график? С каким программным обеспечением?
Zgrknr

0

если вы измеряете резистивную нагрузку, я бы сказал, что выбранный вами нагрузочный резистор неправильный, на ebay есть несколько дешевых трансформаторов тока (SCT-013-xxx), которые имеют версии с нагрузочными резисторами и без них, они хорошо работают за свою цену но вы должны прочитать таблицу. SCT-013-000 требуется резистор 20R для вывода 1 В с нагрузкой 100А. Если этот резистор не так, вы можете получить сильно искаженную форму волны при измерении более высоких токов (аналогично тем, которые вы предоставили), вы ожидаете, что сигнал чем больше искажение, тем ниже значение нагрузочного резистора, но это не относится к ТТ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.