Миллиомметр на ADS1110 (Arduino)

На ADS1110 можно собрать достаточно простой и точный миллиомметр. Миллиомметр предназначен для точного измерения сопротивления до 10 Ом, с разрешением 0,001 Ом. Выше 10 Ом точность показаний немного падает. Предел измерения миллиомметра о 0 до 150 Ом.

ADS1110 (более подробно) это прецизионный аналого-цифровой (A/D) преобразователь с дифференциальным входом и разрешением до 16 бит. Встроенный ИОН 2,048 В обеспечивает входной диапазон ±2,048 В. ADS1110 использует I2C интерфейс для связи с микроконтроллером. ADS1110  выполняет измерения со скоростью 15, 30, 60 или 240 выборок в секунду, содержит встроенный усилитель напряжения с коэффициентом 1, 2, 4, 8.

Миллиомметр состоит из АЦП ADS1110, высокоточного резистора на 100 Ом, четырех разрядного семисегментного индикатора и платы Arduino Nano. Так же в схеме применена кнопка «0», для калибровки нуля перед измерением низкоомных сопротивлений. Для калибровки нуля, нужно замкнуть накоротко измерительные провода и нажать кнопку «0».

Измерительные провода имеют одинаковую длину, которые подключаются к разъему X1, проводники соединяющие разъем Х1 и АЦП должны иметь минимально возможную длину. Вторые концы измерительных проводов соединяются непосредственно на контактах измеряемого сопротивления.

#include <Wire.h>
#include <STM32_TM1637.h>                // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
STM32_TM1637 tm(2,3);// CLK, DIO
 
#define ADDR 0x48
#define U33 3.342
int n=3;
float r,u,n_u=0.256,r0;
  long dig_sum,dig;
  int value,f;
 
void setup() {
  Serial.begin(9600);
  tm.brig(7); // ЯРКОСТЬ 0...7
  Wire.begin();
  pinMode(4,INPUT_PULLUP);// null
}
 
void loop() {
  r = ((100.00*u)/(U33-u))-r0;
  if(digitalRead(4)==LOW&&r<0.1){r0=((100.00*u)/(U33-u));delay(200);}
 
  for(int i=0;i<10;i++){
  read_u();
  dig_sum = dig_sum+value;delay(10);}
 
read_u();if(value>0x7FFF-0xF&&n==1){delay(10);n=0;n_u=2.048;}
read_u();if(value>0x7FFF-0xF&&n==2){delay(10);n=1;n_u=1.024;}
read_u();if(value>0x7FFF-0xF&&n==3){delay(10);n=2;n_u=0.512;}
read_u();if(value<16380&&n==0){delay(10);n=1;n_u=1.024;}
read_u();if(value<16380&&n==1){delay(10);n=2;n_u=0.512;}
read_u();if(value<16380&&n==2){delay(10);n=3;n_u=0.256;}
 
  dig = dig_sum/10;dig_sum=0;
  u = dig*n_u/0x7FFF;
 
 if(r<10){tm.print_float(r,3 ,0,0,0,0);}
 if(r>=10&&r<100){tm.print_float(r,2 ,0,0,0,0);}
 if(r>=100&&r<=150){tm.print_float(r,1 ,0,0,0,0);}
 if(r>150){tm.print_float(r,0 ,0b01000000,0b01000000,0b01000000,0b01000000);}
 
 Serial.println(r0,5);
  }
 
float read_u(){
  Wire.beginTransmission(ADDR);
  Wire.write (0b10001100+n);
  Wire.endTransmission();
  Wire.requestFrom(ADDR,2);
  while(Wire.available()<2);
  value = (Wire.read()<<8) + (Wire.read());
  }

Тестирование

Для калибровки миллиомметра необходимо точно измерить напряжение 3,3 В (подается с платы Arduino) и указать его в строке:

#define U33 3.342

Точность измерения сопротивления напрямую зависит от точности эталонного сопротивления 100 Ом и точности измерения напряжения 3,3 В.

Comments

  1. Для чего в этой схеме реализовано 4 разъема на входе? Не совсем понятно назначение конденсаторов между выводами одноимённых потенциалов

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

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