Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ADS1115/ arduino leonardo - Podłączenie przetwornika adc1115 do arduino Leonardo

06 Lut 2016 20:13 2028 18
  • PCBway
  • Poziom 22  
    -1 oznacza, że odczytujemy jak rozumiem warosc ponizej zakresu minimalnego (zadeklarowano integer dla adc0)

    Co jest podlaczone do A0? Co wyswietla gdy A) bedzie zwarte do GND?
  • Poziom 8  
    Do pin A0 dałem napięcie 3v z magistrali arduino. -1 oznacza, że układ nie odpowiada, bo na AO ma wartość 3v.

    Dziwne jest to, że układ nie odpowiada na magistrali i2c.

    Sprawdzałem tym:

    http://playground.arduino.cc/Main/I2cScanner

    Nie ma żadnego adresu.

    Piny magistrali i2c podpinałem pod arduino na wejście A5 oraz A4. Zasilanie pobieram z arduino 5v. Robiłem także test na dedykowanych pinach sda/scl w arduino.


    Układ kupiony na allegro ale pochodzi z Chin. Jak można sawdzić czy układ jest martwy?
  • PCBway
  • Poziom 22  
    Mze SDA/SCL wymagają pull-up resistors skoro to nieoryginalny moduł...
  • Poziom 8  
    To pull-up resistors jest w standardzie na tych modułach. Są na module zamontowane rezystory 10k. Zmierzyłem napięcie na dwóch liniach. Wyniki względem masy bardzo proszę około 4,98v.


    ADS1115/ arduino leonardo - Podłączenie przetwornika adc1115 do arduino Leonardo

    ADS1115/ arduino leonardo - Podłączenie przetwornika adc1115 do arduino Leonardo

    Dodano po 20 [minuty]:

    Chyba będę odsyłać ten moduł. Tymczasem zamówiłem inny. Mam nadzieję, że kolejny to nie będzie jakiś klon. Trudno teraz dostać oryginał tego układu.
  • Poziom 22  
    Piny uzywane przez biblioteke wire:

    Board I2C / TWI pins
    Uno, Ethernet A4 (SDA), A5 (SCL)
    Leonardo 2 (SDA), 3 (SCL)

    Wygląda na to, ze na adafruit chyba jest UNO a na zdjeciu widze Leonardo.

    Moze piny 2 i 3 zamiast 4 i 5...
  • Poziom 8  
    Mam obie płytki - Uno i Leonardo - próbowałem na wszystkich konfiguracjach.

    UNO testy na pinach: A4/A5 i te standardowe SDA/SCL
    Leonardo testy na pinach: A4/A5, A2/A3 i te standardowe SDA/SCL

    Chcąc monitorować wszystkie piny zmieniłem kod na taki:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Wynikiem jest:
    AIN0: -1
    AIN1: -1
    AIN2: -1
    AIN3: -1
  • Pomocny post
    Poziom 22  
    Jeszcze miałem nadzieje, ze domyslnie bez konfiguracji uklad pracuje w Continuous Mode ale niestety nie wiec bez wstepnego zaprogramowania nie zobaczymy zmian na ALERT/READY (inna sprawa jak czesto nastepuja i czy sa do uchwycenia na mierniku - na cyfrowym mała szansa bo trzeba zgrac samplowanie miernika z samplowaniem przetwornika).

    Zakładam, ze I2C działa prawidłowo na tych modułach arduino (można dla pewnosci przetestowac z jakims innym urzadzeniem I2C) ale pewnie działa.
  • Poziom 8  
    Poprzedni układ był zepsuty. Zakupiłem inny oryginalny układ i jest ok.
  • Poziom 22  
    Szkoda. Miałem nadzieje, że nie jest uszkodzony i rozwiązanie będzie ciekawsze.
  • Poziom 8  
    Ciekawe są za to wyniki przebiegów :) Dziś już nie bardzo mam głowę, do testów ale wydaje mi się, że ten układ pomimo swojej dokładności jest zbyt wolny do pomiaru przebiegów prądu 50 Hz?


    ADS1115/ arduino leonardo - Podłączenie przetwornika adc1115 do arduino Leonardo
  • Poziom 22  
    Wg:
    http://www.ti.com/product/ADS1115

    powinno sie dać 860SPS (sample per sec). 1.16msec pomiar. Więc powinno wystarczyć dla 50Hz (20ms okres).

    Pewnie trzeba zmienić delay bo 1000ms to za duzo (1000x wiecej niz przetwarzanie).

    Poza tym:

    "
    Serial.print("AIN0: ");
    Serial.print(adc0);
    Serial.print("\tVoltage: ");
    Serial.println(Voltage, 7);
    Serial.println();"
    "
    wysłanie na seriala ok. 40 znaków to jest ok. 400bitów (licząc start i stop). Przy 9600baud daje ok. 4milisec jesli sie nie pomyliłem czyli 4x więcej niż na przetwarzanie A/D.
    Wiec pewni episanie po serialu też trzeba zminimalizować,

    Dodano po 1 [minuty]:

    Nawet chyba 40ms pójdzie na pisanie po serialu.
  • Poziom 8  
    1000ms to chyba akurat jedna sekunda :) Kod, który wygenerował mi wyniki przebiegu jest poniżej.


    Odnośnie seriala to do testów to robię troszkę inaczej. Najpierw zapisuje do tablicy, a dopiero potem drukuje wynik z opóźnieniem.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 5 [minuty]:

    Wydaje mi się też,że nie da rady osiągnąć maksymalnej wydajności tego układu. Nawet odczytując co 2 tysięczne sekundy układ nie odzwierciedla charakterystyki przebiegu. Zrobiłem wczoraj około 10 testów.

    Jutro będę miał model ads1015 w wersji 12 bitów - ciekawi mnie jakie będą wyniki.
  • Poziom 22  
    50Hz daje 20ms, Jesli konwersja trwa ok. 1ms + 2ms przerwy to daje 20/3=6sampli, czy 3 sample na polowke sinusoidy.
    No to moze nie przypominac sinusody. Mozna sprobowac bez delay.

    Nie wczytywalem sie w datasheet ale pewnie nie da sie zmienic modu na 12bit na tym chipie.

    Dodano po 48 [sekundy]:

    Miałem na mysli ADS1115
  • Poziom 8  
    O tym też już myślałem. Użyłem nawet w tym celu konfiguracji na ads1015 i niestety, ale wynik się duplikuje przy szybszym odczycie. Mam po prostu kilka identycznych wartości odczytu.

    Dodano po 2 [minuty]:

    Czyli 12 bit też będzie działać, ale nic to nie przyspiesza.

    Dodano po 1 [godziny] 5 [minuty]:

    Testowałem przed chwilą układ ads1015 (12 bit) mając nadzieję, że ten będzie zdecydowanie szybszy. Nie udaje mi się zarejestrować więcej niż 9 punktów pomiaru na okres danego przebiegu.

    Zmieniłm nawet kod na microsekundy, ale nic z tego.

    Może to wina magistrali i2c?
  • Poziom 22  
    I2c to chyba ok. 100kbp więc to nie to raczej. Nie wiemy jak ta bibliteka diała dokłądnie. Trzea by było przeglądnąc source code co tam ktoś robi. Bo formalnie powinno się chyba wyzwolić przetwarzanie, poten testować jakas flagę czy przetwarzanie się zakończyło i ogłosić wynik. Wtedy szybkośc byłaby zdeterminowana przez czas przetwarzania przetwornika.

    Zajrzalbym do kodu i równoczesnie do datasheet by zobaczyć czy da się cos uspranic.

    Dodano po 3 [minuty]:

    uint16_t config = ADS1015_REG_CONFIG_CQUE_NONE | // Disable the comparator (default val)
    ADS1015_REG_CONFIG_CLAT_NONLAT | // Non-latching (default val)
    ADS1015_REG_CONFIG_CPOL_ACTVLOW | // Alert/Rdy active low (default val)
    ADS1015_REG_CONFIG_CMODE_TRAD | // Traditional comparator (default val)
    ADS1015_REG_CONFIG_DR_1600SPS | // 1600 samples per second (default)
    ADS1015_REG_CONFIG_MODE_SINGLE; // Single-shot mode (default)


    1600 samples per second?

    Dodano po 1 [minuty]:

    /*=========================================================================
    CONVERSION DELAY (in mS)
    -----------------------------------------------------------------------*/
    #define ADS1015_CONVERSIONDELAY (1)
    #define ADS1115_CONVERSIONDELAY (8)
    /*=========================================================================*/

    Dodano po 36 [sekundy]:


    // Wait for the conversion to complete
    delay(m_conversionDelay);

    Dodano po 1 [minuty]:

    Wyglada ze obydwqa chipy sa obslugiwane tak samo w sensie timingu: 8ms czeka na konwersje

    Dodano po 42 [sekundy]:

    Pomyliłem sie - niby 1ms dla tego 12bitowego

    Dodano po 1 [minuty]:

    czyli tak głosno myslac ten 16bitowy powinien dawac ok. 125 probek na sekunde

    Dodano po 1 [minuty]:

    Adafruit_ADS1015::Adafruit_ADS1015(uint8_t i2cAddress)
    {
    m_i2cAddress = i2cAddress;
    m_conversionDelay = ADS1015_CONVERSIONDELAY;
    m_bitShift = 4;
    m_gain = GAIN_TWOTHIRDS; /* +/- 6.144V range (limited to VDD +0.3V max!) */
    }

    /**************************************************************************/
    /*!
    @brief Instantiates a new ADS1115 class w/appropriate properties
    */
    /**************************************************************************/
    Adafruit_ADS1115::Adafruit_ADS1115(uint8_t i2cAddress)
    {
    m_i2cAddress = i2cAddress;
    m_conversionDelay = ADS1115_CONVERSIONDELAY;
    m_bitShift = 0;
    m_gain = GAIN_TWOTHIRDS; /* +/- 6.144V range (limited to VDD +0.3V max!) */
    }

    czyli jesli ten 12 bitowy zostal zainicjowany poprawnie to powinien dawac 1000 probek na sekunde (mnej wiecej)

    Dodano po 1 [minuty]:

    aby wywolac konstruktor do 12bitowca trzeba pewnie: Adafruit_ADS1015 ads(0x48);
  • Poziom 8  
    Działam teraz na układzie ads1015. Zrobiłem zmiany nagłwka sps na 3300 do biblioteki. Nie widzę żadnej różnicy.

    9 pomiarów na okres to max.
  • Poziom 22  
    Teoretycznie powinno byc co 1ms nie liczac czasu na kod. Czyli 20 na 20ms(50Hz).
    I2c gdyby było 100kpbs to bit trwa 0.01ms - nie wiem ile bajtów tam idzie (trzeba zajrzec do data sheet). Gdyby 10 bytes to ok. 100bits + nagówki czyli jaies 1ms.

    Co by sie pewnie bilansowało.

    Moze zle licze ale nie ma w tej chwili czasu by spradzic predkosc I2c i czy da sie zmienic na 400kbps.

    Wydaje mi sie, ze i tak doszlismy do jakis konkluzji to znaczy chyba mamy swiadpomosc tego co sie dzieje...?

    Pewnie bedziemy konczyc temat. Miło sie gawedzilo. I nikt nikogo nie obrazal.
  • Poziom 8  
    I2C to chyba nie jest dobry trop. Zrobiłem troszkę zmian w bibliotece zmieniając kilka rzeczy. Po tych zmianach udaje mi się próbkować troszkę szybiej około 18-20 razy na okres.

    W pliku Adafruit_ADS1015.cpp zmieniłem funkcję delay na delayMicroseconds. Było to organicznie uniemożliwiające częstsze próbkowanie niż 1 ms. Dzięki temu zamiast jednej tysięcznej sekundy można robić pomiary z większą częstotliwością i zyskałem zakres do jednej milionowej części sekundy. Oczywiście ustawienie czujnika na partyzanta i wymuszenie szybszej konwersji go nie przyspieszy ponad fizyczne możliwości, ale przynajmniej jest inna skala.

    Wcześniej pisałem również o zmianie pliku Adafruit_ADS1015.cpp domyślnej wartości próbkowania z ADS1015_REG_CONFIG_DR_1600SPS na ADS1015_REG_CONFIG_DR_3300SPS - niestety to było za mało.




    Kod pliku Adafruit_ADS1015.cpp po zamianach:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    W pliku Adafruit_ADS1015.h zmieniłem #define ADS1015_CONVERSIONDELAY (1)
    Z uwagi na to, że teraz pracujemy na mikrosekundach czyli 1/1000 000 sekundy musiałem zwiększyć tą wartość na 50. (U mnie ta wartość przyjęta jest z tzw partyzanta do testów)

    Czyli gdybyśmy chcieli zachować zgodność z oryginalną wersją nagłówków po zmianie funkcji na mikrosekundy to musimy uwzględnić zmianę skali.

    ADS1015_CONVERSIONDELAY (1) // jedna tysięczna sekundy dla funkcji delay
    ADS1015_CONVERSIONDELAY (1000) // jedna tysięczna sekundy dla funkcji delayMicroseconds

    ADS1015_CONVERSIONDELAY (100) // jedna dziesięciotysięczna sekundy dla funkcji delayMicroseconds

    Kod pliku Adafruit_ADS1015.h po zamianach:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety dalej mam problem z maksymalnym wykorzystaniem próbkowania max to około 800 próbek na sekundę. Wyczytałem jeszcze gdzieś, że szybkość próbkowania na kanał zależy również od ilości wykorzystywanych kanałów w danym czasie. Podobno jeśli są 4 kanały to częstotliowść próbkowania dzieli się również na cztery. Chcę jednak potwierdzić tą informajcę i ustalić czy da się to zmienić - tak aby ustawić tylko jeden kanał. Szuakm więc miejsca gdzie można zmienić ilość wykorzystywanych kanałów.