4 x ads1115 na jedné I2C

Odpovědět
Rodrigo
Příspěvky: 5
Registrován: 27 úno 2021, 12:53
Reputation: 0

4 x ads1115 na jedné I2C

Příspěvek od Rodrigo » 03 bře 2021, 10:23

Prosím o radu. Používám 4 kusy AD převodníků ADS1115 připojené přes
I2C k Arduinu. Adresované jsou dle manuálu jako 0x48, 0x49, 0x4A,0x4B
připojením pinu ADDR postupně k GND, Ucc, SDA a SCL.
Vyzkoušel jsem 11 ks převodníku ADS1115 - na adresách 0x48, 0x49 a
0x4B pracují bezchybně, (ADDR připojen postupně na GND, Ucc, SDA a SCL),
ale na třetí adrese 0x4A (PROPOJEN s SDA) se žádný z nich nehlásí,
zato je přihlášen na 0x4B a ovlivňuje výsledky svého čtvrtého kolegy.
Zkusil jsem zapojení na nepájivém kontaktním poli i na dvou typech DPS,
abych vyloučil omyl v zapojení. Zapojení používám naprosto jednoduché jen
propojení k I2C sběrnici a vstupní napětí přivedené na vstupy je z
odporového děliče z Ucc = 3,3V. Můj závěr - chyba je v adresaci uvnitř
vlastního převodníku ADS1115.

Nevíte o někom, kdo se pokusil o připojení čtyřech ADS1115 na jednu I2C
a může mi potvrdit můj závěr, případně poradit, kde dělám chybu?

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: 4 x ads1115 na jedné I2C

Příspěvek od jankop » 03 bře 2021, 10:55

Dovolím si citaci z datasheetu:
The ADS111x have one address pin, ADDR, that configures the I
2C address of the device. This pin can be
connected to GND, VDD, SDA, or SCL, allowing for four different addresses to be selected with one pin, as
shown in Table 4. The state of address pin ADDR is sampled continuously. Use the GND, VDD and SCL
addresses first. If SDA is used as the device address, hold the SDA line low for at least 100 ns after the SCL line
goes low to make sure the device decodes the address correctly during I
2C communication.
Nezkoušel jsem to, ale hledal bych řešení a knihovny tady:
https://cdn-learn.adafruit.com/download ... akouts.pdf
Myslím, že pro 0x4A adresu musí být obsluha v knihovně.

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: 4 x ads1115 na jedné I2C

Příspěvek od ohruska » 03 bře 2021, 13:50

Co tak dát sem tvůj kód.
Asi by to mělo být tak nějak:

Kód: Vybrat vše

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads1115_0;       // Construct an ads1115 at the default address: 0x48
Adafruit_ADS1115 ads1115_1(0x49); // construct an ads1115 at address 0x49
Adafruit_ADS1115 ads1115_2(0x4A); // construct an ads1115 at address 0x4A
Adafruit_ADS1115 ads1115_3(0x4B); // construct an ads1115 at address 0x4B

void setup(void)
{
ads1115_0.begin(); // Initialize ads1115 address 0x48
ads1115_1.begin(); // Initialize ads1115 address 0x49
ads1115_2.begin(); // Initialize ads1115 address 0x4A
ads1115_3.begin(); // Initialize ads1115 address 0x4B
}

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: 4 x ads1115 na jedné I2C

Příspěvek od RomanB » 03 bře 2021, 16:39

Každý převodník má na pinech SDA a SCL pullup resistory 10kohm. Při zapojení 4 ks je výsledná hodnota celkově 2.5kohm a to je už nízká hodnota. Je možné, že I2C začíná mít problém při adresaci. Odpájej na tom jednom opatrně tyto rezistory.

Rodrigo
Příspěvky: 5
Registrován: 27 úno 2021, 12:53
Reputation: 0

Re: 4 x ads1115 na jedné I2C

Příspěvek od Rodrigo » 03 bře 2021, 19:54

Děkuji za upozornění na manuál, nevzal jsem to v potaz.
tady je jedna z variant kódu:

#include <Wire.h> //prvních šestnáct teplot přes ADS1115
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 kotel(0x48);
Adafruit_ADS1115 kuchyn(0x49);
Adafruit_ADS1115 obyv(0x4A);
Adafruit_ADS1115 koup(0x4B);

Adafruit_ADS1115 ads; /* 1AU4629 Use this for the 16-bit version */
//Adafruit_ADS1015 ads; /* Use this for the 12-bit version */
byte teplota[32];
int ccc, xxx,zz;
int16_t adc0, tepOK , adc1, adc2, adc3, Uo;
//const double napeti33=3300000; //mV
float tepC;
float logRt,Rt,T; // 10k termistor na zem,10k odpor na+3.3V
const float Rezistor[32]={ // PEVNY ODPOR pripojeny na 3,3V z Arduina DUE
12032.0, 12032.0,12032.0,12032.0, 10090.0, 10120.0, 10090.0, 10100.0,
10100.0, 10100.0,10100.0,10100.0, 10100.0, 10090.0, 10090.0, 10080.0,
9000.0, 9000.0, 9000.0, 9000.0, 9000.0, 9000.0, 12110.0, 12040.0,
12060.0, 12060.0, 12080.0, 12060.0, 12060.0, 12060.0, 12080.0, 12060.0};

const int Rref[32]={ //REFERENČNÍ ODPOR TERMISTORU
11400, 9600, 11400, 10800, 10000, 10000, 11900, 12300,
10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000,
10000, 10000, 10000, 10000, 25720, 26070, 10000, 10000,
12110, 12040, 12060, 12060, 12080, 13060, 12060, 12060,}; //24-30
// pri teplote uvedene zde:
const int refTep[32]={ //cervena zelena zluta deska MAC024
22, 19, 21, 22, 20, 20, 21, 20,
22, 22, 22, 22, 21, 25, 17, 22,
21, 25, 23, 20, 21, 25, 21, 25,
22, 22, 22, 22, 22, 22, 22, 22}, beta=3977; // Beta faktor

void setup(void)
{
Serial.begin(9600);
Serial.println("\n\n NOV meri napeti Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
kotel.begin();
kuchyn.begin();
obyv.begin();
koup.begin();
}

void loop(void) {
//mereni teploty ADS1115
Uo =0.1875*koup.readADC_SingleEnded(3); Uo=3300;
Serial.print(" Uo="); Serial.print(Uo); Serial.print("mV ");
ccc=xxx+zz;
for (xxx=0; xxx<4; xxx++ ){ // ctyri ads1115
for (zz=0; zz<4; zz++ ){ // ctyri vstupy A0-A3
ccc=xxx+zz;
if (xxx==0) tepOK=0.1875*kotel.readADC_SingleEnded(zz); //Serial.print(tepOK);Serial.print("mV");
if (xxx==1) tepOK=0.1875*kuchyn.readADC_SingleEnded(zz);
if (xxx==2) tepOK=0.1875*obyv.readADC_SingleEnded(zz);
if (xxx==3) tepOK=0.1875*koup.readADC_SingleEnded(zz);
// tepOK=min(2300,tepOK);
// SpoctiTeplotu (tepOK,Rezistor[ccc] ,Rref[ccc],refTep[ccc],ccc);
//teplota[ccc]=max (2*tepC+40.59,0); //xxx=3;zz=3;Serial.print(xxx*4+zz);Serial.print("=");
Serial.print(tepOK);Serial.print(" "); //Serial.print(teplota[ccc]);Serial.print(" ");
}//zz
Serial.print(" "); }//xxx
delay(13000);Serial.println(" ");
//mereni teploty pres DUE
}//loop
// Ro=Rezistor[ccc], RrEF= Rref[ccc] ,tepRrEF=refTep[ccc],ccc)
void SpoctiTeplotu (int16_t napeti,float Ro,int RrEF,int tepRrEF, byte ggg) {
// Serial.print(" nap "); Serial.print(napeti);//Serial.print(" "); Serial.print(RrEF);
// Serial.print(" "); Serial.print(tepRrEF);Serial.print(" "); Serial.print(ggg);
tepC=float(Uo) / float(napeti); //Serial.print(" Uo/U "); Serial.print(tepC);
tepC=tepC - 1; // Serial.print(" minus1 "); Serial.print(tepC);
tepC=Ro/ tepC; //Serial.print(" tepC "); Serial.print(tepC);
tepC=tepC/RrEF; // (R/Ro)
// Serial.print(" Rref "); Serial.print(Rref[ggg]);// Serial.print(" R/Ro "); Serial.print(tepC);
tepC=log(tepC); // Serial.print(" LOG "); Serial.print(tepC*1); // ln(R/Ro)
tepC /= beta; // Serial.print(" C/b "); Serial.print(tepC); // 1/B * ln(R/Ro)
tepC += 1.0 / (tepRrEF+ 273.15); // + (1/To)
tepC=1.0 / tepC; // Prevracena hodnota
tepC -= 273.15; // Prevod z Kelvinu´ na stupne Celsia
//Serial.print(napeti);Serial.print(" ");//Serial.print(teplota[ggg],HEX);Serial.print(" ");
}

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: 4 x ads1115 na jedné I2C

Příspěvek od jankop » 03 bře 2021, 23:36

RomanB píše:
03 bře 2021, 16:39
Každý převodník má na pinech SDA a SCL pullup resistory 10kohm. Při zapojení 4 ks je výsledná hodnota celkově 2.5kohm a to je už nízká hodnota. Je možné, že I2C začíná mít problém při adresaci. Odpájej na tom jednom opatrně tyto rezistory.
A existuje ještě jeden problém. Podle schématu Adafruit je pin ADR připojen ke GND přes rezistor 10k - defaultní adresace 0x48. To je také věc, kterou by nejspíš při větším počtu modulů bylo třeba ošetřit.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: 4 x ads1115 na jedné I2C

Příspěvek od Axamith » 05 bře 2021, 08:02

Rodrigo píše:
03 bře 2021, 19:54
Děkuji za upozornění na manuál, nevzal jsem to v potaz.
tady je jedna z variant kódu:
. . .
Kód se vkládá pomocí ikony </> je přehlednější a ve fóru nezabírá tolik místa.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů