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)

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