Ацп для измерения напряжения

Аналого-цифровые преобразования — АЦП

Не секрет, что все величины в физическом мире носят аналоговый характер. Для измерения этих величин, люди придумали множество различных приборов. Так, например, термометр позволяет узнать температуру вещества, барометр — давление газа, гигрометр — влажность воздуха. А с помощью весов можно измерить вес тела.

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

Чтобы автоматизировать процесс измерения аналоговых величин, и возложить эту задачу на электронные приборы, инженеры создали особое устройство, называемое аналого-цифровым преобразователем (АЦП). Это устройство позволяет превращать аналоговый сигнал в цифровой код, пригодный для использования в ЭВМ.

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

Конструктивно, АЦП может находиться в одном корпусе с микропроцессором или микроконтроллером, как в случае Arduino Uno. В противном случае, как и все современные электронные устройства, АЦП может быть оформлен в виде отдельной микросхемы, например MCP3008:

MCP3008_1-500x500

Следует отметить, что существует и устройство с обратной функцией, называемое цифро-аналоговым преобразователем (ЦАП, DAC). Оно позволяет переводить цифровой сигнал в аналоговый. Например, во время проигрывания мелодии на мобильном телефоне происходит преобразование цифрового кода из MP3 файла в звук, который вы слышите у себя в наушниках.

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

Функции работы с АЦП

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

ARDUINO_V2_sub2

На карте Arduino Uno аналоговые входы имеют буквенно-цифровые обозначения A0, A1, …, A5 (снизу слева).

Во время работы всё с теми же кнопками, мы познакомились с функцией digitalRead, которая умеет считывать цифровой сигнал с определенного входа контроллера. У этой функции существует аналоговая версия analogRead, которая может делать то же самое, но только для аналогового сигнала.

результат = analogRead( номер_контакта );

после вызова этой функции, микроконтроллер измерит уровень аналогового сигнала на заданном контакте, и сохранит результат работы АЦП в переменную «результат». При этом результатом функции analogRead будет число от 0 до 1023.

Разрядность АЦП

Надо заметить, что число 1023 здесь появилось неспроста. Дело в том, что у каждого устройства АЦП есть такой важный параметр как разрядность. Чем больше значение этого параметра, тем точнее работает прибор. Предположим, что у нас есть АЦП с разрядностью 1. Подавая на вход любое напряжения от 0 до 2,5 Вольт, на выходе мы получим 0. Любое же напряжение от 2,5 до 5 вольт даст нам единицу. То есть 1-битный АЦП сможет распознать только два уровня напряжения. Графически это можно изобразить следующим образом:

adc-1bit

АЦП с разрядностью 2 распознает уже четыре уровня напряжения:

  • от 0 до 1,25 — это 0;
  • от 1,25 до 2,5 — это 1;
  • от 2,5 до 3,75 — это 2;
  • наконец, от 3,75 до 5 — это 3.

На следующих двух картинках изображена работа АЦП с разрядностью 2 и 3 бит:

adc-2-4bit

В Arduino Uno установлен 10-битный АЦП, и это значит, что любое напряжение на аналоговом входе в диапазоне от 0 до 5 вольт будет преобразовано в число с точностью 1/1024 вольта. На графике будет сложно изобразить столько ступенек. Имея такую точность, 10-битный АЦП может «почувствовать» изменение напряжение на входе величиной всего 5 милливольт.

Опорное напряжение

Есть нюанс, который может стать причиной ошибки измерения с помощью АПЦ. Помните тот диапазон от 0 до 5 вольт в котором работает устройство? В общем случае этот диапазон выглядит иначе:

от 0 до опорного напряжения

Это изменение повлечет за собой изменение формулы расчет точности АЦП:

точность = опорное напряжение/1024

Опорное напряжение определяет границу диапазона, с которым будет работать АЦП.

В нашем примере опорное напряжение будет равно напряжению питания Arduino Uno, которое дал USB порт компьютера. У моем конкретном случае это напряжение было 5.02 Вольта, и я могу смело заявить, что измерил заряд батарейки с высокой точностью.

Что если вы питаете микроконтроллер от другого источника? Допустим у вас есть четыре NiMh аккумулятора на 1.2 Вольта. В сумме они дадут 4.8 Вольта (пусть они немного разряжены, ведь в действительности их заряжают до 1.4 Вольта). Точность измерения будет равна 4.8/1024. Это следует учесть в нашей программе.

Наконец рассмотрим случай, когда мы питаем Arduino Uno одним напряжением, а в качестве опорного хотим установить совсем другое, например, 3.3 Вольта. Что делать? Для такого варианта на Arduino Uno есть специальный вывод Vref. Чтобы решить проблему, нам нужно подать на этот контакт напряжение 3.3 Вольта, и разрешить использование внешнего источника опорного напряжения функцией:

analogReference(EXTERNAL);

которую следует вызвать внутри функции setup нашей программы.

Также следует учитывать, что результат измерения значения напряжения не может превышать границы диапазона. Если мы выбираем в качестве опорного напряжения 3.3 Вольта, а поступающий сигнал будет с большим напряжением, то мы получим неправильное значение напряжения, поскольку АЦП «не знает» о наличии более высокого напряжения.

Программа

Наша первая программа с использованием АЦП будет крайне простой: каждую секунду мы будем измерять аналоговое значение на входе A0, и передавать его в последовательный порт.

int val = 0; void setup() < Serial.begin(9600); pinMode(A0, INPUT); >void loop()

Теперь загружаем программу на Arduino, и переходим к измерениям.

Подключение

Чтобы измерить напряжение на батарейке, мы должны подключить её к нашей Arduino всего двумя контактами. Для примера используем щелочную батарейку на 1.5 Вольта.

adc_bb_

Теперь откроем окно COM-монитора в Arduino IDE, и посмотрим какие значение выдает нам АЦП:

serial_out_adc

Что означает число 314? Вспомним, что 10-битный АЦП разбивает диапазон от 0 до 5 вольт на 1024 части. Значит точность 10-битного АЦП — 5/1024. Зная точность, мы можем записать формулу для преобразования показаний АЦП к вольтам:

где V — измеренное напряжение на батарейке;
ADC — результат работы функции analogRead.

Подставим эту формулу в программу и снова попробуем измерить заряд батарейки!

int val = 0; void setup() < Serial.begin(9600); pinMode(A0, INPUT); >void loop() < val = analogRead(A0); Serial.println((5/1024.0)*val); delay(1000); >

serial_out_adc_v

Уже больше похоже на правду.

Итог

Итак, мы разобрались с весьма сложной и важной темой в мире электроники. АЦП используется повсеместно, и в робототехнике без этого устройства уж точно не обойтись. Для понимания окружающего мира роботам как-то нужно переводить аналоговые ощущения в числа.

На нашем портале можно найти несколько уроков, выполнение которых зависит от понимания темы АЦП: датчик температуры, ёмкостный датчик, фоторезистор, потенциометр и аналоговый джойстик. А в совокупности с еще одной важной темой — ШИМ, применение АЦП позволит создать диммер светодиодной лампы и регулятор хода двигателя. Успехов!

ShIoTiny и окружающий мир: аналоговые датчики или АЦП для самых маленьких

image

Продолжение серии статей о ShIoTiny — визуально программируемом контроллере на базе чипа ESP8266. Ключевой особенностью данного контроллера является возможность его программирования путем рисования программы в браузере.

В данной статье описана краткая теория аналого-цифрового преобразования и практическое применение АЦП контроллера ShIoTiny.

Предыдущие статьи серии.

Вступление или вместо серьезной теории

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

Но, как известно большей части людей, а также школьников и студентов, основная часть информации об окружающем мире — это аналоговые величины различной физической природы: сила света и звука, скорость движения, давление воздуха, уровень жидкости и так далее.

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

Для тех, кто еще не знает чем отличается аналоговая величина от дискретной напишу краткие пояснения. Кто уже все и так знает — может их пропустить. Сразу оговорюсь — аналогии и упрощения имеют место быть. Это не диссертация, а скорее краткие объяснения на пальцах.

Аналоговые и дискретные величины (профессорам, академикам и вундеркиндам можно не читать)

Математику в школе изучали все. Поэтому обратимся к ней и проведем аналогии между аналоговыми и дискретными величинами и числами.

С точки зрения математики — аналоговая величина есть число вещественное, определенное в любой точке заданного отрезка числовой прямой.

Дискретная величина с точки зрения математики есть число целое. И определено оно только в определенных точках заданного отрезка числовой прямой.

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

image

Для примера рассмотрим отрезок числовой прямой от -4 до 3. Как видим, дискретных величин, обозначенных красными точками — целых чисел на нем всего 8 штук. Аналоговых величин, показанных зеленой линией на рисунке — бесконечное множество.

Например, у нас есть некая величина X, имеющая диапазон значений от 0 до 127. Если мы представляем эту величину как аналоговую, то теоретически мы можем представить ее с любой точностью — например 12.123455454980 или 126.00000000007 или вообще с миллионом знаков после запятой.

Но как только в дело вступает микроконтроллер и величина X обретает дискретное представление — то ни о какой «бесконечной точности» и речи идти не может даже теоретически. Точность ограничена числом двоичных разрядов, которое мы отводим под представление величины Х.

Например, мы возьмем 7 двоичных разрядов. В этом случае мы можем представить величину Х с точностью единица. То есть можно будет указать X=1 или X=112. А вот Х=112.5 уже указать не получится — разрядности не хватит. Если мы возьмем для представления той же величины Х не 7, а 10 разрядов, то точность представления будет уже не единица, а 0.125. И в таком виде можно представить Х=95.125 или X=112.5. Но точнее, например в виде X=112.13 — уже представить эту величину нельзя.

Если вас смущает то, что я пишу дробные значения и при этом говорю о них как о целых числах то вспомните, что «дискретные точки» можно расставить на числовой прямой не через единицу, а например через 0.5 или 0.125 единицы. Но их как было, так и останется конечное значение на любом отрезке. И все свойства дискретной величины сохранятся.

Ключевое отличие дискретной величины от аналоговой — это то, что на любом конечном отрезке числовой прямой будет конечное число дискретных (целых) значений и бесконечное число значений аналоговых (вещественных). Соответственно получаем, что дискретное представление величин всегда обладает конечной точностью.

В итоге всего выше сказанного получаем тривиальный вывод. Большая часть измеримых величин реального мира — аналоговые. Микроконтроллеры работают только с дискретными числовыми представлениями величин. Поэтому, прежде, чем обрабатывать какую-нибудь аналоговую величину с помощью микроконтроллера — эту величину необходимо представить в виде дискретной. Да еще и в двоичном виде.

Такое преобразование из аналогового представления в дискретное называется аналого-цифровым преобразованием.

Аналого-цифровой преобразователь

Устройство для преобразования аналогового сигнала в цифровой называется АЦП (аналого-цифровой преобразователь).

Обычно такое устройство имеет один или несколько аналоговых входов, на которые подается аналоговый сигнал и цифровой выход с заданной разрядностью (обычно — от 8 до 16 разрядов).

В современных микроконтроллерах, в том числе и в нашем ESP8266, имеются встроенные блоки АЦП.

Какие характеристики имеют АЦП вообще и АЦП ESP8266 в частности?

Первая характеристика — это какую именно входную аналоговую величину АЦП преобразует в выходной цифровой код. Чаще всего эта величина — напряжение на аналоговом входе АЦП. Так будет и в нашем случае. Но в природе существуют и АЦП с токовым входом.

Вторая характеристика АЦП, которая нужна на практике — это диапазон значений входной величины АЦП. В нашем случае — это минимальное и максимальное значения напряжения на входе АЦП. Эти значения будут и соответственно. Диапазон входных значений кажется небольшим, но большие напряжения всегда можно поделить и уменьшить, а малые напряжения — усилить.

Третья и, пожалуй, самая важная характеристика АЦП это его разрядность. Эта величина определяет точность преобразования или (по нашей аналогии) — как часто расставлены «дискретные» точки на «вещественной» числовой прямой. В нашем случае АЦП имеет разрядность 10. Что это значит? А это значит, что выходной цифровой код представлен 10 двоичными разрядами и имеет 1024 значения — от 0 до 1023.
Строго говоря, стоит помнить, что точность преобразования зависит не только от разрядности, но и от ряда других параметров, например линейности АЦП. Но об этом уже много написано очень умными дядями в очень умных книгах, поэтому в этой статье я оставлю читателя без подробностей.

Кроме того АЦП ESP8266 умеет определять переполнение, то есть ситуацию, когда на вход подано напряжение больше .

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

Подведем предварительный итог.
В контроллере ShIoTiny имеется АЦП, встроенный в ESP8266.

На вход АЦП ESP8266 подается напряжение в диапазоне от 0 до .

На выходе АЦП ESP8266 мы получаем число, пропорциональное входному напряжению в диапазоне от 0 до 1023. Напряжению соответствует код 0 на выходе АЦП, напряжению соответствует код 1023 на выходе АЦП.

Считывание данных с АЦП в ShIoTiny производятся со скоростью примерно 10 раз в секунду.

Аппаратно вход АЦП защищен от перенапряжения, аналогично тому, как защищены бинарные входы Input1,2,3 (см. тут).

Вот и все, что касается аппаратного обеспечения АЦП ShIoTiny.

Займемся теперь узлом ADC1, который обрабатывает данные с аппаратного АЦП ESP8266.

Программные навороты или узел ADC1

На схеме-программе в редакторе ElDraw, узел аналого-цифрового преобразователя называется ADC1.

Как уже упоминалось, узел ADC1 примерно 10 раз в секунду получает данные с аппаратного АЦП ESP8266. Но на этом указанный узел не успокаивается, а начинает эти данные обрабатывать и даже чуть-чуть анализировать.

Во-первых, проверяется — а не было ли переполнения АЦП? То есть — а не подали ли на вход АЦП больше ? Если такая ситуация обнаружена — то на выход узла ADC1 выставляется значение NAN (не число).

Во-вторых, если не было переполнения, то выходное значение АЦП 0..1023 преобразуется в величину напряжения на входе АЦП — число с плавающей точкой в диапазоне 0..1.

В-третьих, это преобразованное значение 0..1 пересчитывается по формуле , где — напряжение на входе АЦП (от 0 до ); k — диапазон (ADC range) и b — смещение (ADC offset). И, наконец, полученное значение X выставляется на выход узла ADC1.

И, наконец в пятых. Если значение величины Х изменилось на заданный процент (от 1 до 100%), то узел АЦП генерирует события, вызывая пересчет значений подключенных к нему узлов. Это по сути параметр «чувствительности АЦП» (ADC changes, range %). Ведь обычно нет смысла реагировать «на каждый чих», то есть на мизерные изменения в младших разрядах АЦП — они часто «шумят». Поэтому параметр чувствительности имеет большое практическое значение.

Встает законный вопрос — как нам настроить эти параметры? Ткните указателем мыши в узел ADC1 на схеме и тут же у вас появится окно настройки.

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

image

В этом окне можно задать все параметры, о которых говорилось выше — диапазон, смещение и чувствительность АЦП.

Если вы ничего не задали, то диапазон будет равен 1. Смещение — ноль. И чувствительность — 1%.

То есть по умолчанию, фактически на выходе узла ADC1 будет значение аналогового напряжения, подаваемого на вход АЦП.

Как видим, узел ADC1 довольно сложен. Зачем все это сделано? Да для вас, дорогие мои пользователи! Шучу, конечно, как злобный эгоист я учел предыдущий опыт и постарался облегчить себе жизнь.

Нам, как простым инженерам, хочется чтобы величины были представлены не в «попугаях», а в нормальных и понятных значениях — вольтах, амперах, килограммах или метрах.

Многие датчики выдают значение именно «в попугаях», надеясь на то, что умный микроконтроллер пересчитает их в нужные величины.

Именно для этого и был введен пересчет измеренного АЦП значения по функции заданной.

Но, как водится, лучше один раз увидеть, чем десять раз услышать. Так же как лучше один раз попробовать, чем десять раз увидеть… Но не о том речь.
Потому приведу пару не сложных примеров: систему контроля питающей сети и систему измерения температуры на основе датчика с токовым выходом 4-20мА.

Контроль питающей сети

Измерение напряжения — часто возникающая задача. Например, мы хотим измерить напряжение питающей сети ~220В. Если у нас плохо с электросетью — задача очень реальная. Нам не нужно очень-очень точного изменения. Достаточно чтобы при превышении напряжения на 15% от нормы на ShIoTiny срабатывало реле Relay1, а при понижении напряжения на 15% от нормы срабатывало реле Relay2.

Разумеется, воткнуть вход ADC1 контролера ShIoTIny в розетку мы не можем. Что делать? Во-первых напряжение надо понизить до приемлемого уровня — 0..1В. И, во-вторых его надо выпрямить: переменное напряжение наш АЦП измерить не может.

Напряжение в сети может быть как ниже нормы, так и выше нормы. Для простоты положим, что 220В сетевого напряжения будет соответствовать 0.5В напряжения на входе АЦП.

Далее — ищем любой понижающий трансформатор, который при ~220В входного напряжения выдаст нам, скажем ~3В выходного напряжения и собираем такую схему, как на рисунке ниже.

Тут несведущего в электронике может поджидать сюрприз. На выходе выпрямителя неожиданно появляется не постоянного напряжения, а какие-то с лишним! На самом деле все просто объясняется. Когда мы измеряем переменное напряжение, то вольтметр показывает нам действующее значение напряжения. А когда мы это напряжение выпрямляем — то на выходе выпрямителя получаем пиковое значение напряжения, которое для синусоидального сигнала примерно в 1.41, а точно в раз больше действующего. Отсюда и «непонятные» 4.23В на выходе выпрямителя.

Ну и наконец, нам надо рассчитать делитель напряжения, то есть сопротивления R1 и R2. Нам необходимо получить на выходе делителя 0.5В при напряжении на его входе 4.23В. Значит выпрямленное напряжение 4.23В надо поделить в 8.46 раз. Для этого надо установить резистор R2=100 Ом, а резистор R1=746 Ом. Но это в идеале. Реально резисторов сопротивлением 746 Ом не бывает. Да и трансформаторы особой точностью не отличаются. Поэтому, если кто рискнет попробовать это решение, я настоятельно советую поставить резистор R1=760 Ом, а резистор R2 взять подстроечный, сопротивлением 180 Ом или на 220 Ом. Тогда вы сможете, вооружившись вольтметром, отрегулировать R2 так, что при ~220В напряжения на первичной обмотке трансформатор, на выходе делителя (или, что то же самое, на входе ADC1) будет =0.5В.

Мы измеряем напряжение не просто так, а чтобы по его превышению или понижению от нормы что-то делать. Например, включать резервное питание, чтобы какое-то устройство не сгорело и не отключилось.

Поэтому нарисуем простейшую схему-программу, которая при превышении напряжения на 15% от нормы заставляет срабатывать реле Relay1, а при понижении напряжения на 15% от нормы заставляет срабатывать реле Relay2. Кроме того, повышенное или пониженное напряжение должны продержаться в сети не менее 1 минуты, чтобы вызвать срабатывание реле. Этим мы избежим ложных срабатываний при коротких пиках напряжения, которые часто возникают в сети. Схема-программа, реализующая нашу задумку, показана на рисунке.

image

Чтобы эта схема работала, надо в настройках параметров АЦП выставить коэффициент k (диапазон) равный 440, как показано на рисунке.

image

При коэффициенте 440 и напряжении напряжении на входе АЦП 0.5В на выходе узла ADC1 будет значение 220. То есть реальное сетевое напряжение!

Это очень удобно, потому что позволяет задать константы сразу в вольтах: 220В+15% это 253В и 220В-15% это 187В. При необходимости эти значения можно легко изменить, не тратя время на расчет и перевод напряжения в «попугаи».

Датчик температуры 4-20мА

Датчики, имеющие токовый выход 4-20мА очень распространены в промышленности. В быту их встретишь не часто. Но тем не менее у кого-то они есть и этот кто-то хочет приспособить их к делу.

АЦП позволяет использовать такие датчики совместно с контролером ShIoTiny.

Почему выход датчика токовый и именно 4-20мА? Поясню.

Токовые выходы хорошо работают на длинных линиях. Скажем километр. Им плевать на сопротивление проводов: ток одинаков по всей длине провода вне зависимости от сопротивления проводников.

Начальное значение тока 4мА, а не просто отсутствие тока позволяет легко обнаружить обрыв провода. Если датчик целый и провод не оборван — то ток всегда есть. Хотя бы 4мА. А если оборвался провод — тока нет (0мА).

Предположим, у нас есть датчик температуры с токовым выходом 4-20мА и диапазоном измеряемой температуры от -40С до +125С. Мы хотим его подключить к ShIoTinу. Первое, что нам нужно сделать — это преобразовать ток в напряжение. Идеальным средством для такого преобразования является обычный резистор.

Так как максимальное напряжение на входе АЦП , а максимальный ток в линии — 20мА, то несложно посчитать, что резистор, преобразующий 20мА в будет иметь сопротивление 50 Ом. (Не знаешь закон Ома — сиди дома!).

Мы подключим наш датчик так, как показано на рисунке.

image

Датчик является генератором тока, пропорционального измеренной температуре. При сопротивлении 50 Ом, подключенном параллельно входу ADC1, на входе АЦП будут следующие значения напряжения, в зависимости от тока, создаваемого в цепи датчика:

  • ток менее 4мА, напряжение на входе АЦП менее 0.2В — обрыв линии;
  • ток от 4мА до 20мА, напряжение от 0.2В до 1В — датчик исправен;
  • ток больше 20мА, напряжение на входе больше 1В — датчик неисправен. При коротком замыкании в датчике возможно выгорание резистора 50 Ом, если он менее 2Вт мощностью.

Предположим, мы хотим измерить температуру и опубликовать ее по MQTT. Кроме того мы будем публиковать состояние датчика (обрыв линии, КЗ или все в порядке).

Первое, что нам надо сделать — пересчитать значение из «попугаев» в градусы. Зная, что температуре -40С соответствует ток 4мА и напряжение на входе АЦП 0.2В, а температуре +125С соответствует ток 20мА и напряжение на входе АЦП , получаем коэффициенты: k=206.25 и b=-81.25. Вводим эти коэффициенты в окне настройки АЦП, как показано на рисунке.

image

Кто хочет сам проверить правильность расчета k и b — решите сами простейшую систему систему уравнений:

Ну а схема-программа будет совсем не сложной и приведена на рисунке ниже.

image

В случае, когда все хорошо и датчик температуры 4-20мА исправен — температура публикуется на MQTT сервере под именем /t_sens. Признаки аварии так же публикуются под именами /sens_short и /sens_break. Если все хорошо, то признаки аварии — нулевые.

Если произошел обрыв линии, то значение температуры будет меньше -40С. В этом случае параметр /sens_break на MQTT брокере будет опубликован как единица.

Если произошло КЗ в линии, то значение температуры будет больше +125С. В этом случае у нас на входе АЦП будет напряжение больше и узел АЦП выставит на своем выходе значение NAN (не-число). В этом случае параметр /sens_short на MQTT брокере будет опубликован как единица.

При возникновении любой из аварий сработает реле Relay3, которое может, например, отключить питание датчика.

Получился вполне себе «умный» датчик, который можно вынести, например, за 200 метров от контроллера и измерять температуру.

Заключение

Закончив обзор примеров АЦП на ShIoTiny я понял, что его можно продолжать и продолжать. Но это будет уже на статья, а учебник.

Прошу снисхождения, если кому-то материал показался излишне «детским» и подробным, а кому-то напротив, что-то осталось не ясно.

Как обычно — конструктивная критика и предложения приветствуются. Кроме этого приветствуются замечания и предложения.

Отправлять все это можно как обычно в комментарии или на почту: shiotiny@yandex.ru.

Ссылки

Так как в статье есть масса стороннего материал, который требует пояснения, то без ссылок не обойтись.

Аналого-цифровое измерение переменного напряжения и теорема Котельникова

В статье обосновываются требования к частоте дискретизации, разрядности аналого-цифрового преобразования и фильтрации сигналов при проектировании цифровых вольтметров переменного тока высокой точности.

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

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

Задача измерения действующего значения переменного напряжения сводится к определению среднеквадратического значения сигнала. В частности, для гармонического сигнала после возведения его в квадрат необходимо выделить постоянную составляющую на фоне 2-й гармоники основного тона. В более общем случае измеряемый сигнал содержит также высшие гармоники, так что его можно представить в виде:

Квадрат этой величины u 2 (t) содержит в общем случае, помимо постоянной составляющей, равной квадрату искомого действующего значения, и гармонические составляющие с частотами из ряда ±тю1, mе [1, 2п].

Упрощенная блок-схема аналого-цифрового измерителя действующего значения напряжения представлена на рис. 1.

Упрощенная блок-схема цифрового вольтметра: ЦНС — цепь нормализации аналогового сигнала, включающая антиалайзинговый фильтр; АЦП — аналого-цифровой преобразователь; ФНЧ — фильтр нижних частот

Рис. 1. Упрощенная блок-схема цифрового вольтметра: ЦНС — цепь нормализации аналогового сигнала, включающая антиалайзинговый фильтр; АЦП — аналого-цифровой преобразователь; ФНЧ — фильтр нижних частот

Дискретизация по времени и квантование по уровню величины u(t) аналого-цифровым преобразователем (АЦП) дает последовательность чисел u*(i), при этом мы не учитываем квантование по уровню:

где TS — период дискретизации по времени. Возведя каждое из этих чисел в квадрат, получим последовательность квадратов выборок [u*(i)] 2 .

Выбор частоты дискретизации

Будем полагать частоту дискретизации постоянной, в общем случае не кратной ни частоте измеряемого сигнала, ни частоте считывания результатов. Такая дискретизация называется асинхронной. Синхронная дискретизация, рассмотренная, например, в [1, 2], при которой требуется привязка длительности накопления выборки и периода дискретизации к периоду сигнала (когерентность выборки), хотя и позволяет упростить последующую фильтрацию (можно использовать простое накопление за постоянный период), но требует применения более сложной аппаратной части, в том числе систем фазовой автоподстройки и т. д. Кроме того, на практике обеспечить когерентность выборки при высокой разрядности АЦ-преобразования весьма затруднительно [2]. В [3] показано, что при применении эффективных алгоритмов цифровой фильтрации можно практически устранить влияние некогерентности выборки на результаты измерений.

Обычно при выборе частоты дискретизации цифрового вольтметра исходят из требований теоремы Котельникова: частота дискретизации fS = 1/TS должна более чем в два раза превышать частоту наивысшей гармоники измеряемого сигнала [3]. Однако теорема Котельникова справедлива для сигналов со сплошным (непрерывным) спектром, в то время как периодические колебания переменного напряжения u(t) имеют дискретный спектр. График амплитудного спектра периодических колебаний представляет собой совокупность дельта-функций (рис. 2).

График спектральной плотности периодического сигнала

Рис. 2. График спектральной плотности периодического сигнала

В этом случае наложение спектров при дискретизации, которое может послужить источником погрешности, возможно только при точном совпадении частоты дискретизации или частоты, кратной ей, с частотой какой-либо гармоники измеряемого сигнала и, как следствие, маловероятно. Дискретизация сигнала (1) с частотой fS и последующее возведение каждой выборки в квадрат порождает спектральные компоненты с частотами:

где f1 = ω1/2π. Только постоянная составляющая (m = 0, r = 0) несет информацию о действующем значении измеряемого напряжения, остальные компоненты должны быть подавлены усредняющим фильтром нижних частот (ФНЧ).

Пусть коэффициент передачи усредняющего цифрового ФНЧ равен нулю для всех значений частоты f, лежащих вне интервалов (рис. 3):

Амплитудно-частотная характеристика цифрового ФНЧ

Рис. 3. Амплитудно-частотная характеристика цифрового ФНЧ

Тогда условие отсутствия погрешности, обусловленной дискретизацией:

для всех m∈[1, 2n], r∈[0, ∞). (3)

Иначе говоря, в полосу пропускания усредняющего ФНЧ должна попадать только постоянная составляющая временной последовательности [u*(i)] 2 .

Разрядность квантования по уровню

Обычно считают, что разрядность АЦП необходимо выбирать такую, чтобы относительная величина его кванта h была меньше предела допускаемой относительной погрешности. Например, если предел допускаемой погрешности ±0,01%, то относительная величина кванта должна быть менее 10 -4 , что соответствует 15 двоичным разрядам АЦП с учетом знака [3]. Однако, учитывая, что согласно (3) полоса пропускания усредняющего ФНЧ fc должна быть много меньше частоты дискретизации fS, можно выбрать меньшую разрядность АЦП.

Как показано в классической работе У. Бен-нета [4], среднеквадратическое значение шума квантования:

Этот шум имеет равномерное распределение плотности вероятности в диапазоне от -h/2 до h/2, и его спектр более или менее однороден в полосе частот 0 ≤ f ≤ fS/2 (рис. 4).

Спектральная плотность шума квантования

Рис. 4. Спектральная плотность шума квантования

Если на входе АЦП — синусоидальный сигнал, двойная амплитуда которого соответствует полной шкале АЦП:

следовательно, его действующее значение равно:

то отношение сигнал/шум SNR для идеального N-разрядного АЦП при полосе пропускания 0 ≤ f ≤ fS/2:

Если для фильтрации шума применить ФНЧ с прямоугольной амплитудно-частотной характеристикой (АЧХ) (рис. 2), полоса пропускания которого fc < fS/2, то [5]:

Эффективная разрядность ENOB определяется формулой:

ENOB = (SNR-1,76)/6,02. (5)

Подставив (4) в (5), получим:

Пусть, например, fS = 12 кГц, fc = 4 Гц, тогда:

то есть в данном случае эффективная разрядность увеличивается более чем на 5 двоичных разрядов.

Выбор усредняющего ФНЧ

Простейший путь сглаживания переменных составляющих последовательности выборок [u*(i)] 2 состоит в накоплении фиксированного числа (группы) выборок и затем нахождении их среднего значения. В теории цифровых фильтров этот алгоритм называется прямоугольным окном. АЧХ фильтра с прямоугольным окном представлена на рис. 5. Такая фильтрация используется, например, в интегральных микросхемах (ИМС) энергомониторов фирмы Cirrus Logic, такой как CS5467 и др. [6]. В этой ИМС для вычисления действующего значения напряжения осуществляется суммирование 4000 квадратов выборок с последующим делением на 4000. Прямоугольное окно реализуется

АЧХ фильтра с прямоугольным окном: T — длительность интервала накопления выборок

Рис. 5. АЧХ фильтра с прямоугольным окном: T — длительность интервала накопления выборок

наиболее просто и требует минимальных аппаратных затрат. Его недостаток — медленный спад АЧХ за полосой пропускания и, как следствие, увеличение погрешности измерения параметров низкочастотных сигналов.

В [3] для снижения уровней боковых лепестков АЧХ фильтра с накоплением группы выборок предлагается использовать окно Хэннинга-Ханна, имеющее импульсную характеристику вида:

где Μ — число выборок в группе. Окно Хэннинга-Ханна имеет относительный уровень первого бокового лепестка АЧХ -31,5 дБ, что заметно улучшает сглаживание группы квадратов выборок. Однако такой способ включает выполнение дискретного преобразования Фурье для оценки спектрального состава сигнала, что в свою очередь требует применения цифровых процессоров сигналов с большой вычислительной мощностью.

Рассмотрим применение распространенных цифровых ФНЧ с конечной (КИХ) и бесконечной (БИХ) импульсными характеристиками.

Из КИХ-фильтров наиболее часто применяют sinc-фильтр, который, в частности, встраивают во многие модели сигма-дельта АЦП. Этот фильтр вычисляет текущее среднее значение по Μ выборкам. Его передаточная функция:

Блок-схема алгоритма работы sinc-фильтра представлена на рис. 6. АЧХ sinc-фильтра имеет такой же вид, что и у рассмотренного выше фильтра с прямоугольным окном (рис. 5), но путем каскадирования sinc-фильтров можно значительно улучшить подавление переменных составляющих выборок [ u*(i)] 2 . Например, относительный уровень первого бокового лепестка АЧХ sinc 5 -фильтра (каскад из пяти одинаковых sinc-фильтров) составляет примерно -65 дБ.

Блок-схема алгоритма sinc-фильтра

Рис. 6. Блок-схема алгоритма sinc-фильтра

Применение sinc-фильтров требует довольно больших объемов оперативной памяти (ОЗУ) микроконтроллера вольтметра. Действительно, для каждого фильтра требуется запоминание всех М выборок, в отличие от фильтра с прямоугольным окном, где требуется запоминать только сумму. Если ФНЧ представляет собой каскад из Q sinc-фильтров, то, соответственно, требуется запоминать QxM слов. Число М определяется отношением fS/fC и может быть значительным. Зато этот алгоритм содержит минимальное количество перемножений и может выполняться микроконтроллером низкой производительности.

Наконец, в качестве ФНЧ может использоваться обычный БИХ-фильтр, например, Баттерворта или Бесселя. Блок-схема алгоритма БИХ-фильтра 2-го порядка приведена на рис. 7. Передаточная функция этого фильтра:

Блок-схема алгоритма БИХ-фильтра 2-го порядка

Рис. 7. Блок-схема алгоритма БИХ-фильтра 2-го порядка

ФНЧ более высокого порядка может быть образован каскадным соединением фильтров 2-го порядка. Это позволит избежать проблем, связанных с устойчивостью цифровых рекурсивных фильтров высокого порядка.

БИХ-фильтры не требуют большой памяти. Как следует из схемы на рис. 7, для реализации звена второго порядка нужно запоминать всего 4 слова. Но на каждые 2 порядка производится 5 перемножений, поэтому нужен микроконтроллер более высокой производительности, чем для sinc-фильтра. Еще один недостаток: для больших отношений fs/fc требуется представлять коэффициенты a, bj числами высокой разрядности, что также повышает требования к микроконтроллеру.

Влияние шума

При измерениях низких напряжений, в том числе измерении параметров сигналов датчиков тока, таких как шунты или трансформаторы тока, становится заметным влияние шума аналоговых цепей измерительного прибора. Оценим влияние параметров шума на выбор частоты дискретизации.

Пусть сигнал на входе измерительного прибора:

причем h(t) — стационарный центрированный белый шум с нормальным распределением и спектральной плотностью G. Если в состав цепи нормализации сигнала (рис. 1) входит антиалайзинговый фильтр c прямоугольной АЧХ, то корреляционная функция шума на входе АЦП:

где ωα — полоса пропускания антиалайзин-гового фильтра;

— среднеквадратическое отклонение шума на входе АЦП; R(t) = (sinωat)/(ωat) — коэффициент корреляции этого шума.

Будем пренебрегать дискретностью квантования по уровню. Тогда после возведения в квадрат выходных данных АЦП получим:

Таким образом, мы можем формально переставить по очередности операции возведения в квадрат и дискретизации. В этом случае с учетом (7):

где η1(t) — шум на входе АЦП. Математическое ожидание сигнала (10):

представляет собой квадрат действующего значения напряжения на входе АЦП.

Смешанный момент второго порядка функции (10):

Отсюда находим корреляционную функцию сигнала (10) [7]:

Для вычисления односторонней спектральной плотности воспользуемся формулой Винера-Хинчина [7]:

После подстановки в (13) корреляционной функции (12), с учетом (8) находим:

где SF(w) — спектральная плотность шума на выходе усредняющего ФНЧ. Выходной сигнал цифрового вольтметра с учетом (18):

Графики S 1(ω) и S2(ω) представлены на рис. 8а, б.

Графики спектральной плотности шума

Рис. 8. Графики спектральной плотности шума

Из (14) следует, что спектр Sui(ω) является дискретно-сплошным. Он состоит из дискретной спектральной линии 2ω1, обусловленной наличием во входном сигнале гармонического сигнала Umcos(ω1t+φ) и двух сплошных составляющих.

Отношение максимальных значений S1(ω) и S2(ω):

поэтому, учитывая, что при точных измерениях Um>>s, влиянием составляющей S2(ω) можно пренебречь.

При дискретизации по времени сигнала (10) образуются зеркальные компоненты спектра Sui, так что спектр дискретизированного сигнала в масштабе циклической частоты f [8]:

График составляющей S1 спектра сигнала (10) после его дискретизации приведен на рис. 8в. На этом же рисунке изображена

АЧХ усредняющего ФНЧ. На этом графике видно, что, для того чтобы зеркальные составляющие ST(/) не оказывали влияния на точность измерения, они не должны попадать в полосу пропускания усредняющего цифрового ФНЧ, а это будет иметь место при выполнении условия:

На рис. 8г показан случай наложения спектров при невыполнении условия (17).

При выполнении условия (3) сигнал на выходе усредняющего ФНЧ [u*F (i)] 2 содержит постоянную составляющую, равную математическому ожиданию u 2 (t) (11) и шумовую составляющую ξ*(i):

Найдем дисперсию шума на выходе усредняющего ФНЧ. С учетом малости S2(ω):

где SF(w) — спектральная плотность шума на выходе усредняющего ФНЧ. Выходной сигнал цифрового вольтметра с учетом (18):

Следовательно, относительная погрешность измерения, обусловленная шумом:

δ U/U≈ (s 2 +ξ*(i))/U 2 m.

Поскольку ξ*(i) имеет нормальное распределение, то с вероятностью 0,997 относительная погрешность измерения:

Первое слагаемое в формуле (20) представляет собой детерминированную составляющую погрешности, обусловленной шумом, а второе — случайную. Подставив в (20) значение σ из (9), получим окончательно:

Рассмотрим пример. Пусть частота дискретизации fS = 10 кГц, полоса пропускания антиалайзингового фильтра fa = 4 кГц, полоса пропускания усредняющего фильтра fc = 4,4 Гц, частота сигнала f1 < fa, действующее значение измеряемого сигнала U = 1 В, среднеквадратическое значение шума с нормальным распределением и постоянной спектральной плотностью в полосе 0 < f < fas = 0,01 В. Тогда условие (17) выполняется, первое слагаемое в формуле (20) равно 5х 10 -5 , а второе — 9,9х 10 -4 , то есть почти в 20 раз больше. Следовательно, в условиях данного примера основная часть погрешности — случайная составляющая.

Результаты моделирования

Для подтверждения аналитических результатов проведено моделирование процесса аналого-цифрового измерения переменного напряжения в пакете VisSim. Схема моделирования представлена на рис. 9. В момент t = 0 происходит подача на вход сигнала, начиная с нулевой фазы при нулевых начальных условиях ФНЧ.

Схема моделирования: ГСК — генератор синусоидальных колебаний; ГИВ — генератор импульсов выборки; S&H — блок выборки и хранения; pow — блок возведения в квадрат; LPF — фильтр нижних частот; sqrt — блок извлечения квадратного корня

Рис. 9. Схема моделирования: ГСК — генератор синусоидальных колебаний; ГИВ — генератор импульсов выборки; S&H — блок выборки и хранения; pow — блок возведения в квадрат; LPF — фильтр нижних частот; sqrt — блок извлечения квадратного корня

Во всех случаях частота выборки fS = 10 000 Гц; ФНЧ — фильтр Бесселя 10-го порядка, fc = 4,4 Гц по уровню -3 дБ. Амплитуда входных синусоидальных колебаний равна V2, за исключением двухчастот-ных колебаний. Время установления не превышает 1 с. На всех диаграммах приведен график ошибки измерения:

    Частота входного сигнала f1 = 50 Гц. Квантование по уровню отсутствует. Пределы установившейся ошибки: ±6х10 -11 . Диаграмма VisSim представлена на рис. 10.

Диаграмма VisSim при f = 50 Гц

Диаграмма VisSim при f = 10 100 Гц

Диаграмма VisSim при f = 10 015 Гц

Квантование по уровню

Шум на входе АЦП

Выводы

Применение теоремы Котельникова для выбора частоты дискретизации цифрового вольтметра переменного тока некорректно. Частота выборок может быть выбрана ниже, чем частота гармоник измеряемого напряжения. Один из способов избежать попадания отражения какой-либо гармоники измеряемого напряжения в полосу пропускания усредняющего цифрового ФНЧ — контролировать частоту входного сигнала и, в необходимых случаях, переходить на другую частоту выборок.

Эффективная разрядность аналого-цифрового преобразования при измерении действующего значения переменного напряжения определяется соотношением частоты выборки и полосы пропускания усредняющего ФНЧ и может быть заметно выше разрядности собственно АЦП.

Основное требование к усредняющему ФНЧ — крутой спад АЧХ в переходной полосе при приемлемом времени установления.

При измерении в условиях широкополосного шума, при правильном выборе частоты выборок, детерминированная составляющая погрешности определяется полосой пропускания аналогового антиалайзингового ФНЧ, а случайная — полосой пропускания усредняющего цифрового ФНЧ.

Литература

  1. Ратхор Т. С. Цифровые измерения. Методы и схемотехника / Перевод с англ. М.: Техносфера, 2004.
  2. Вьюхин В. Н., Попов Ю. А., Тани Ю. Л. Исследование метода когерентной выборки для тестирования высокоразрядных АЦП // Автометрия. 1997. № 5.
  3. Гублер Г. Б., Гутников В. С. Алгоритмы цифровой обработки сигналов многофункционального эталонного прибора для измерений электроэнергетических величин — http://www.mars-energo.ru/p/a/algorithms.pdf
  4. Bennett W. R. Spectra of quantized signals // Bell Systems Technical Journal. July 1948. Vol. 27.
  5. Аналого-цифровое преобразование / Под ред. У. Кестера. Перевод с англ. М.: Техносфера, 2007.
  6. www.cirrus.com
  7. Тихонов В. И. Статистическая радиотехника. М.: Радио и связь, 1982.
  8. Кузин Л. Т. Расчет и проектирование дискретных систем управления. М.: Машгиз, 1962.