Конвертер тока 4..20 mA в напряжение XY-ITOV

Промышленные датчики, сообщающие об изменении измеряемого параметра изменением тока в диапазоне 4.. 20 мА, широко распространены. Они обладают высокой помехоустойчивостью, поэтому к такому датчику можно подвести кабель длиной в несколько сотен метров. В статье я сделал подробное сравнение АЦП ESP32 и ADS1115 как раз на задаче определения тока 4..20 мА.

Простейший способ подключения датчика с токовой петлей 4..20 мА к микроконтроллеру — использовать следующую схему:

Подключение датчика тока 4..20 мА к Arduino

В ней нет гальванической развязки. Стабилитрон защищает входы микроконтроллера от напряжения превышающего 5,1 V и переплюсовки. На схеме стабилитрон и сопротивление R1 рассчитаны для микроконтроллера с 5-ти вольтовым уровнем ADC (Arduino). Для «чистых» ESP8266/32 нужны другие элементы, рассчитанные на предельное 1 V напряжение на АЦП.

Результаты моделирования работы простейшего преобразователя тока в напряжение для замера АЦП микроконтроллером

Результаты моделирования работы простейшего преобразователя тока в напряжение подключения к АЦП микроконтроллера ESP8266/ESP32

Если смоделировать какое напряжение будет на АЦП микроконтроллера при протекании максимального тока в 20 мА, то видно, что из-за нелинейной вольтамперной характеристики стабилитрона происходит искажение напряжения и вместо 1V АЦП замерит 949 mV. Если-же убрать стабилитрон, есть риск выхода из строя входа микроконтроллера в случае подключения длинных линий, выступающих в роли индуктивности. Диод защищает вход микроконтроллера от отрицательных скачков напряжения.

В первой схеме, ток протекая через сопротивлление 250 Ом по закону Ома приводит к появлению на нем напряжения U = I*R.
Umin = 4 мА * 250 Ом = 1 В.
Umax = 20 мА * 250 Ом = 5 В.

Резистор соответствует уровню логики Arduino. Для микроконтроллеров ESP8266/ESP32 распаянных на плате с резистивным делителем преобразующим 3,3 В в 1 V на ADC сопротивление должно быть R = U/I. Rmax = 3 В / 20 mA = 150 Ом. Если же на плате не распаян резистивный делитель напряжения, тогда на АЦП напряжение не должно превышать 1,1 V.

Проверяем, что резистор стандартный с помощью калькулятора. Или сразу рассчитываем сопротивление подходящего резистора с помощью Resistance calculator. Падение напряжения на резисторе при минимальном токе Umin = 4 mA * 150 = 0,6 Вольт.

Есть и более сложные схемы. Не знаю из какой книги скан, нашел эту страничку на просторах Интернет. Буду благодарен, если перешлете ссылку:

Чтобы точно измерить изменение тока, резистор R1 на 250 Ом для Arduino на котором микроконтроллер замеряет напряжение (U = I*R) должен быть с минимальным допуском: 1% или лучше.

Здесь не подходит гальваническая развязка оптроном, поскольку его характеристика нелинейная, поэтому он будет искажать измерения.

Плата для преобразования тока 4..20 мА в напряжение

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

Напряжение питания модуля 7-36V. Если выставлен диапазон выходного напряжения 10 V, то напряжение питания должно быть не меньше 12 V.

Преобразователь тока 4..20 мА в напряжение для подключения к АЦП микроконтроллера

На плате распаяно:

  • Прецизионный резистор на котором замеряется падение напряжения.
  • Защита входа от ошибки с полярностью.
  • Защита от превышения напряжения >5 V.
  • Усилитель, обеспечивающий напряжение на выходе в определенных диапазонах, заданных джамперами.

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

  • ON: jumper cap buckles on the two jumper pins — джампер закорочен
  • OFF: two jumper pins without the jumper cap — джампер снят
Range, VoltJ1, перемычка 1-2J1, перемычка 3-4
0 — 2.5 ONON
0 — 3.3 OFFOFF
0 — 5.0ON???ON
0 — 10.0 ONOFF

Для точной настройки преобразователя тока 4..20 мА в напряжение нужно подобрать значения двух потенциометров: ZERO и SPAN, соответствующие нулевому и максимальному значению тока на входе. Потенциометры претензионные с широким шагом.

  • При минимальном токе на входе (0 mA или 4 mA), вращая потенциометр ZERO, настроить нужное напряжение на выходе, соответствующее заданному току нуля. Вращение по часовой стрелке увеличивает напряжение на выходе.
  • Я не рекомендую выставлять 0 Вольт при минимальном токе 4 мА, поскольку в этом случае микроконтроллер не сможет определить оборван ли кабель к датчику или он действительно показывает минимальные значения.
  • При максимальном токе в 20 мА, вращая переменное сопротивление SPAN, подбирается максимальное значение в выствленном джамперами диапазоне. Вращение по часовой стрелке увеличивает напряжение на выходе.

Тестирование конвертера тока 4..20 мА в напряжение

Для настройки конвертера на вход подадим ток с простой последовательной цепочки источник питания (ИП) + резистор. По закону Ома, если напряжение ИП = 5 В, то^

  • Для тока 4 мА потребуется сопротивление R = 1,25 кОм (ближайший 1,2 кОм).
  • Для тока 20 мА — 250 Ом.

При этом учитываем тот момент, что на входе XY-ITOV, судя по моим замерам, стоит сопротивление на 99,5 Ом. Соответсвенно, в цепи уже есть сопротивление ~100 Ом. Поэтому значения граничных сопротивлений будут:

Ддя 4 мА — 1,15 кОм

Для 20 мА — 150 Ом.

Последовательно соединяем резистор на <150 Ом и прецизионное переменное сопротивление >1,2 кОм. Я использовал на 10 кОм, под рукой не оказалось другого.

Current 4..20 mA to Voltage converter calibratio
Калибровка XY-ITOV конвертера тока 4..20 мА в напряжение
  • Подключил XY-ITOV к источнику питания ~14 V. Если джамперами выставлено напряжение до 10 V, то источник питания должен быть >12V.
  • Оба джампер-а снял, чтобы диапазон напряжений был 0..3,3 V.
  • Подключаю амперметр как указано на схеме.
  • Подключаю мультиметр к клеммам Vout и GND и вращая потенциометр ZERO выставляю нижний диапазон напряжений на Vout. Я выставил 0,66 V для тока 4 mA.
  • Вращая потенциометр R1 подбираю ток на амперметре 20 mA.
  • Подключаю мультимер к клеммам Vout и вращая потенциометр SPAN выставляю верхний диапазон напряжений на Vout. Я выставил 3,3 V для тока 20 mA.
  • Если снять соединение источника питания с I-/I+, имитируя обрыв провода до сенсора, то на выходе будет напряжение 0,08 V.
  • Конвертер тока 4..20 mA в напряжение XY-ITOV откалиброван для работы.
  • Если вместо источника питания с напряжением >7 V использовать меньшее напряжение, для теста я использовал 5 V, преобразователь показывает Vou t= 2,94 V. При этом калибровка не проходит. Вращение потенциометра SPAN не приводит к изменению напряжения на выходе. Оно остается = 2,94 V.

Поключение преобразователя тока в напряжение к ESP8266

Wemos D1 mini (ESP8266) широко представлен на Aliexpress по цене менее 3 USD. Подключим плату преобразователя тока в напряжение к этому микроконтроллеру.

После тщательной калибровки подключаем землю от конвертера к пину G(ND) Wemos D1 mini, а Vout к пину A0.

Поскольку конвертер 10-ти битный, то количество уровней равно 2^10 = 1024. В теории, диапазон измерения напряжения АЦП ESP8266 от 0 до 1 V. Производители плат распаивают дополнительный резистивный делитель напряжения, поэтому данные о том, какое напряжение поддерживает АЦП нужно смотреть у производителя платы. 🙁 В источниках указывается, что «Wemos D1 Mini has already build in divider R1 220k/ R2 100k for pin A0», поэтому напряжение может меняться от 0 до 3,3 V. При калибровке было выставлено, что 20 mA соответствует 3 V. Верхнему напряжению должно соотвествовать значение 1023, поскольку 0 соответствует 0, а всего 1024 уровня. Расчетно получаем, что L = 1023*3/3,3 = 930.

Однако, если подать на вход аналогового входа напряжение 3 V, то АЦП отобразит значение 991, что значительно отличается от теоретического расчета. Если пересчитать какой-же верхний предел соотвествует полученному для 3 V значению, то получится: 991*3,3/1023 = 3,196774 V. В общем, то-ли АЦП настолько плох, то-ли какие-то иные проблемы.

Формула для пересчета значения АЦП в ток, I = adc*20(mA)/991, где adc — величина, считанная с входа АЦП.

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

void loop() {
  float adcr = analogRead(0);
  float val = adcr*20/991;
  Serial.print("ReadADC: " + String(adcr) + "\t");
  Serial.println("ReadADC, mA: \t" + String(val));
  delay(500);
}

После запуска программы получаем следующие результаты:

21:21:54.448 -> ReadADC: 992.00	ReadADC, mA: 	20.02
21:21:54.928 -> ReadADC: 991.00	ReadADC, mA: 	20.00
21:21:55.441 -> ReadADC: 991.00	ReadADC, mA: 	20.00
21:21:55.955 -> ReadADC: 991.00	ReadADC, mA: 	20.00
21:21:56.435 -> ReadADC: 991.00	ReadADC, mA: 	20.00
21:21:56.951 -> ReadADC: 991.00	ReadADC, mA: 	20.00

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

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

ADC_MODE(ADC_VCC) //Switch ADC to measuring battery level
 
float batterylevel;  

void setup(){  
  Serial.begin(115200);  
  batterylevel = ESP.getVcc();  

  if (batterylevel <= 2170){  
    ESP.deepSleep(0);  
  } 
}  

void loop()
{
  Serial.print("Battery level is: " + String((batterylevel / 1000.0))); 
} 

Поключение преобразователя тока в напряжение к ESP32

Подключаю землю от конвертера к пину G(ND) ESP32 DevKit, а Vout к пину ADC1_0 (GPIO36). В общем-то можно переносить код ESP8266 на ESP32 — он будет работать с парой правок: pin для чтения не 0, а 36 и поправочный коэффициент ориентировочно 3350. Точно откалибровать сложно. 12-битный АЦП достаточно точный, поэтому будет читать и малейшие изменения входного напряжения. Кроме того сам АЦП без откалиброванного опорного напряжения (reference voltage) не сможет обеспечить точные измерения.

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

int lastMillis = 0;
void loop() {
  int currentMillis = millis();
  if (currentMillis - lastMillis > 500)
  {
    float adcr = analogRead(A0);
    float val = adcr*20/3350;
    Serial.print("Read ADC pin [" + String(A0) + "]: " + String(adcr) + "\t");
    Serial.println("ReadADC, mA: \t" + String(val));
    lastMillis = currentMillis;
  }
}

Можно использовать другой вариант кода для измерения напряжения на ESP32. Но в этом случае поправочный коэффициент будет 3850:

#include &lt;driver/adc.h>

void setup() {
    Serial.begin(115200);
    adc1_config_width(ADC_WIDTH_BIT_12);
    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
}

int lastMillis = 0;
void loop() {
  int currentMillis = millis();
  if (currentMillis - lastMillis > 500)
  {
    float adcr = adc1_get_raw(ADC1_CHANNEL_0);
    float val = adcr*20/3850;
    Serial.print("Read ADC pin [" + String(A0) + "]: " + String(adcr) + "\t");
    Serial.println("ReadADC, mA: \t" + String(val));
    lastMillis = currentMillis;
  }
}

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

Конвертер напряжения в ток 4..20 мА

По этой ссылке можно найти антипод ранее рассморенному модулю, производящий обратное преобразование напряжение в ток 4..20 мА (voltage to current converter). Этот модуль при подключении к датчику напряжения позволит увеличить длину кабеля от него до микроконтроллера.

Конвертер напряжения в ток 4..20 мА

Аналоги преобразователей тока 4..20 мА

Если искать на просторах интернет то конвертеры тока 4..20 мА в напряжение от брендовых производителей стоят недешево, ~22 USD. Например, такой. К нему можно подключить до 4-х сенсоров, т.е. цена за сенсор в районе 5 USD. На плате уже есть 16-ти разрядный АЦП, это ещё около 1,5 USD экономии. 🙂

Fritzing part для current to voltage 4..20 mA converter

XY-ITOV Fritzing part (fzpz) file.
XY-ITOV Fritzing part (fzpz) file.

Не нашел в Интернет подходящий fritzing part для конвертера тока 4..20 мА в напряжение. Поэтому нарисовал свой. Брать здесь. Не забываем лайкать. 🙂

Полезные ссылки

Spread the love
Запись опубликована в рубрике IT опыт, IT рецепты с метками , , , , , . Добавьте в закладки постоянную ссылку.