Анонс:

  • Измеритель без калибровок;
  • Измеритель без подстроечных сопротивлений;
  • Измеритель с высоким входным импедансом;
  • Однополярное питание;
  • Двуполярный сигнал на входе;
  • АЦП не менее 16 бит;
  • Простая программная реализация интерфейса I2C в режиме Mаster-Slave;
  • Микроконтроллер;
  • Борьба с помехами методом медианной фильтрации;
  • Исходники для AVR-Studio;

Поставим задачу.

Имеется двуполярный сигнал от источника с высоким внутренним сопротивлением. Необходимо построить схематехнику так, чтобы ни одного подстроечного сопротивления, ни одной калибровки бы не требовалось. Таким источником, например, может быть pH электрод с внутренним сопротивлением доли GΩ и разнополярным сигналом в диапазоне ±250 мВ. (см. http://keklab.ru/articles/3-2010-10-28-21-52-23/18-phmeter.html ).

Задача не решается «в лоб». Внутренний усилитель АЦП, как правило, имеет малый импеданс. Значит надо усилитель на вход по технологии CMOS. Это во-первых. Далее раз усилитель, то чем его питать? Двуполярное питание? Не хотелось бы… А как же ±250 мВ на входе? Это означает создание смещения, а это означает зависимость от точности питания, от точности сопротивлений, организующих смещение, даже при использовании источников опорного напряжения. Вот калибровки и потянутся… Это во-вторых.

Однополярный измеритель двуполярного сигнала

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

(см. http://www.gaw.ru/html.cgi/txt/doc/ldo/linps_4_6.htm)

Но в представленном решении оказалось все проще. Пусть себе гуляет. Я имею ввиду не кошку, а искусственную среднюю точку. Она организована может быть совершенно не симметрично относительно питания 3.3V, совершенно не точными сопротивлениями. Главное, чтобы суммарный ток через Rg1 и Rg2 был бы существенно выше потребления усилителя и АЦП, они единственные потребители, которые зависят от средней точки. Почему не важна стабильность? Да, потому, что средняя точка заведена на “-” внутреннего усилителя АЦП и входной сигнал тоже на неё опирается. Вот если бы минус этого АЦП сидел бы на земле, тогда точность средней точки относительно земли имела бы важное значение.

И ещё два замечания относительно всей конструкции. Если диапазон входного сигнала ±250 мВ, то средняя точка должна быть относительно земли выше 250 мВ. Пусть она будет 1 вольт, тогда диапазон относительно земли будет от -750мВ до 1250мВ, что вписывается и в верхнее ограничение до 3.3 вольт. И последний приятный факт. Точность питания в 3.3 вольта совсем не обязательна, как известно, многие современные операционные усилители к этому относятся «спокойно», если схемотехника не привязывается к питанию для каких-то других целей. Наша цель – отсутствие подстроек и калибровок выполнена. С этим разобрались…

Теперь про усилитель.

А он ничего и не усиливает, а только повторяет и организует преобразование высокого импеданса в потребный для АЦП. Никаких сопротивлений, никаких подстроечников… красота! Если только кому-то потребуется, чтоб он усиливал сигнал, пиши пропало… Точные сопротивления и калибровки вам обеспечены. Хотя есть решение и здесь. Если вместо OPA335 поставить INA333, то можно и усиливать. Но! Точность усиления будет определяться точностью RG (см. pdf). OPA335 имеет один параметр, который позволяет «забыть» про смещения входных токов и напряжений: ZERO DRIFT: 0.05μV/°C (max).

Теперь про АЦП.

Хоть он и 18-ти разрядный, используем только 16. Это будет сказываться на скорости преобразования дельта-сигма. Вот здесь мы можем усиливать сигнал, не заботясь о точности, всё внутри. 1-2-4-8 – возможные варианты параметра усиления PGA. Правда надо отметить, что собственный входной импеданс АЦП зависит от усиления и составляет R=2.25/PGA (MΩ).

В дифференциальном режиме АЦП выдает код, который можно преобразовать в двуполярное значение, мы же этого хотели. В pdf очень «туго» все написано, поэтому, чтобы люди не мучились вот кусок формулы на СИ:

ADC_MCP3421 = (B1 << 8)|B2;

if (ADC_MCP3421 <= 32767)

SignADC_MCP3421 = ADC_MCP3421;

else

SignADC_MCP3421 = -(65535-ADC_MCP3421+1); где

  • B1 и B2 – соответственно старший и младший байт, который выдает АЦП в 16-ти битовом режиме, их тип unsigned short имеет значение для операции сдвига влево;
  • ADC_MCP3421 – двухбайтовый код типа unsigned long , на тот случай, если понадобится все таки все 18 бит ;
  • SignADC_MCP3421 – знаковая переменная типа signed long;

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

Что касается I2C, то моя практика показала достаточную надежность данного компактного интерфейса при возможности каскадного внутриблочного соединения. Да, и еще, при правильной настройки всех регистров оного. Это будет отражено в материалах для ссылок.

Теперь про микроконтроллер. А точнее про некоторые программные средства, позволяющие уменьшить наводимую помеху.

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

  • Измерения надо проводить с интервалом, кратным 20 мс;
  • Накапливать результаты в буфер - signed shortadcdata [25];
  • После накопления проводить медианную фильтрацию;

Конечно все это справедливо для «неспешных» измерений, где истинное значение необходимо не чаще, чем раз в секунду или в две.

В микроконтроллере организуется системное прерывание. Если есть кварц, то организуется интервал проведения измерения. В данной схеме 80 мс. Буфер adcdata за две секунды накапливает 25 значений. Затем процедура qsort(), которая входит в стандартный набор AVR-Studio, сортирует этот массив по возрастанию. Значение буфера adcdata[13] – отфильтрованное. В этом заключается медианная (серединная) фильтрация. Чем это лучше просто среднего значения?

Возьмем короткий буфер array[5] = {1002, 1010, 999, 1001, 1100}, в который записываем значения АЦП SignADC_MCP3421. Такой он получился после реальных измерений, на которые действует импульсная помеха. Последнее значение резко отличается от остальных из-за этого. Среднее будет = 1022;

После сортировки массив будет таков: array[5] = {999, 1001, 1002, 1010, 1100};

Медианная фильтрация после сортировки выдаст значение array[2] = 1002. Это значение более точное и не учитывает помеховый выброс. Конечно, можно из необработанного массива выбирать максимальное и минимальное значение и не учитывать их при подсчете среднего. А если таких максимумов будет несколько? По сути медианная фильтрация это и делает.

Важным моментом является период измерений. Контроллер ничего не знает о фазе пятидестигерцовой помехи, она не синхронизирована с моментом начала измерения.

Медианная фильтрация

Осциллограмма.1

Медианная фильтрация

Осциллограмма.2

На практике на вход данной схемы было подано 200 мВ синусоидального сигнала с частотой 50 Гц. (см. осциллограммы). Эта синусоида имитировала помеху, наведенную на постоянный сигнал в 100 мВ. Моменты измерения показаны ниже импульсами с периодом в 80 мс. Как видно в двух случаях (осц.1 и осц.2) моменты измерения приходятся на разные фазы синусоиды.

Медианная фильтрация выдавала значение около 100мВ. Соотношение сигнал/шум при этом 100%. Реальный разброс измерения за несколько сеансов составил диапазон от 97.90625мВ до 100.65625мВ. Ошибка составила 2.75%. Ошибка большая, но надо иметь в виду, что реальное соотношение сигнал/шум будет на порядок меньше.

В материалах представлен проект в AVR-Studio ver 4.18 Build 716 для Atmega16A. Он без комментариев, как есть. В нем реализуется алгоритм измерения и метод медианой фильтрации. Так же представлены процедуры для простой организации интерфейса I2C. На практике этот интерфейс так же подвержен помехам. Чтобы это не приводило к «зависанию» организованы некие действия в процедуре void twi_stop(void). Эти материалы можно использовать в организации связи многочисленных Slave-Unit, которые охватывают широкий спектр приборов:

  • DS1307 - часы реального времени;
  • DS 1624 – датчик температуры;
  • DAC7571 – 12 битный ЦАП.

В заключении.

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

  • RB0505S – DC-DC преобразователь;
  • ISO1540 - Low-Power Bidirectional I2C Isolators

Материалы:

Обновлено (21.06.2015 14:38)

 
Новости электроники от РадиоЛоцмана
Вопросы искусственного интеллекта, философия и практика
. @Mail.ru