26

Re: Миллиомметр 0 — 20 Ом (Arduino)

Вам надо посмотреть что измеряет ADS
Вот формула по которой ведется расчет:
rx = (r_ogr*u_iz)/(u3300-u_iz);
r_ogr = 100 Ом
u3300 - опорное - выводится на экране в мв
u_iz - падение напряжения после эталонного резистора в мв

В имеющемся скетче добавьте строчку:

Serial.println(u_iz);
в мониторе порта посмотрите что измеряет ADS и все станет ясно, вероятней всего у Вас при КЗ входа омметра значение u_iz уходит в минус, нужна калибровка нуля, но как правило при диффференциальном входе АЦП калибровка не нужна. Но видать такая микросхема попалась.

При КЗ входа u_iz должно быть 0.

27 (2019-09-30 15:05:41 отредактировано miklin)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Я не знаю как организовать просмотр монитора порта,не приходилось пользоваться.
Это вторая плата и другая ADC,на платах ведут одинаково, показания с минусом.

28

Re: Миллиомметр 0 — 20 Ом (Arduino)

Мне нужно больше данных, при КЗ входа у Вас -5000, а при измерении сопротивления например 1 Ом - что показывает?

Измерьте мультиметром напряжение между входами ацп А0 и А1, а так же между А2 и землей, все замеры при КЗ входа омметра.

29

Re: Миллиомметр 0 — 20 Ом (Arduino)

Замочил платы в спирте,мочились полдня,продул компрессором.
Замеры- 1 Ом (-4868.4 Ом U 5003.6 мВ)
А0-А1=49.1мв,А2-GND=5.012В.
Такие показания.

30

Re: Миллиомметр 0 — 20 Ом (Arduino)

По формуле все верно:
(100×49,1)÷(5012−49,1) = 0,98 Ом

В скетче надо временно изменить строчку:
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");
на
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u_iz,1);lcd.print(" mV");

на экран будет выводится падение напряжение на эталонном резисторе 100 Ом, собственно говоря при измерении 1 Ом падение напряжение должно быть  49,1 мВ

31

Re: Миллиомметр 0 — 20 Ом (Arduino)

miklin,покажите фото ваших плат - "рабочей" и "нерабочей"

32

Re: Миллиомметр 0 — 20 Ом (Arduino)

На данный момент фото рабочей платы нет,там пробная,на плате процессор,дисплей,резистор проволочный
константан,разём для подключения ADC. Вид полной сборки вид только с внутренней стороны и лицевая.Данный контент доступен только зарегистрированным пользователям.

33

Re: Миллиомметр 0 — 20 Ом (Arduino)

Если модуль АЦП работает, то можно предположить что на плате подключение к ADS1115 не верно.
http://forum.rcl-radio.ru/uploads/images/2019/10/ba2b4157a0aef54d9acd6c1387f95f85.png
http://forum.rcl-radio.ru/uploads/images/2019/10/ced633c20813f66dd83c58da6d022974.png

34

Re: Миллиомметр 0 — 20 Ом (Arduino)

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

35

Re: Миллиомметр 0 — 20 Ом (Arduino)

Тогда протестируйте стандартным скетчем дифференциальный вход А0 А1 подав напряжение от -2 В до +2 В, в мониторе порта выводится напряжение

#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads; 
/*Adafruit_ADS1115 ads(0x48);          задайте адрес устройства по которому 
будем работать на I2C шине (если уст-во одно, задавать адрес необязательно)*/
void setup(void)
{
  Serial.begin(9600);
 
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit =  0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit =  0.125mV
  ads.setGain(GAIN_TWO);           // 2x gain   +/- 2.048V  1 bit =  0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit =  0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit =  0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit =  0.0078125mV
   ads.begin();
}
  int16_t results;
  float multiplier = 0.0625F; // выбран предел +/- 2.048V

void loop(void){
  results = ads.readADC_Differential_0_1();  
  Serial.print("Differential: "); 
  Serial.print(results); Serial.print("("); 
  Serial.print(results * multiplier); 
  Serial.println("mV)");
  delay(1000);
}

36

Re: Миллиомметр 0 — 20 Ом (Arduino)

Я не знаю как смотреть монитор порта.
Не приходилось это делать.

37

Re: Миллиомметр 0 — 20 Ом (Arduino)

Сервис > монитор порта

38

Re: Миллиомметр 0 — 20 Ом (Arduino)

Замена строки(u3300,1) на (u_iz,1).
Измерение R=1 Om, R=0,0 mOm. U=-256.0 mV.
На 1 Оm мультиметром 49.43 mV.

39

Re: Миллиомметр 0 — 20 Ом (Arduino)

Что то не то, вход АЦП работает в дифференциальном режиме А0 А1, на А0 подается падение напряжения, а А1 практически замкнут на землю. У Вас -256 мВ результат измерения, либо что то не то с АЦП, либо А1 весит в воздухе или на него подается +5 В

40 (2019-10-08 23:32:40 отредактировано indman)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Добрый вечер!
Поэкспериментировал ещё с измерениями и остановился на варианте с диапазоном до 200 Ом.

#include <Wire.h>
#include <Adafruit_ADS1015.h>//https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include <LiquidCrystal.h>
Adafruit_ADS1115 ads;//(0x48);
/* в файле библиотеки Adafruit_ADS1015.cpp найти все строчки: ADS1015_REG_CONFIG_DR_1600SPS и заменить на: ADS1015_REG_CONFIG_DR_128SPS */
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

float multiplier = 0.0078125;
const int u_pogr=10;       // 10 мВ - погрешность ADS1115 при измерении 5 В
const float r_ogr=100.30;  // эталонное сопротивление 100 Ом
float u3300;
int  u_digital;
byte n,k;
long u_sum,u_an,x;
float u_iz,rx,rx_m;

void setup(void){Serial.begin(9600);lcd.begin(16, 2);ads.begin();delay(1000);}

void loop(){
  while(x<50){
x++;ads.setGain(GAIN_TWOTHIRDS);u3300=ads.readADC_SingleEnded(2)*0.1875-u_pogr;}
k++;if(k==60){x=0;k=0;}  // измерение напряжения 5В каждую минуту

if(n==0){ads.setGain(GAIN_SIXTEEN);multiplier = 0.0078125;}
if(u_iz>250&&n==0){n=1;}
if(n==1){ads.setGain(GAIN_EIGHT);multiplier = 0.015625;}
if(u_iz>500&&n==1){n=2;}
if(n==2){ads.setGain(GAIN_FOUR);multiplier = 0.03125;}
if(u_iz>1000&&n==2){n=3;}
if(n==3){ads.setGain(GAIN_TWO);multiplier = 0.0625;}
if(u_iz>2000&&n==3){n=4;}
if(n==4){ads.setGain(GAIN_ONE);multiplier = 0.125;}

if(u_iz<2000&&n==4){n=3;}
if(u_iz<1000&&n==3){n=2;}
if(u_iz<500&&n==2){n=1;}
if(u_iz<250&&n==1){n=0;}

lcd.clear();
lcd.setCursor(1,0);
if(rx<1){rx_m=rx*1000;lcd.print("R = ");lcd.print(rx_m,1);lcd.print(" mOm");}
if(rx>=1&&rx<100){lcd.print("R = ");lcd.print(rx,3);lcd.print(" Om");}
if(rx>=100&&rx<200){lcd.print("R = ");lcd.print(rx,2);lcd.print(" Om");}
if(rx>=200){lcd.print("Rx > 200 Om    ");}
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");
u_sum=0;
for(int i=0;i<100;i++){  // измерение
u_digital = ads.readADC_Differential_0_1();
u_sum = u_sum + u_digital;
delay(1);
}
u_an=u_sum/100;
u_iz=u_an * multiplier;
rx = (r_ogr*u_iz)/(u3300-u_iz);

}

Точность вполне устраивает,можно разрабатывать печатку.
На фото замер SMD 1206 на 1 мОм(1%), 1.8 Ом(1%), 40 Ом(0,1%) и 200 Ом(0,1%).http://forum.rcl-radio.ru/uploads/images/2019/10/5c815b9f8d70f718d02c17bcc9139555.jpg

Ещё пару вопросов по скетчу:
1. Можно ли увеличить скорость работы AЦП?
2. Можно ли выводить во 2-й строке(поочередно) кроме напряжения ещё и ток,зная величину падения напряжения на 100 Ом опорнике?

41

Re: Миллиомметр 0 — 20 Ом (Arduino)

1
можно уменьшить ко-во замеров:

for(int i=0;i<100;i++){  // измерение


2
новые переменные
int I;
unsigned long times;

расчет тока:
int I=(u3300-u_iz)/r_ogr;

поочередный показ напряжения и тока:
if(millis()-times<1000){
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");}
if(millis()-times>1000){
lcd.setCursor(1,1);lcd.print("I = ");lcd.print(I,1);lcd.print(" mA");}
if(millis()-times>2000){times=millis();}

42 (2019-10-09 14:41:48 отредактировано indman)

Re: Миллиомметр 0 — 20 Ом (Arduino)

liman324 пишет:

1
можно уменьшить ко-во замеров:

for(int i=0;i<100;i++){  // измерение


2
новые переменные
int I;
unsigned long times;

расчет тока:
int I=(u3300-u_iz)/r_ogr;

поочередный показ напряжения и тока:
if(millis()-times<1000){
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");}
if(millis()-times>1000){
lcd.setCursor(1,1);lcd.print("I = ");lcd.print(I,1);lcd.print(" mA");}
if(millis()-times>2000){times=millis();}

1.Любое уменьшение этого значения(100) приводит к зависанию
показаний при старте.

2.Изменил скетч -теперь во 2-й строке всё время отображается ток,строки с напряжением нет.
Вот новый скетч с правками :
#include <Wire.h>
#include <Adafruit_ADS1015.h>//https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include <LiquidCrystal.h>
Adafruit_ADS1115 ads;//(0x48);
/* в файле библиотеки Adafruit_ADS1015.cpp найти все строчки: ADS1015_REG_CONFIG_DR_1600SPS и заменить на: ADS1015_REG_CONFIG_DR_128SPS */
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

float multiplier = 0.0078125;
const int u_pogr=10;       // 10 мВ - погрешность ADS1115 при измерении 5 В
const float r_ogr=100.30;  // эталонное сопротивление 100 Ом
float u3300;
int  u_digital;
byte n,k;
long u_sum,u_an,x;
float u_iz,rx,rx_m;
int I;
unsigned long times;

void setup(void){Serial.begin(9600);lcd.begin(16, 2);ads.begin();delay(1000);}

void loop(){
  while(x<50){
x++;ads.setGain(GAIN_TWOTHIRDS);u3300=ads.readADC_SingleEnded(2)*0.1875-u_pogr;}
k++;if(k==60){x=0;k=0;}  // измерение напряжения 5В каждую минуту

if(n==0){ads.setGain(GAIN_SIXTEEN);multiplier = 0.0078125;}
if(u_iz>250&&n==0){n=1;}
if(n==1){ads.setGain(GAIN_EIGHT);multiplier = 0.015625;}
if(u_iz>500&&n==1){n=2;}
if(n==2){ads.setGain(GAIN_FOUR);multiplier = 0.03125;}
if(u_iz>1000&&n==2){n=3;}
if(n==3){ads.setGain(GAIN_TWO);multiplier = 0.0625;}
if(u_iz>2000&&n==3){n=4;}
if(n==4){ads.setGain(GAIN_ONE);multiplier = 0.125;}

if(u_iz<2000&&n==4){n=3;}
if(u_iz<1000&&n==3){n=2;}
if(u_iz<500&&n==2){n=1;}
if(u_iz<250&&n==1){n=0;}

lcd.clear();
lcd.setCursor(1,0);
if(rx<1){rx_m=rx*1000;lcd.print("R = ");lcd.print(rx_m,1);lcd.print(" mOm");}
if(rx>=1&&rx<100){lcd.print("R = ");lcd.print(rx,3);lcd.print(" Om");}
if(rx>=100&&rx<200){lcd.print("R = ");lcd.print(rx,2);lcd.print(" Om");}
if(rx>=200){lcd.print("Rx > 200 Om    ");}
//lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");
int I=(u3300-u_iz)/r_ogr;
if(millis()-times<1000){
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");}
if(millis()-times>1000){
lcd.setCursor(1,1);lcd.print("I = ");lcd.print(I,1);lcd.print(" mA");}
if(millis()-times>2000){times=millis();}

u_sum=0;
for(int i=0;i<100;i++){  // измерение
u_digital = ads.readADC_Differential_0_1();
u_sum = u_sum + u_digital;
delay(1);
}
u_an=u_sum/100;
u_iz=u_an * multiplier;
rx = (r_ogr*u_iz)/(u3300-u_iz);


}
http://forum.rcl-radio.ru/uploads/images/2019/10/e623a893c87a23f27e20adb78705f1ab.jpg

43

Re: Миллиомметр 0 — 20 Ом (Arduino)

#include <Wire.h>
#include <Adafruit_ADS1015.h>//https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include <LiquidCrystal.h>
Adafruit_ADS1115 ads;//(0x48);
/* в файле библиотеки Adafruit_ADS1015.cpp найти все строчки: ADS1015_REG_CONFIG_DR_1600SPS и заменить на: ADS1015_REG_CONFIG_DR_128SPS */
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

float multiplier = 0.0078125;
const int u_pogr=10;       // 10 мВ - погрешность ADS1115 при измерении 5 В
const float r_ogr=100.30;  // эталонное сопротивление 100 Ом
float u3300;
int  u_digital;
byte n,k;
long u_sum,u_an,x;
float u_iz,rx,rx_m;
int I;
unsigned long times;

void setup(void){Serial.begin(9600);lcd.begin(16, 2);ads.begin();delay(1000);}

void loop(){
  while(x<50){
x++;ads.setGain(GAIN_TWOTHIRDS);u3300=ads.readADC_SingleEnded(2)*0.1875-u_pogr;}
k++;if(k==60){x=0;k=0;}  // измерение напряжения 5В каждую минуту

if(n==0){ads.setGain(GAIN_SIXTEEN);multiplier = 0.0078125;}
if(u_iz>250&&n==0){n=1;}
if(n==1){ads.setGain(GAIN_EIGHT);multiplier = 0.015625;}
if(u_iz>500&&n==1){n=2;}
if(n==2){ads.setGain(GAIN_FOUR);multiplier = 0.03125;}
if(u_iz>1000&&n==2){n=3;}
if(n==3){ads.setGain(GAIN_TWO);multiplier = 0.0625;}
if(u_iz>2000&&n==3){n=4;}
if(n==4){ads.setGain(GAIN_ONE);multiplier = 0.125;}

if(u_iz<2000&&n==4){n=3;}
if(u_iz<1000&&n==3){n=2;}
if(u_iz<500&&n==2){n=1;}
if(u_iz<250&&n==1){n=0;}

lcd.clear();
lcd.setCursor(1,0);
if(rx<1){rx_m=rx*1000;lcd.print("R = ");lcd.print(rx_m,1);lcd.print(" mOm");}
if(rx>=1&&rx<100){lcd.print("R = ");lcd.print(rx,3);lcd.print(" Om");}
if(rx>=100&&rx<200){lcd.print("R = ");lcd.print(rx,2);lcd.print(" Om");}
if(rx>=200){lcd.print("Rx > 200 Om    ");}
//lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");

I=(u3300-u_iz)/r_ogr;

if(millis()-times<2000){
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");}
if(millis()-times>2000){
lcd.setCursor(1,1);lcd.print("I = ");lcd.print(I,1);lcd.print(" mA");}
if(millis()-times>4000){times=millis();}

u_sum=0;
for(int i=0;i<50;i++){  // измерение
u_digital = ads.readADC_Differential_0_1();
u_sum = u_sum + u_digital;
delay(1);
}
u_an=u_sum/50;
u_iz=u_an * multiplier;
rx = (r_ogr*u_iz)/(u3300-u_iz);


}

44

Re: Миллиомметр 0 — 20 Ом (Arduino)

Да,с такой правкой всё работает как задумано,спасибо.
Но, мелькание строк начинает напрягать, поэтому попробовал ещё такой вариант
lcd.setCursor(0,1);lcd.print("U=");lcd.print(u3300,1);lcd.print("mV");
lcd.setCursor(11,1);lcd.print("I=");lcd.print(I,1);lcd.print("mA");

Теперь напряжение и ток выводятся одновременно,только для тока не хватает одного знакоместа.
Как выводить напряжение без десятых милливольта или просто освободить место убрав знак = ?
http://forum.rcl-radio.ru/uploads/images/2019/10/fef26c63b355dd0d2349d6da6b834952.jpg

45

Re: Миллиомметр 0 — 20 Ом (Arduino)

Без десятичной точки:
lcd.print(u3300,0);

Этого будет достаточно, сразу 2 знака освободится

46

Re: Миллиомметр 0 — 20 Ом (Arduino)

Да,теперь,по моему, всё вписывается и наглядно. Спасибо за помощь и терпение. smile http://forum.rcl-radio.ru/uploads/images/2019/10/ca4ce59b1208241b95970582fb88346e.jpg


lcd.setCursor(2,0);
if(rx<1){rx_m=rx*1000;lcd.print("R = ");lcd.print(rx_m,1);lcd.print(" mOm");}
if(rx>=1&&rx<100){lcd.print("R = ");lcd.print(rx,3);lcd.print(" Om");}
if(rx>=100&&rx<200){lcd.print("R = ");lcd.print(rx,2);lcd.print(" Om");}
if(rx>=200){lcd.print("Rx > 200 Om    ");}

I=(u3300-u_iz)/r_ogr;

lcd.setCursor(0,1);lcd.print("U=");lcd.print(u3300,0);lcd.print("mV");
lcd.setCursor(10,1);lcd.print("I=");lcd.print(I,1);lcd.print("mA");

47

Re: Миллиомметр 0 — 20 Ом (Arduino)

Хороший получился прибор, если что обращайтесь.

48

Re: Миллиомметр 0 — 20 Ом (Arduino)

limfn 324 Это всё работает пока на проводочках,у меня на проводах тоже работает.
А вот печатки уже сделал две и разные ADS не работают и уже голову сломал в чём
причина. И если можно скомпилируйте свой последний скеч для меги8.
Заранье благодарен.

49

Re: Миллиомметр 0 — 20 Ом (Arduino)

Данный контент доступен только зарегистрированным пользователям.

50 (2019-10-23 15:00:16 отредактировано miklin)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Вроде с места немножко сдвинулось,сделал переходную плату для прибора
на проводах. Проверил четыре платы и оказалось две врут и по разному.
А можно попросить сделать вывод на ЖК дисплей, программы для проверки
несимметричных входов ADS.