Re: Миллиомметр 0 — 20 Ом (Arduino)
Уточните вопрос, Вам нужен hex файл на базе скетча омметра для проверки АЦП, то есть оставить то же подключение lcd и сделать тестовый скетч АЦП?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Законченные проекты → Миллиомметр 0 — 20 Ом (Arduino)
Уточните вопрос, Вам нужен hex файл на базе скетча омметра для проверки АЦП, то есть оставить то же подключение lcd и сделать тестовый скетч АЦП?
Да именно.
Запаял исправную плату,все работает.
А у двух нужно определить какие входы не исправны
чтобы можно использовать.
Благодарен вам за помощь.
Проверка диф. входов, подавать напряжение +/- 2В (мах) на входы А0 А1 и А2 А3
Данный контент доступен только зарегистрированным пользователям.
Благодарю !!!
Здравствуйте.
Скажите пожалуйста если установить на канале множитель 16(то есть измерять 0,256В)
а подать скажем 1В. не сгорит ли канал.
Нет не сгорит, можете подать напряжение на вход до напряжения питания АЦП (только положительное относительно минуса питания).
Здравствуйте.
Основываясь на вашей идеи, взял на себя смелость и ещё немного расширить диапазон измерений.
// 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(" ");
}
добрый день. как раз искал темку простого миллиомметра и забрел на эту тему.
первым же вопросом у меня оказался такой - почему задатчиком тока решили сделать резистор? что помимо самой неточности резистора добавляет хлопот по измерению референсного напряжения? не проще ли поставить источник тока? простейший на LM317 или же чуть более сложный на ОУ + транзистор (а добавив цап например копеечный mcp4725 можно получить широкий диапазон измерений)
Так было проще, эталонное сопротивление намотоно из манганиновой проволоки (взято из магазина сопротивления КТ 0.02), опорное напряжение и падение напряжения на измеряемом сопротивлении измеряется одним АЦП.
Спасибо, что поделились.
Такой работать будет? Если да, то какая библиотека?
Какой скетч окончательный?
Библиотека — 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);
}
Вы немного не поняли, у меня модуль как на фото (1115/1015), у вас используется по конструкции другой. Мой будет работать в вашей схеме или нет?
Про один и тот же модуль Гугл пишет:
4канала-12 бит, в другом случае- 4канала-16 бит????
Должен, конструкция модуля другая, но чип то один и тот же
В скетче для теста ADS1115 подключается библиотека -- #include <Adafruit_ADS1015.h>, почему 1015
скачиваю https://github.com/addicore/ADS1115/archive/master.zip
меняю название , что-то упустил,не могу понять почему при проверке не находит библиотеку
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
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
Я Вам не ту ссылку на библиотеку дал - http://rcl-radio.ru/wp-content/uploads/ … master.zip
Я Вам не ту ссылку на библиотеку дал - http://rcl-radio.ru/wp-content/uploads/ … master.zip
все ок!
Данный контент доступен только зарегистрированным пользователям.
как стоят фьюзы?
Какие фьюзы выставлять я не знаю, да и зачем, есть же исходник в скетче.
Прогнал магазин на МС-6:
Показания устройства: те же сопротив ления с магазина с мегазина.
200 Ом - 189.74
100 Ом - 99.58
10 Ом - 10.060 ом
1 Ом - 1.144 ом
0.1 Ом - 260.5 мОм
0.01 Ом - 170.1 мОм
100 Ом
0.1 Ом
0.01 Ом
Данный контент доступен только зарегистрированным пользователям.
Запустил на МЕГЕ 8, заработало срезу. Фигня! Или что-то не так делаю?
-Показания на ЛСД появляются через 25 сек. после включения питания.
-Через 5с. обновляются показания. Пока установится, очень долго ждать!
-Вы писали:...На фото я заметил что у Вас в качестве эталонного резистора стоит МЛТ-1!
Его надо менять на манганин.
Почему? У меня МЛТ подобрано - 100,5 Ом Замерял МС-6
-От чего зависит точность и линейность показаний. Только от 100 Ом?
Используйте 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);
}
Мегу8 через Ардуино IDE? Как? У меня вот:
Добавить Мега8, указать программатор, какой? (USBASP оставить?)
forum.rcl-radio.ru → Законченные проекты → Миллиомметр 0 — 20 Ом (Arduino)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|