На 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 В.
Для чего в этой схеме реализовано 4 разъема на входе? Не совсем понятно назначение конденсаторов между выводами одноимённых потенциалов
4-x проводное подключение компенсирует сопротивление измерительных проводов. Конденсаторы установлены для помехоподавления.
Можно ли, сделать 2 в одном? Амперметр и омметр на ADS1110,:
1шт. — ардуино
2шт. — ADS1110
2шт. — TM1637 или 1 — LCD 1602
Вы писали про ADS1110, что по шине i2C доступно 8 адресов.
Я понял, что можно подключать по шине
8 датчиков?
Так почему бы 2 в одном не сделать?
Почему вы взяли библиотеку TM1637 для
STM32?
Эту библиотеку я написал для себя, мне с ней проще работать. Так же она полностью совместима с Arduino Nano.
Я спрашивал раньше, можно 2 в одном?
У меня нет 2-х АЦП
Но теоретически, можно?
Теоретически возможно.