Миллиомметр на АЦП MCP3421 (Arduino)

Миллиомметр выполнен на платформе Arduino с использованием 18-битного одно канального сигма-дельта АЦП MCP3421. АЦП имеет свой внутренний источник опорного напряжения и программируемый усилитель. Связь с АЦП осуществляется по интерфейсу I2C (SDA и SCL === А4 и А5).

Схема миллиомметра очень простая, помимо АЦП она содержит 4 конденсатора и одно эталонное сопротивление (манганин) через которое подается ток на измеряемое сопротивление, от точности эталонного сопротивления зависит точность прибора.

Миллиомметр имеет четыре диапазона которые позволяются измерять сопротивление от 0,0000 до 8,5000 Ом в первом диапазоне, от 8,500 до 18,000 во втором, от 18,000 до 38,000 в третьем и от 38,00 до 172,00 Ом в четвертом.

В качестве источника опорного напряжение используется напряжение 3,3 В подаваемое с платы Arduino, но все же рекомендую использовать отдельный источник опорного напряжения с выходным током не менее 50 мА.

#include <Wire.h> // SDA и SCL (А4 и А5)
#include <MCP3421.h> // https://github.com/liman324/MCP3421.git
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  LiquidCrystal_I2C lcd(0x27,16,2);
  MCP3421 mcp;
 
 unsigned long dig,dig_sum;
 float u,r;
 const float u3300 = 3.241;  // опорное напряжение (V)
 const float  r_ogr = 100.00;// эталонное сопротивление (Om)
 const float r_0 = 0.0014;   // погрешность нуля (Om)
 int i,n=0,m;
 
void setup() {
 Serial.begin(9600);Wire.begin();
 mcp.setConfig(3,3);// 12 14 16 18 bit - 0-3 // 1x 2x 4x 8x gain - 0-3
 lcd.init();lcd.backlight();
}
 
void loop() {  
 /// авто переключение диапазонов /////////
 dig = mcp.readWire();  
 if(dig>131070&&n==0){mcp.setConfig(3,2);delay(50);n=1;}
 if(dig>131070&&n==1){mcp.setConfig(3,1);delay(50);n=2;}
 if(dig>131070&&n==2){mcp.setConfig(3,0);delay(50);n=3;}
 if(dig<65000&&n==1){mcp.setConfig(3,3);delay(50);n=0;}
 if(dig<65000&&n==2){mcp.setConfig(3,2);delay(50);n=1;}
 if(dig<65000&&n==3){mcp.setConfig(3,1);delay(50);n=2;}
 
  // калибровка диапазонов //
 dig = mcp.readWire(); 
 if(n==0){u = dig * 0.2569 /131071;}// n0 8   Om
 if(n==1){u = dig * 0.5156 /131071;}// n1 18  Om
 if(n==2){u = dig * 1.0270 /131071;}// n2 38  Om
 if(n==3){u = dig * 2.0510 /131071;}// n3 170 Om
 
 /// измерение /////////////////////////// 
 while(i<20){i++;dig = mcp.readWire();
 dig_sum = dig_sum+dig;delay(50);}
 i=0;dig=dig_sum/20;dig_sum=0;
 
 /// монитор порта ////////////////////////
 Serial.print(dig);Serial.print("  u=");Serial.print(u,6);Serial.print("  r=");
 Serial.print(((r_ogr*u)/(u3300-u))-r_0,4-n);Serial.print("  n=");Serial.println(n);
 
 switch(n){
  case 0: m=4;break;
  case 1: m=3;break;
  case 2: m=3;break;
  case 3: m=2;break;
  }
 r = ((r_ogr*u)/(u3300-u))-r_0;
 if(r>172){lcd.setCursor(0, 0);lcd.print(" R > 172.00 Om ");}
 else{lcd.setCursor(0, 0);lcd.print(" R = ");lcd.print(r,m);lcd.print(" Om   ");}
 lcd.setCursor(0, 1);lcd.print(" N ");lcd.print(n);
 if(r>172){lcd.setCursor(5, 1);lcd.print(" 0.000");lcd.print(" mA");}
 else{lcd.setCursor(5, 1);lcd.print(" ");lcd.print((u3300/(r+r_ogr))*1000);lcd.print(" mA");}
}

На дисплей LCD1602 (I2C) выводятся результаты измерения, а так же (во второй строке) номер предела и ток проходящий через измеряемое сопротивление.

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

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

const float u3300 = 3.241; // опорное напряжение (V)

const float r_ogr = 100.00;// эталонное сопротивление (Om)

const float r_0 = 0.0014; // погрешность нуля (Om)

После предварительной калибровки для повышения точности измерений Вам понадобится несколько эталонных сопротивлений или магазин сопротивлений с классом точности 0,02. Так как множитель АЦП не очень точен, необходимо подобрать поправочные коэффициенты для каждого диапазона.

if(n==0){u = dig * 0.2569 /131071;}// n0 8 Om

if(n==1){u = dig * 0.5156 /131071;}// n1 18 Om

if(n==2){u = dig * 1.0270 /131071;}// n2 38 Om

if(n==3){u = dig * 2.0510 /131071;}// n3 170 Om

Для подбора поправочного коэффициента необходимо подключить сопротивление с высокой точностью (магазин сопротивления) номиналами  8, 18, 38, 170 Ом и на каждом диапазоне установить нужный коэффициент добившись максимальной точности измерения сопротивления.

R0 = 0.0179 Ом

0.0287-0.0179 = 0.0108 Ом

0,0718-0,0179 = 0,0539 Ом

0,1210-0,0179 = 0,1031 Ом

0,5290-0,0179 = 0,5111 Ом

1,0201-0,0179 = 1,0022 Ом

5,0029-0,0179 = 4,985 Ом

10,024-0,0179 = 10,0061 Ом

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=923#p923

Comments

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

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