Измерение электроэнергии. Часть 1. Измерение напряжения и тока

image

Введение


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

  • Измерение электроэнергии.
  • Качество электроэнергии.
  • Устройства измерения параметров электроэнергии.


В процессе разбора будем решать те или иные практические задачи на микроконтроллерах до достижения результата. Разумеется, большая часть данного цикла будет посвящена измерению переменного напряжения и может пригодиться всем любителям контролировать электроприборы своего умного дома.
По итогам всего цикла мы изготовим некий умный электросчетчик с выходом в интернет. Совсем отъявленные любители контролировать электроприборы своего умного дома могут оказать посильную помощь в реализации коммуникационной части на базе, например MajorDomo. Сделаем OpenSource умный дом лучше, так сказать.
В этой серии в двух частях мы разберем следующие вопросы:

  • Подключение датчиков тока и напряжения в устройствах постоянного тока, а также однофазных и трехфазных цепей переменного тока;
  • Измерение действующих значений тока и напряжения;
  • Измерение коэффициента мощности;
  • Полная, активная и реактивная мощность;
  • Потребление электроэнергии;


Подкатом вы найдете ответы на первые два вопроса данного списка. Я намеренно не затрагиваю вопросы точности измерения показателей и с данной серии лишь радуюсь полученным результатам с точностью плюс-минус лапоть. Этому вопросу я обязательно посвящу отдельную статью в третьей серии.

1. Подключение датчиков



В прошлом цикле про датчики напряжения и тока я рассказал о видах датчиков, но не рассказал о том как ими пользоваться и куда их ставить. Пришло время это исправить
Подключение датчиков постоянного тока
Понятно что весь цикл будет посвящён системам переменного тока, но быстро пробежимся и по цепям постоянного тока, так как это может нам пригодиться при разработке источников питания постоянного тока. Возьмем к примеру классический понижающий преобразователь с ШИМ:
d352550f2c04401ea57bcda120ee3790.png
Рис 1. Понижающий преобразователь с ШИМ
Нашей задачей является обеспечение стабилизированного выходного напряжения. Кроме того, на основании информации с датчика тока возможно контролировать режим работы дросселя L1, не допуская его насыщения, а также реализовывать токовую защиту преобразователя. И честно говоря, вариантов установки датчиков особо и нет.
Датчик напряжения в виде резистивного делителя R1-R2, который единственный способен работать на постоянном токе, устанавливается на выходе преобразователя. Как правило специализированная микросхема преобразователя имеет вход обратной связи, и прилагает все усилия для того, чтобы на этом входе (3) оказался определённый уровень напряжения, прописанный в документации на микросхему. Например 1,25В. Если наше выходное напряжение с этим уровнем совпадает — все хорошо — мы напрямую подаем выходное напряжение на этот вход. Если нет, то устанавливаем делитель. Если нам надо обеспечить выходное напряжение в 5В, то делитель должен обеспечивать коэффициент деления 4, т. е. Например R1 = 30к, R2 = 10к.
Датчик тока обычно устанавливается между источником питания и преобразователем и на микросхему. По разности потенциалов между точками 1 и 2, и при известном сопротивлении резисторы Rs возможно определить текущее значение тока нашего дросселя. Устанавливать датчик тока между источников и нагрузкой не самая хорошая идея, так как конденсатор фильтра будет отрезан резистором от потребителей импульсных токов. Установка резистора в разрыв общего провода тоже нге сулит ничего хорошего — будет два земляных уровня с которыми возиться то еще удовольствие.
Проблемы падения напряжения можно избежать путем использования бесконтактных датчиков тока — например датчиков холла:
90cb6b1e298b4d408bd27d971218781e.png
Рис 2. Бесконтактный датчик тока
Однако есть более хитрый способ измерения тока. Ведь на транзисторе точно также падает напряжение и через него течет тот же самый ток что и индуктивность. Следовательно, по падению напряжения на нем можно также определить текущее значение тока. Честно говоря, если посмотреть на внутреннюю структуру микросхем преобразователей, например, от Texas Instruments — то такой способ встречается так же часто как и предыдущие. Точность такого способа конечно не самая высокая, но для работы токовой отсечки этого вполне достаточно.
2fdecbbab26c483ea476483e32e2a0c9.png
Рис 3. Транзистор в качестве датчика тока
Аналогично поступаем в других схемах подобных преобразователей, будь то повышающий или инвертирующий.
Однако необходимо отдельно упомянуть о трансформаторных прямоходовом и обратноходовом преобразователях.
1d7ebd4b13214a919014f35a8a672b24.png
Рис 4. Подключение датчиков тока в обратноходовых преобразователях
В них точно также может использоваться либо внешнее сопротивление, либо транзистор в его роли.
На этом с подключением датчиков в преобразователи постоянного тока мы закончили. Если у вас есть предложения по другим вариантам — с удовольствием дополню ими статью.
1.2 Подключение датчиков в однофазные цепи переменного тока
В цепях переменного тока у нас гораздо больший выбор возможных датчиков. Рассмотрим несколько вариантов.
Самый простой — использование резистивного делителя напряжения и токового шунта.
458c52e436ac451d96927f6d3a14d772.png
Рис 5.Подключение резисторных датчиков
Однако, у нее усть пара существенных недостатков:
Во-первых, либо мы обеспечим значительную амплитуду сигнала с токового шунта, выделив большое количество мощности на нем, либо будем довольствоваться малой амплитудой сигнала и впоследствии усиливать его. А во-вторых, резистор создает разность потенциалов между нейтралью сети и нейтралью прибора. Если прибор изолирован — то это не имеет значения, если же у прибора есть вывод заземления, то мы рискуем остаться без сигнала с датчика тока, так как закоротим его. Пожалуй стоит попробовать датчики, работающие на других принципах.
Например, воспользуемся трансформаторами тока и напряжения, либо датчиком тока на эффекте холла и трансформатором напряжения. Здесь гораздо больше возможностей по работе с оборудованием, так как нулевой провод не имеет потерь, а главное — в обоих случаях присутствует гальваническая развязка измерительного оборудования, что часто может пригодиться. Однако, необходимо учитывать, что трансформаторные датчики тока и напряжения имеют ограниченную частотную характеристику и если мы захотим измерить гармонический состав искажений, то у нас это не факт что выйдет.
b59304c2821d45ef87501f76acfa232a.png
Рис 6.Подключение трансформаторных и бесконтактных датчиков тока и напряжения
1.3 Подключение датчиков в многофазные цепи сетей переменного тока
В многофазных сетях наши возможности по подключению датчиков тока немного меньше. Связано это с тем, что токовый шунт использовать совсем не получится, так как разность потенциалов между шунтами фаз будет колебаться в пределах сотен вольт и мне не известен ни один контроллер общего применения, аналоговые входы которого способны выдержать такое издевательство.
Один способ использовать токовые шунты конечно есть — для каждого канала необходимо сделать гальванически развязанный аналоговый вход. Но гораздо проще и надежнее использовать другие датчики.
В своем анализаторе качества я использую резистивные делители напряжения и выносные датчики тока на эффекте холла.
3e5d90547af64b41a48bcfe42ee82429.png
Рис 7.Датчики тока в трехфазной сети
Как видно из рисунка, мы используем четырехпроводное подключение. Разумеется вместо датчиков тока на эффекте холла можно взять трансформаторы тока или петли Роговского.
Вместо резистивных делителей можно использовать трансформаторы напряжения, причем как для четырехпроводной так и для трехпроводной системы.
В последнем случае первичные обмотки трансформаторов напряжения подключаются треугольником, а вторичные звездой, общая точка которых является общей точкой измерительной цепи
e4d100cf4d3048338dd15cacdb92a373.png
Рис 8.Использование трансформаторов напряжения в трехфазной сети

2 Действующее значение тока и напряжения



Пришло время решить задачу измерения наших сигналов. Практическую значимость для нас представляет в первую очередь действующее значение тока и напряжения.
Напомню матчасть из цикла по датчикам. С помощью АЦП нашего микроконтроллера через равные промежутки времени мы будем фиксировать мгновенное значение напряжения. Таким образом, за период измерения у нас будет массив данных уровня мгновенного значения напряжения (для тока все аналогично).
f70ca706313a41a784c27c270cbd6eb2.png
Рис 9. Серия мгновенных значений напряжения
Наша задача — произвести подсчет действующего значения. Для начала воспользуемся формулой интеграла:
41754627def647e89dce0c4037146eba.gif (1)
В цифровой системе приходится ограничиваться неким квантом времени, так что мы переходим к сумме:
17cf0ab2355a4a86a67504036f331c6b.gif(2)
Где c7cac5dece7f4d03b262ad4c8ad30317.gif — период дискретизации нашего сигнала, а 28963f958bf74b1888aeef21b047c567.gif — число отсчетов за период измерения. Где-то здесь я в видео начинаю втирать дичь про равенство площадей. Надо было выспаться в тот день. =)
В микроконтроллерах MSP430FE4252, которые применяются в однофазных электросчетчиках Меркурий, за период измерения равный 1, 2 или 4 секунд производится 4096 отсчетов. На T=1с и N=4096 мы и будем опираться в дальшейнем. Более того, 4096 точек в секунду позволят нам использовать алгоритмы быстрого преобразования фурье для определения гармонического спектра вплоть до 40 гармоники, как того требует ГОСТ. Но об этом в следующей серии.
Набросаем алгоритм для нашей программы. Нам требуется обеспечить стабильный запуск АЦП каждую 1/8192 секунды, так как у нас два канал и измерять мы будем эти данные попеременно. Для этого настроим таймер и сигнал прерывания будет автоматически перезапускать АЦП. Все АЦП так умеют.
Писать будущую программу будем на arduino, так как она у многих под рукой. У нас пока чисто академический интерес.
Имея частоту системного кварца 16МГц и 8-разрядный таймер (чтобы жизнь медом не казалась) нам необходимо обеспечить частоту срабатывания хоть какого прерывания таймера с частотой 8192Гц.
Печалимся по поводу того что 16МГц цело не делится как нам надо и итоговая частота работы таймера 8198Гц. Закрываем глаза на погрешность в 0,04% и все равно считываем по 4096 выборок на канал.
Печалимся по поводу того, что прерывание по переполнению в arduino занято расчетом времени (отвечает за millis и delay, так что это работать нормально перестанет), так что пользуемся прерыванием по сравнению.
А еще внезапно понимаем, что сигнал к нам приходит биполярный, и что msp430fe4252 с ним прекрасно справляется. Мы же довольствуемся униполярным АЦП, поэтому на операционном усилителе собираем простой преобразователь биполярного сигнала в униполярный:
18f0ddc202544b24be6d684ce9d98c23.png
Рис 10.Преобразователь биполярного сигнала в униполярный
Причем наша задача обеспечить колебание нашей синусоиды относительно половины опорного напряжения — тогда мы либо отнимем половину диапазона либо активируем опцию в настройках АЦП и получим знаковые значения.
В Arduino 10-разрядный АЦП, поэтому из беззнакового результата в пределах 0-1023 будем вычитать половину и получим -512- 511.
Проверяем модель, собранную в LTSpiceIV и убеждаемся, что все работает как надо. В видеоматериале дополнительно убеждаемся экспериментально.
3de3201f66f94937b29504236ded1044.png
Рис 11.результат моделирования. Зеленым исходный сигнал, синим — выходной

Скетч для Arduino для одного канала
void setup()
{
  autoadcsetup();
  DDRD |=(1<<PD2)|(1<<PD3);
  Serial.begin(38400);
}


double urms = 0;
double utemp = 0;
int umoment = 0;
int N = 0;
int flag = 0;
void loop()
{
  if (flag){
    flag = 0;
    Serial.println(urms);
  }
}
int i = 255;

void autoadcsetup(){
  //set up TIMER0 to  4096Hz
  //TIMER0_OVF will be the trigger for ADC
  /*normal mode, prescaler 16
   16MHz / 64 / 61 = 4098 Hz 0.04% to 4096Hz*/
  TCCR0B = (1 << CS01)|(1 << CS00);//timer frequency = clk/64
  OCR0A = 60;//61-1
  TIMSK0 = (1<<OCIE0A);
  //set ADC.
  ADMUX =  (1 << REFS0);//8-bit mode, ADC0 channel, AVVCC as ref
  ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2);//TUrn ADC On, trigger enable, Interrupt enable, sysclk/16=1MHz_ADC_clk=76kHz conv freq(13ticks per conversion)
  ADCSRB = (1<< ADTS1) | (1<<ADTS0) | (1<<MUX5);//Auto trigger source
}

ISR(TIMER0_COMPA_vect){
  if (PIND & (1<<PD2)){
    PORTD &= ~(1<<PD2);
  }
  else{
    PORTD |=(1<<PD2);
  }
  TCNT0 = 0;

}


ISR(ADC_vect){

  if( ( UCSR0A & (1<<UDRE0)) ){
    umoment = ADCL;//copy result.
    umoment += (ADCH<<8);
    umoment = umoment - 512;
    utemp = utemp + pow((double)(umoment),2)/4096;
    N++;
    if (N == 4095){
      urms = sqrt(utemp)/102;
      N = 0;
      utemp = 0;
      flag = 1;
      if (PIND & (1<<PD3)){
        PORTD &= ~(1<<PD3);
      }
      else{
        PORTD |=(1<<PD3);
      }
    }
  }
}


Программа написана в среде Arduino IDE для микроконтроллера ATmega1280. На моей отладочной плате первые 8 каналов разведены для внутренних нужд платы поэтому используется канал ADC8. Возможно использовать данный скетч и для платы с ATmega168, однако необходимо выбрать правильный канал.
Внутри прерываний передергиваем пару служебных пинов чтобы наглядно видеть рабочую частоту оцифровки.
Пару слов о том, откуда взялся коэффициент 102. При первом запуске с генератора подавался сигнал различной амплитуды, с осциллографа считывалось показание действующего значения напряжения, а из консоли забиралось рассчитанное значение в абсолютных единицах АЦП.

Umax, В Urms, В Counted
3 2,08 212
2,5 1,73 176
2 1,38 141
1,5 1,03 106
1 0,684 71
0,5 0,358 36
0,25 0,179 19


Разделив значения третьего столбца на значения второго получаем в среднем 102. Это и будет наш «калибровочный» коэффициент. Однако можно заметить, что при снижении напряжения точность резко падает. Это происходит из-за низкой чувствительности нашего АЦП. Фактически 10 разрядов для точных расчётов катастрофически мало и если напряжение в розетке измерить таким образом вполне получится, то поставить 10-разрядный АЦП на измерение потребляемого нагрузкой тока будет преступлением против метрологии.

На данном моменте мы прервемся. В следующей части рассмотрим другие три вопроса данной серии и будем плавно переходить к созданию непосредственно самого устройства.

Представленную прошивку, а также другие прошивки для данной серии (так как видеоматериалы я снимаю быстрее чем подготавливаю статьи) вы найдете в репозитории на GitHub: github.com/radiolok/arduino_rms_count
Что касается разработки электросчетчика, за основу будет взят референс от TI SimpleLink WiFi CC3200 SmartPlug, новость о котором буквально на днях прилетела мне на почту. Мне очень нравится микроконтроллер CC3200, поэтому мы разработаем бустерпак для существующего ланчпада и реализуем все интересующие нас возможности. Не забудем сделать и так, что это сносно работало и на других микроконтроллерах.

В комментарии приглашается progchip666, для замечаний и дополнений по материалу, а также smart_alex как ранее интересовавшийся вопросом измерения тока и напряжения именно с помощью Arduino.

© Geektimes