logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ADS1115 czyli przetwornik ADC 16-bit 4 kanały - Arduino, protokół komunikacji, wizualizacja

p.kaczmarek2 22 Gru 2024 12:45 2805 5

TL;DR LABEL_AI_GENERATED

  • ADS1115 to 16-bitowy, 4-kanałowy przetwornik ADC I2C z trybem różnicowym i programowalnym wzmocnieniem, pozwalający mierzyć małe zmiany napięcia.
  • Gotowy moduł wymaga tylko zasilania, masy, SDA i SCL, bo ma już rezystory podciągające; na Arduino UNO linie I2C to A4 i A5.
  • Przy jednej magistrali I2C można podłączyć 4 moduły ADS1115 i uzyskać 16 kanałów, a pin ADR daje 4 adresy przez GND, VCC, SDA lub SCL.
  • Odczyt składa się z zapisu do rejestru Config i późniejszego odczytu z Conversion; test z potencjometrem oraz Sigrok pokazał poprawną komunikację po około 8 ms konwersji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
Słuchaj:
  • Moduł ADS1115 podłączony do płytki Arduino za pomocą kolorowych przewodów.
    Przedstawię tutaj ADS1115 czyli 4-kanałowy, 16-bitowy przetwornik ADC. ADS1115 dostępny jest do kupienia w naszym kraju za kilkanaście złotych, a zza granicy można go sprowadzić nawet o połowę taniej. ADS1115 korzysta z protokołu I2C, więc można na jedną magistralę podłączyć aż 4 osobne takie moduły, uzyskując w ten sposób 16 kanałów ADC. ADS1115 oferuje również tryb pracy różnicowy oraz programowalną wartość wzmocnienia, co pozwala na pomiar małych zmian napięcia.
    Moduł ADS1115 z wyprowadzeniami i układem scalonym.
    Schemat popularnego w sprzedaży modułu ADS1115 umieszczam poniżej:
    Schemat elektryczny modułu ADS1115 z widocznymi połączeniami i listą pinów.

    Jak podłączyć ADS1115?
    Podłączenie gotowego modułu jest naprawdę bardzo proste, gdyż wszystko co potrzebne jest już obecne na płytce. Magistrala I2C wymaga użycia rezystorów podciągających linie SDA i SCL do zasilania, ale gotowy moduł ma te rezystory już obecne na pokładzie. Z tego powodu podłączenie całości sprowadza się do użycia czterech kabelków, zasilanie (2.0V do 5.5 V), masa, SDA i SCL.

    W przypadku użycia sprzętowego I2C należy sprawdzić które z pinów na naszej płytce z MCU mają tę rolę. Arduino UNO SDA ma na A4, a SCL to A5.

    Jeśli planujemy tworzenie własnej płytki, to możemy bazować na schemacie z noty katalogowej:
    Schemat połączeń dla ADS1115 z użyciem protokołu I2C
    Tak wygląda podłączenie kilku ADS1115 na jednej magistrali:
    Schemat podłączenia czterech modułów ADS1115 do magistrali I2C.

    Przy podłączeniu wejść należy też zadbać o to, by napięcie na nich nie przekroczyło napięcia zasilania całego modułu. Określa to nota katalogowa, sekcja "Absolute Maximum Ratings":
    Tabela dotycząca maksymalnych parametrów ADS1115
    Dostępny w sprzedaży moduł ADS1115 nie ma na płytce dodatkowych zabezpieczeń.

    Jak przetestować ADS1115?
    ADS1115 to ADC, czyli zamienia sygnał analogowy na cyfrowy. Upraszczając, wykonuje on pomiar napięcia. W takim razie starczy nam jeden potencjometr. Jego skrajne nóżki podłączamy na zasilanie (5V bądź 3.3V), i na masę, a środkowy odczep do jednego z wejść ADS1115. Tak podłączony potencjometr stanowi dzielnik napięcia i te właśnie napięcie możemy z ADS odczytać.

    Jak wybrać adres ADS1115?
    Zdawać by się mogło, że jeden pin ADR to dwie opcje adresu - bo można go podłączyć do stanu wysokiego lub niskiego - ale nie:
    Schemat układu ADS1115 z pinami
    Mamy tu 4 opcje - bo można ADR podłączyć jeszcze do SCL lub SDA:
    Tabela wyboru adresu I2C dla ADS111x.

    Protokół komunikacji ADS1115
    Uruchomienie ADS1115 pod kątem protokołu komunikacji najlepiej opisuje sekcja "Quick-Start Guide" z noty katalogowej:
    Schemat konfiguracji sprzętowej ADS111x
    Osobiście bym tu dodał, że najpierw warto puścić jakiś skan I2C, chociażby bazujący na przykładowym kodzie z Arduino, by móc się upewnić, że wszystko dobrze podłączyliśmy.
    Odczyt z ADS1115 wykonujemy w dwóch etapach:
    - wysyłamy bajty do rejestru Config, określają one tryb pracy oraz kanał z którego odczytujemy (pkt 1 na zrzucie ekranu)
    - po chwili rozpoczynamy odczyt rezultatu z rejestru Conversion (pkt 2 i 3)
    Config Register
    Po szczegółowy opis bitów rejestru konfiguracyjnego odsyłam do noty katalogowej.

    Jak uruchomić ADS1115 z Arduino?
    Można użyć gotowej biblioteki (do dodania przez Libraries):
    https://docs.arduino.cc/libraries/ads1115_we/
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Można również wykonać prosty odczyt samodzielnie. Wystarczy biblioteka Wire:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Najpierw wykonywany jest etap 1 z dokumentacji, czyli funkcja writeConfig. Określa ona tryb pracy oraz kanał do odczytu. Potem wykonywane są kroki 2 i 3, czyli odczyt dwóch bajtów z CONVERSION_REGISTER.
    Rezultat:
    Serial Monitor z odczytami ADC dla kanałów AIN0, AIN1, AIN2, AIN3.

    Wizualizacja komunikacji z ADS1115
    Komunikację można podejrzeć analizatorem Sigrok:
    Zrzut ekranu z oprogramowania PulseView pokazujący komunikację I2C z modułem ADS1115 oraz podgląd kodu w Arduino IDE.
    Przedstawiałem go w temacie:
    Analizator stanów logicznych Salae 24MHz za 40 zł - analiza nieznanego protokołu wyświetlacza LED
    Pomiędzy etapami jest odstęp 8ms aby moduł mógł dokonać konwersji:
    Zrzut ekranu przedstawiający przechwyconą transmisję I2C z wykorzystaniem ADS1115 w PulseView.
    Pierwszy etap to jest wysłanie danych do rejestru konfiguracyjnego o adresie 0x01, w tym przypadku wysyłane do niego jest 0xC183. Wszystko zawarte w jednej transakcji, poprzedzone warunkiem I2C start a zakończone stopem:
    Analiza transmisji danych I2C z ADS1115 na wykresie logicznym.
    Drugi etap to odczyt. Tutaj osobno po starcie wysyłamy adres rejestru do odczytu (jest to zapis, więc adres urządzenia 0x48 jest z bitem Write - 0), a potem osobno (po stopie i starcie) wysyłamy adres urządzenia 0x48 z bitem Read - 1 i odczytujemy dwa bajty. Po pierwszym odczytanym bajcie jest ACK, gdyż chcemy czytać dalej, po drugim jest już NACK:
    Zrzut ekranu przedstawiający sygnały I2C z magistrali komunikacyjnej dla modułu ADS1115.

    Uruchomienie z BK7231
    ADS1115 uruchomiliśmy też z BK7231, dzięki czemu można też łatwo raportować jego pomiary do Home Assistant, ale szczegóły umieszczę w osobnym temacie.
    Moduł ADS1115 podłączony do różnych płytek, w tym Arduino.

    Podsumowanie
    To była krótka prezentacja modułu ADS1115. Uruchomienie tego modułu jest bezproblemowe, do Arduino mamy gotowe biblioteki, a jeśli chcemy samodzielnie implementować jego komunikację to i tak nie ma dużo roboty - zasadniczo jeden "write" i jeden "read" z danego adresu. To nie jest BME280 czy tam BMP280, gdzie niezbyt bym się garnął do samodzielnego tworzenia sterownika.
    ADS1115 potrafi nieco więcej niż pokazałem, więc możliwe, że spróbuję osobno zrealizować na nim jakiś projekt, może jakiś pomiar napięcia czy tam prądu (na boczniku), może też osobno uruchomię ten pin ALERT i zrobię odczyt, który nie jest blokujący (bez tego delay w moim przykładowym kodzie). To wszystko już będzie w kolejnym temacie.
    Załączam powiązane materiały, nota katalogowa na której bazowałem, tam też są szczegóły konfiguracji PGA itd (jeśli chcemy to implementować samodzielnie), oraz przechwycona komunikacja z ADS1115 w formacie dla PulseView:
    ads111..pdf (1.78 MB)Musisz być zalogowany, aby pobrać ten załącznik.
    ads1115 te...ino.sr.zip (5.16 kB)Musisz być zalogowany, aby pobrać ten załącznik.
    Czy korzystaliście już z ADS1115 w swoich projektach, a jeśli tak to do czego?

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14770 postów o ocenie 12912, pomógł 659 razy. Jest z nami od 2014 roku.
  • REKLAMA
  • #2 21358966
    RomanWorkshop
    Poziom 14  
    Posty: 221
    Pomógł: 2
    Ocena: 423
    Pierwszy i jak na razie ostatni raz wykorzystałem moduł z tym przetwornikiem w Rejestratorze rozładowywania (Arduino Nano) i działa całkiem dobrze. Trzeba uważać na podróbki. Niektóre moduły oznaczone jako "ADS1115" w rzeczywistości mogą zawierać przetwornik ADS1015 (12-bit), a moduły oznaczone "ADS1015" mogą mieć przetwornik ADS1115 (16-bit). Teoretycznie oba układy można rozróżnić po oznaczeniu nadrukowanym na ich obudowie: "BRPI" = ADS1015, "BOGI" = ADS1115. Niestety zdarzają się przypadki fałszowania/przemalowywania tych oznaczeń. W takiej sytuacji jedynym pewnym sposobem na sprawdzenie modelu przetwornika jest uruchomienie odpowiedniego szkicu testującego (do pobrania z podlinkowanej strony). Określa on model przetwornika na podstawie: wartości 4 najmłodszych bitów w wynikach 10 konwersji (dla ADS1015 zawsze mają wartość 0) oraz czasu wykonania 10 konwersji (dla ADS1015 zawsze jest krótszy).

    Oryginalny szkic testujący (ADS1115_WE/examples/Who_Am_I): Link
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #3 21360272
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Niestety ADS1115 ma problem z pinem ALERT/RDY. Potrafi "się zawiesić" i nie wystawić końca konwersji, możemy wtedy czekać na niego w nieskończoność. Trzeba wówczas "ręcznie" zapytać o dane i na nowo włączyć ciągłą konwersję.
  • REKLAMA
  • #4 21531088
    Jacek Rutkowski
    Poziom 28  
    Posty: 1330
    Pomógł: 69
    Ocena: 275
    markosik20 napisał:
    Niestety ADS1115 ma problem z pinem ALERT/RDY. Potrafi "się zawiesić" i nie wystawić końca konwersji, możemy wtedy czekać na niego w nieskończoność. Trzeba wówczas "ręcznie" zapytać o dane i na nowo włączyć ciągłą konwersję.

    Witam,
    jeśli chcę ciągle odczytywać stan wszystkich 4 kanałów(po kolei oczywiście) to mam ustawiać ciągłą konwersję czy pojedynczą za każdym razem?
    Gdy odczytuję jeden kanał cały czas odczyty są ok ale jak wszystkie po kolei z ciągłą konwersja to głupoty mi pokazuje.
    Czy 1 odczyt po zmianie kanału jest już pewny? Czy trzeba odczekać większy czas niż konwersja?
  • REKLAMA
  • #5 21532263
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Jacek Rutkowski napisał:

    jeśli chcę ciągle odczytywać stan wszystkich 4 kanałów(po kolei oczywiście) to mam ustawiać ciągłą konwersję czy pojedynczą za każdym razem?
    Gdy odczytuję jeden kanał cały czas odczyty są ok ale jak wszystkie po kolei z ciągłą konwersja to głupoty mi pokazuje.


    Ten ADC ma jeden blok PGA . Trzeba w rejestrze MUX zmienić wejście więc odpada ciągła konwersja.
  • #6 21535117
    Jacek Rutkowski
    Poziom 28  
    Posty: 1330
    Pomógł: 69
    Ocena: 275
    markosik20 napisał:
    Jacek Rutkowski napisał:

    jeśli chcę ciągle odczytywać stan wszystkich 4 kanałów(po kolei oczywiście) to mam ustawiać ciągłą konwersję czy pojedynczą za każdym razem?
    Gdy odczytuję jeden kanał cały czas odczyty są ok ale jak wszystkie po kolei z ciągłą konwersja to głupoty mi pokazuje.


    Ten ADC ma jeden blok PGA . Trzeba w rejestrze MUX zmienić wejście więc odpada ciągła konwersja.

    To rozumiem ale po zmianie w rejestrze ADC jak wyzwalam pojedynczy pomiar bzdury dostaję. Jak tylko 1 kanał używałem było ok. Nie wiem czy mam jakieś wybrakowane bo z ali brałem te ADC czy one się zwieszają i trzeba je restartować jakoś?

    [edit] operatorka jak 150 ;( zamiast zmieniać bity MUX[2:0] zmieniałem DR[2:0] i dlatego bzdury mi wychodziły.
Słuchaj:
REKLAMA