Измерение унифицированного токового сигнала 4…20мА (Arduino)

Справка

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

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

Применяется смещенный диапазон 4—20 мА, то есть наименьшее значение сигнала (например, 0) соответствует току 4 мА, а наибольшее — 20 мА. Таким образом весь диапазон допустимых значений занимает 16 мА. Нулевое значение тока в цепи означает обрыв линии и позволяет легко диагностировать такую ситуацию.

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

На Arduino можно реализовать измерение унифицированного токового сигнала 4…20 мА, для этого необходимо ток преобразовать в напряжение и подать его на аналоговый вход АЦП Arduino. Сопротивление 50 Ом преобразует ток 20 мА в напряжение 1 В. Чем точнее подобрано сопротивление 50 Ом, тем более точные будут показания прибора. Измеритель унифицированного токового сигнала 4…20 мА позволяет задать произвольные значения для тока 4 мА и 20 мА, этими значениями можно задать наименьшую и наибольшую величину измерения (диапазон измерения). Этими величинами может быть ток, напряжение, давление, температура и т.д. Так же можно задать кол-во знаков после запятой у измеренного значения.

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

#include <LiquidCrystal.h>
#include <EEPROM.h> //#include <EEPROMex.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
int u,reg,i4,i20,zap,rom0,rom1,rom2,rom3,rom4,rom5,rom6,i4_minus,i20_minus,kn1,kn2,kn3,kn4;
const float u_ref = 1.0785;// измеренное опорное напряжение
float i,u_f, iz;
unsigned long w; 
 
void setup() {
  lcd.begin(16, 2);// LCD 16X2
  analogReference(INTERNAL);
  pinMode(A0,INPUT);// A0 - аналоговый вход
  pinMode(4,INPUT);pinMode(3,INPUT);pinMode(2,INPUT);
  rom0=EEPROM.read(0);if(rom0>1){EEPROM.update(0,rom0);}//+- i4
  rom1=EEPROM.read(1);if(rom1>10){EEPROM.update(1,rom1);}//10xx i4
  rom2=EEPROM.read(2);if(rom2>99){EEPROM.update(2,rom2);}//xx99 i4
  rom3=EEPROM.read(3);if(rom3>1){EEPROM.update(3,rom3);}// +- i20
  rom4=EEPROM.read(4);if(rom4>10){EEPROM.update(4,rom4);}//10xx i20
  rom5=EEPROM.read(5);if(rom5>99){EEPROM.update(5,rom5);}//xx99 i20
  rom6=EEPROM.read(6);if(rom6>2){EEPROM.update(6,rom6);}//0.00 
  i4=rom1*100+rom2;if(rom0==1){i4=i4-2*i4;}
  i20=rom4*100+rom5;if(rom3==1){i20=i20-2*i20;}
  zap=rom6;}
 
void loop() {
  if(digitalRead(4)==HIGH){reg++;delay(500);}if(reg>3){reg=0;}
  if(digitalRead(3)==HIGH&&reg==1){kn1++;if(kn1>=10){i4=i4+10;}else{i4++;}}else{kn1=0;}if(i4>1000){i4=1000;}
  if(digitalRead(2)==HIGH&&reg==1){kn2++;if(kn2>=10){i4=i4-10;}else{i4--;}}else{kn2=0;}if(i4<-1000){i4=-1000;}
  if(digitalRead(3)==HIGH&&reg==2){kn3++;if(kn3>=10){i20=i20+10;}else{i20++;}}else{kn3=0;}if(i20>1000){i20=1000;}
  if(digitalRead(2)==HIGH&&reg==2){kn4++;if(kn4>=10){i20=i20-10;}else{i20--;}}else{kn4=0;}if(i20<-1000){i20=-1000;}
  if(digitalRead(3)==HIGH&&reg==3){zap++;}if(zap>2){zap=0;}
  if(digitalRead(2)==HIGH&&reg==3){zap--;}if(zap<0){zap=2;}
  if(i4<0){i4_minus=1;} if(i20<0){i20_minus=1;}
  lcd.setCursor(0,0);
  if(reg==1){lcd.print("4 mA = ");lcd.print(i4);}
  if(reg==2){lcd.print("20 mA = ");lcd.print(i20);}
  if(reg==3){if(zap==0){lcd.print(" 0 ");}if(zap==1){lcd.print(" 0.0 ");}if(zap==2){lcd.print(" 0.00 ");}}
  if(reg>0){w=0;}
  if(reg==0){if(w==1){
  EEPROM.update(0,i4_minus);
  EEPROM.update(1,abs(i4/100));
  EEPROM.update(2,abs(i4-i4/100*100));
  EEPROM.update(3,i20_minus);
  EEPROM.update(4,abs(i20/100));
  EEPROM.update(5,abs(i20-i20/100*100));
  EEPROM.update(6,zap);}
  u = analogRead(A0); // измерение по входу А0
  u_f = (u*u_ref)/1023;
  i = u_f*20;
  lcd.setCursor(0,1);lcd.print("I = ");lcd.print(i,2);lcd.print(" mA");
  if(i<3.8){lcd.setCursor(14,1);lcd.print("LO");}
  if(i>20.2){lcd.setCursor(14,1);lcd.print("HI");}
  iz =(i20-i4)/16.0*i-(i20-i4)/16.0*4+i4;
  lcd.setCursor(0,0);lcd.print(iz,zap);lcd.setCursor(10,0);lcd.print("4-20mA");
  }
  w++;delay(300);lcd.clear();
}

Comments

Добавить комментарий

Войти с помощью: