| Ваш IP: 3.238.184.78 | Online(27) - гости: 8, боты: 19 | Загрузка сервера: 0.46 ::::::::::::

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

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

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

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

  • Онлайн — калькулятор расчета провода для плавкого предохранителя

    Онлайн — калькулятор расчета провода для плавкого предохранителя

    Плавкий предохранитель является самым слабым участком защищаемой электрической цепи, срабатывающим в аварийном режиме, тем самым разрывая цепь и предотвращая последующее разрушение более ценных элементов электрической цепи высокой температурой, вызванной чрезмерными значениями силы тока. Они дешевы и просты в изготовлении и в случае короткого замыкания в сети обеспечивает защиту проводки от …Подробнее...
  • Простой осциллограф на Arduino Nano (Uno) + TLC5540 + Nokia 5110

    Простой осциллограф на Arduino Nano (Uno) + TLC5540 + Nokia 5110

    На рисунке показана схема простого осциллографа на Arduino Nano (Uno) состоящего из платы Arduino, LCD дисплей 84×48 Nokia 5110 и быстродействующего 8-и битного АЦП TLC5540. TLC5540 — представляет собой быстродействующий 8 битный АЦП, который осуществляет преобразование с производительностью до 40 MSPS. Тактовые импульсы для АЦП поступают с 9 цифрового выхода …Подробнее...
  • Вакуумно-люминесцентные индикаторы

    Вакуумно-люминесцентные индикаторы

    Вакуумные люминесцентные индикаторы (далее как ВЛИ) преобразуют электрическую энергию в световую. По виду отображения информации они бывают единичные, цифровые, буквенные, шкальные, мнемонические и графические, а по исполнению могут быть одноразрядными, многоразрядными, а так же без фиксированных знакомест. Главное достоинство таких индикаторов это: высокая яркость, низкое рабочее напряжение, малое энергопотребление. Недостатком использования …Подробнее...
  • УМЗЧ 300Вт

    УМЗЧ 300Вт

    Представленная схема усилителя мощности звуковой частоты развивает мощность на нагрузке 8 Ом 200Вт и 300Вт на нагрузке 4 Ом. Усилитель питается от 2-х полярного источника питания +/-80В. Как видно из схемы положительная полу волна входного сигнала через R4  поступает на дифференциальный усилитель на 2-х транзисторах VT1 VT2 2SC1775, при этом …Подробнее...
  • STM32 + DS18B20 — терморегулятор (Arduino)

    STM32 + DS18B20 — терморегулятор (Arduino)

    При использовании отладочной платы STM32 (базе микроконтроллера STM32F103C8T6) совместно с цифровым датчиком температуры можно сделать простой терморегулятор (-50…+125 °С). Информация об текущей температуре и температуре регулирования выводится на 4-х разрядный семисегментный дисплей на базе драйвера TM1637 (модуль). Управление терморегулятором осуществляется при помощи двух кнопок (+ и -), значение температуры регулирования …Подробнее...