51

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

Уточните вопрос, Вам нужен hex файл на базе скетча омметра для проверки АЦП, то есть оставить то же подключение lcd и сделать тестовый скетч АЦП?

52

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

Да именно.
Запаял исправную плату,все работает.
А у двух нужно определить какие входы не исправны
чтобы можно использовать.
Благодарен вам за помощь.

53

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

Проверка диф. входов, подавать напряжение +/- 2В (мах) на входы А0 А1 и А2 А3
Данный контент доступен только зарегистрированным пользователям.

54

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

Благодарю !!!

55

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

Здравствуйте.
Скажите пожалуйста если установить на канале множитель 16(то есть измерять 0,256В)
а подать скажем 1В. не сгорит ли  канал.

56

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

Нет не сгорит, можете подать напряжение на вход до напряжения питания АЦП (только положительное относительно минуса питания).

57

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

Здравствуйте.
Основываясь на вашей идеи, взял на себя смелость и ещё немного расширить диапазон измерений.
// arduino IDE 1.8.5

#include "Adafruit_ADS1015.h"
#include <LiquidCrystal.h>

#define Up 0
#define Ur 1
#define Uo 2

#define w 20 // количество циклов измерения
#define e 50 //количество измерений на резисторе

unsigned long Up_v=0, Up_b=0; //напряжение питания в миливольтах   и битах
unsigned long Ur_v=0, Ur_b=0; //напряжение сопротивления R2 в миливольтах   и битах
unsigned long Uo_v=0, Uo_b=0; //напряжение нулевого в миливольтах   и битах
unsigned long UR_v=0, UR_b=0; //напряжение сопротивления R1 в миливольтах   и битах
float mnogV[6] = {0.1875,0.125,0.0625,0.03125,0.015625,0.0078125};//множетели усилителя в милливольтах
int mnogB[6] = {24,16,8,4,2,1};// коэффициент усиления.
int i,n;
float Rx_d=0; //искомое сопротивление на дисплее
float Rx=0; //сопротивление в миллиомах
const long Ro=99945;//эталонное сопротивление в миллиомах необходимо точно измерить

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
LiquidCrystal lcd(1, 0, 4, 5, 6, 7);

void setup(void)
{
  lcd.begin(16, 2);
  ads.begin();
  pinMode(9,OUTPUT);//подсветка дисплея
  analogWrite(9, 25);
  lcd.print("  Miliommetr");
  delay (1000);

  pinMode(3,INPUT_PULLUP);//кнопка
  pinMode(10,OUTPUT);//выключение блока
  digitalWrite(10,HIGH);
  lcd.clear();
 
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  //ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
// ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
 

}

void loop(void)
{   N:
    // напряжение питания
   ads.setGain(GAIN_TWOTHIRDS);n=0;
   Ur_b=0;
   Up_b=0;
   for (i=0; i<w ; i++)
   {
    Up_b=Up_b + ads.readADC_SingleEnded(Up);
    Ur_b=Ur_b + ads.readADC_SingleEnded(Ur);
   }
   
   Up_b= Up_b/w;
   Ur_b= Ur_b/w;
   if ( (Up_b - Ur_b) <= 10){lcd.setCursor(1,0);lcd.print(" R > 100 kOm     ");
                      lcd.setCursor(1,1);lcd.print(" Up= ");
                      lcd.print(Up_b*mnogV[0],0);lcd.print(" mV    ");
                      goto N;}

   //падение напряжения на нулевом проводе
   ads.setGain(GAIN_SIXTEEN);n=5;
   Uo_v=0; Uo_b=0;
   for (i=0; i<w ; i++)
   {
    Uo_b= + ads.readADC_SingleEnded(Uo);
   }
   Uo_b= Uo_b/w;
   Uo_b = Uo_b* mnogB [5];

// Переходим к расчетам 
Rx=0;
if (Ur_b < 10922){litl(); LCD();}  // если меньше 2,048 измерять как малое сопротивление
else {big(); LCD();}

  //delay(500);

}

void big (void)//измерение больших сопротивлений от 69 Ом // неучитываем падение на шупах
{
   
   ads.setGain(GAIN_TWOTHIRDS);n=0;
   UR_b =  ads.readADC_Differential_0_1();
 
  if (UR_b < 1365 ){n=5;ads.setGain(GAIN_SIXTEEN);};//падение напряжения на R1 меньше 0,256 В R1>950 Ом
  if (UR_b < 2730 && UR_b >= 1365){n=4;ads.setGain(GAIN_EIGHT);};//падение напряжения на R1 меньше 0,512 В R1>900 Ом
  if (UR_b < 5461 && UR_b >= 2730 ){n=3; ads.setGain(GAIN_FOUR);}; //падение напряжения на R1 меньше 1,024 В R1>400 Ом
  if (UR_b < 10922  && UR_b >= 5461){n=2;ads.setGain(GAIN_TWO);};//падение напряжения на R1 меньше 2,048 В R1>150 Ом
  if (UR_b < 21800  && UR_b >= 10922){n=1;ads.setGain(GAIN_ONE);};//падение напряжения на R1 меньше 4.096 В R1>25 Ом

  UR_b=0;
  for (i=0;i<e;i++)
  {
    UR_b =UR_b + ads.readADC_Differential_0_1();
  }
  UR_b = UR_b/e;
 
  UR_b = UR_b* mnogB [n]; // приводим к единой системе целых чисел 
  Up_b = Up_b* mnogB [0] ;
 
  Rx = (Up_b-UR_b);
  Rx = Rx/UR_b;
  Rx = Rx*Ro;
  Ur_b =Up_b-UR_b;
}

void litl (void) // измерение малых сопротивлений до 69 Ом
{
  if (Ur_b < 1365){n=5;ads.setGain(GAIN_SIXTEEN);};// меньше 0,256 В сопроивление меньше 5,4 Ом
  if (Ur_b < 2730 && Ur_b >= 1365){n=4;ads.setGain(GAIN_EIGHT);};//меньше 0,512 В сопроивление меньше 11,4 Ом
  if (Ur_b < 5461 && Ur_b >= 2730){n=3;ads.setGain(GAIN_FOUR);};//меньше 1.024 В сопроивление меньше 25,77 Ом
  if (Ur_b < 10922 && Ur_b >= 5461){n=2;ads.setGain(GAIN_TWO);};//меньше 2.048 В сопроивление меньше 69,44 Ом
  Ur_b =0;
  for (i=0;i < e;i++)
  {
   Ur_b=Ur_b + ads.readADC_SingleEnded(Ur);
  }
  Ur_b =Ur_b / e;
           
   Ur_b = Ur_b* mnogB [n]; // приводим к единой системе целых чисел 
   Up_b = Up_b* mnogB [0] ;

   Rx=(Up_b - Ur_b - Uo_b);
   Rx=Rx/(Ur_b - Uo_b);
   Rx=Ro/Rx;// сопротивление в миллиомах
   
 
}

void LCD(void)
{
lcd.setCursor(1,0);
//{lcd.print("R = ");lcd.print(Rx,1);lcd.print(" Om");}

if(Rx < 10){lcd.print("R = "); Rx_d=Rx; lcd.print(Rx_d,4); lcd.print(" mOm  ");};
if(Rx>=10 && Rx<100){lcd.print("R = ");Rx_d=Rx;lcd.print(Rx_d,3);lcd.print(" mOm  ");};
if(Rx>=100 && Rx<1000){lcd.print("R = ");Rx_d=Rx;lcd.print(Rx_d,2);lcd.print(" mOm  ");};
if(Rx>=1000 && Rx<10000){lcd.print("R = ");Rx_d=Rx/1000;lcd.print(Rx_d,4);lcd.print(" Om  ");};
if(Rx>=10000 && Rx<100000){lcd.print("R = ");Rx_d=Rx/1000;lcd.print(Rx_d,3);lcd.print(" Om  ");};
if(Rx>=100000 && Rx<1000000){lcd.print("R = ");Rx_d=Rx/1000;lcd.print(Rx_d,2);lcd.print(" Om  ");};
if (Rx >= 1000000) Rx =Rx/1000000;
if(Rx < 10){lcd.print("R = "); Rx_d=Rx; lcd.print(Rx_d,4); lcd.print(" kOm  ");};
if(Rx>=10 && Rx<100){lcd.print("R = ");Rx_d=Rx;lcd.print(Rx_d,3);lcd.print(" kOm  ");};
if(Rx>=100 && Rx<1000){lcd.print("R = ");Rx_d=Rx;lcd.print(Rx_d,2);lcd.print(" kOm  ");};
//if(Rx>=120 ){lcd.print("R >  100 kOm  ");};

Ur_v=Ur_b*mnogV[5];
Up_v=Up_b*mnogV[5];
lcd.setCursor(1,1);lcd.print("U=");lcd.print(Ur_v,1);lcd.print("   ");
lcd.setCursor(9,1);lcd.print("U=");lcd.print(Up_v,1);lcd.print("   ");
}

58

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

добрый день. как раз искал темку простого миллиомметра и забрел на эту тему.
первым же вопросом у меня оказался такой - почему задатчиком тока решили сделать резистор? что помимо самой неточности резистора добавляет хлопот по измерению референсного напряжения? не проще ли поставить источник тока? простейший на LM317 или же чуть более сложный на ОУ  + транзистор (а добавив цап например копеечный mcp4725 можно получить широкий диапазон измерений)

59

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

Так было проще, эталонное сопротивление намотоно из манганиновой проволоки (взято из магазина сопротивления КТ 0.02), опорное напряжение и падение напряжения на измеряемом сопротивлении измеряется одним АЦП.

60

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

Спасибо, что поделились.

61 (2022-01-06 10:39:30 отредактировано sanj76a)

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

Такой работать будет? Если да, то какая библиотека?

http://forum.rcl-radio.ru/uploads/images/2022/01/5e33669d6d323f0e813fb22b5c37d214.jpg

Какой скетч окончательный?

62

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

http://rcl-radio.ru/wp-content/uploads/2018/07/43726786234789.png

Библиотека — https://github.com/addicore/ADS1115/archive/master.zip

На каждый вход подайте напряжение, но только положительное, например с батарейки 1,5 В и в мониторе порта посмотрите напряжение.

#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 adc0, adc1, adc2, adc3;
void loop(void) {
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
 
  delay(1000);
}

63 (2022-01-09 13:34:16 отредактировано sanj76a)

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

Вы немного не поняли, у меня модуль как на фото (1115/1015), у вас используется по конструкции другой. Мой будет работать в вашей схеме или нет?
Про один и тот же модуль Гугл пишет:
4канала-12 бит, в другом случае- 4канала-16 бит????

64

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

Должен, конструкция модуля другая, но чип то один и тот же

65 (2022-01-07 10:35:27 отредактировано sanj76a)

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

В скетче для теста ADS1115 подключается библиотека -- #include <Adafruit_ADS1015.h>, почему 1015
скачиваю https://github.com/addicore/ADS1115/archive/master.zip
меняю название , что-то упустил,не могу понять почему при проверке не находит библиотеку

66 (2022-01-07 10:23:55 отредактировано sanj76a)

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

Arduino: 1.8.16 (Windows 10), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"



sketch_jan07a:2:10: fatal error: Adafruit_ADS1015: No such file or directory

#include <Adafruit_ADS1015>

          ^~~~~~~~~~~~~~~~~~

compilation terminated.

exit status 1

Adafruit_ADS1015: No such file or directory



Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

67

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

Я Вам не ту ссылку на библиотеку дал - http://rcl-radio.ru/wp-content/uploads/ … master.zip

68

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

liman324 пишет:

Я Вам не ту ссылку на библиотеку дал - http://rcl-radio.ru/wp-content/uploads/ … master.zip

все ок!

69 (2022-01-09 20:28:46 отредактировано sanj76a)

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

liman324 пишет:

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

как стоят фьюзы?

70

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

Какие фьюзы выставлять я не знаю, да и зачем, есть же исходник в скетче.

71

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

Прогнал магазин на МС-6:

http://forum.rcl-radio.ru/uploads/images/2022/01/6cca778cd5fa39544f00031a7960caf5.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/167745e2f018db31fd161df802b1106c.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/89b9bd147adec2eb63070a03b7cfe950.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/7a6bc0c79d988fa8387cccf0cbc07e65.jpg

72 (2022-01-13 00:37:35 отредактировано sanj76a)

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

Показания устройства: те же сопротив ления с магазина с мегазина.

200 Ом - 189.74
100 Ом - 99.58
10 Ом - 10.060 ом
1  Ом -   1.144 ом
0.1 Ом -  260.5 мОм
0.01 Ом - 170.1 мОм


100 Ом

http://forum.rcl-radio.ru/uploads/images/2022/01/292e7748aa7fb81983caeaa4efde5e30.jpg


0.1 Ом

http://forum.rcl-radio.ru/uploads/images/2022/01/170be968dfbe5498d704845d40cb1a13.jpg


0.01 Ом

http://forum.rcl-radio.ru/uploads/images/2022/01/fab42352dacbaccc5205eabb8331ad19.jpg

73 (2022-01-13 00:43:08 отредактировано sanj76a)

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

liman324 пишет:

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

Запустил на МЕГЕ 8, заработало срезу. Фигня! Или что-то не так делаю?

-Показания на ЛСД появляются через 25 сек. после включения питания.
-Через 5с. обновляются показания. Пока установится, очень долго ждать!

-Вы писали:...На фото я заметил что у Вас в качестве эталонного резистора стоит МЛТ-1!
                      Его надо менять на манганин.
Почему? У меня МЛТ подобрано - 100,5 Ом Замерял МС-6

-От чего зависит точность и линейность показаний. Только от 100 Ом?

74

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

Используйте arduino IDE для загрузки

Нужно подобрать напряжение для каждого диапазона

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;}

указать сопротивление эталонного резистора, использовать нужно манганин

const float r_ogr=100.30;


#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);


}

75 (2022-01-13 00:59:39 отредактировано sanj76a)

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

Мегу8 через Ардуино IDE? Как? У  меня вот:

http://forum.rcl-radio.ru/uploads/images/2022/01/a791df67e2f6fc9e3bb30a2406207b0c.jpg


Добавить Мега8, указать программатор, какой? (USBASP оставить?)