| Ваш IP: 3.235.66.217 | Online(38) - гости: 15, боты: 23 | Загрузка сервера: 0.83 ::::::::::::


Миллиомметр на АЦП 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

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

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

Случайные статьи

  • Блок питания 0-30V 1A

    Блок питания 0-30V 1A

    На рисунке показана схема простого лабораторного блока питания с выходным регулируемым напряжением 0-30В и максимальным током нагрузки 1А. Схема достаточно проста, в ней используется всего три транзистора. C1061 должен быть установлен на радиатор. Управление выходным напряжением осуществляется потенциометром VR1. Перечень элементов: R1, R2 10K 0,25Вт R3, R4  100 Ом 0,25Вт C1  1000мкФ 35В …Подробнее...
  • Источник питания 0…300В

    На рисунке показана схема простого источника питания с выходным регулируемым напряжением от 0 до 300В. Максимальный выходной ток 100мА. В схеме трансформатор имеет коэффициент трансформации 1, и служит для гальванической развязки сетевого напряжения от питания схемы источника питания. Полевой мощный транзистор контролирует выходное напряжение которое при помощи потенциометра VR1 можно …Подробнее...
  • Терморегулятор DS18B20 + энкодер  ky-040 (Arduino)

    Терморегулятор DS18B20 + энкодер ky-040 (Arduino)

    На рисунке показана схема простого и очень удобного в использовании терморегулятора, в качестве датчика используется DS18B20, а управление регулятором осуществляется при помощи энкодера ky-040. Интегральный датчик температуры DS18B20 имеет диапазон измерения температуры от -55 до + 125 °C, показания температуры выводятся на первую строку индикатора 1602 HD44780, во второй строке индикатора выводится показания регулятора …Подробнее...
  • Часы-будильник на микроконтроллере

    Часы-будильник на микроконтроллере

    Часы-будильник выполнены на микроконтроллере PIC16F877A и индикаторе WH1602D. Индикатор часов отображает текущее время (час.мин.сек), дату, месяц, год и день недели. Для установки времени необходимо нажать на кнопку «уст.времени» и при помощи кнопок «+» «-» установить время (часы и минуты) и далее дату, месяц, год, день недели. Для установки времени будильника …Подробнее...
  • Простейший переключатель елочных гирлянд (бегущий огонь)

    Простейший переключатель елочных гирлянд (бегущий огонь)

    Для создания эффекта «бегущий огонь» необходимо поочередно переключать не менее трех гирлянд. Схема переключателя (первый вариант), управляющего тремя гирляндами, представлена на рис.  Основу устройства составляет трехфазный мультивибратор, выполненный на трех инвертирующих логических элементах микросхемы DD1. Времязадающие цепи образованы элементами R1—R3, С1—СЗ. В любой момент на одном из выходов логических элементов …Подробнее...