MCP3424, jak czytać kanały równolegle?

9

O tym pytaniu

Nie mam doświadczenia w inżynierii elektronicznej i jest to jedno z moich pierwszych wyzwań związanych z komunikacją przez I2C i pisaniem do rejestru, więc proszę nie zakładać zbyt dużej wiedzy z mojej strony. Programuję Arduino.

Pytając o konkretny komponent / układ elektroniczny, zakładam, że ludzie nie mogą eksperymentować / testować, aby dać mi prawidłową odpowiedź. Spodziewam się również, że ludzie nie będą nawet znać tego komponentu. Dlatego postaram się dodać wiele informacji w tym pytaniu.

Daj mi znać, jeśli potrzebujesz więcej informacji.

Komponent ma cztery ADC

Używam 4-kanałowego komponentu, MCP3424 ( arkusz danych ). Występuje w dwóch paczkach. Używam MCP3424 E / SL, 4-kanałowej wersji SOIC, a nie MCP3422 lub MCP3423 w wersji 2-kanałowej.

Wierzę, że ma cztery ADC. W RS-Online wydaje się, że wersja E / SL ma 4 ADC ( bezpośredni link ), podczas gdy E / ST ma tylko jeden ( bezpośredni link ). wprowadź opis zdjęcia tutaj

Zakładam, że musi to oznaczać, że może wykonywać próbkowanie na kilku kanałach jednocześnie. Nie widzę żadnego innego powodu, aby umieścić więcej niż jeden ADC na komponencie.

Czy mam rację?

Komunikacja przez I2C

Komunikacja odbywa się poprzez wysłanie jednego bajtu konfiguracji, a następnie oczekiwanie na zakończenie próbkowania i odczytanie wyniku.

Format bajtu konfiguracji

wprowadź opis zdjęcia tutaj

Te interesujące to:

  • bit 3 od lewej, licząc od 1: Ciągłe próbkowanie
  • bit pierwszy i drugi od lewej, licząc od 1: Adres

Więcej informacji o bajcie konfiguracji można znaleźć na arkuszu danych na stronie 18, również tutaj zilustrowanym .

Format wyniku odczytu

Moje przykłady będą miały rozdzielczość 18 bitów (bit 5 i 6 ustawiony na 1). Wynik odczytu będzie wynosił cztery bajty: pierwsze trzy zawierają wartość, a czwarty zawiera bajt konfiguracji.

Jednak skrajnie lewy bit! RDY mówi, czy wartość jest „nowa”, tj. Czy jest to nowy odczyt, od ostatniego odczytu. Przy pierwszym czytaniu jednego wyniku wartość wynosi 0, a dla kolejnych wynosi 1, dopóki ADC nie będzie gotowy z nową wartością próbki.

Jak go używać bez równoległego pobierania próbek

Wiem doskonale, jak to zrobić. I wszystkie przykłady, które znalazłem w Internecie, również proste z tego. Wystarczy napisać bajt konfiguracji do komponentu, a następnie odczytać wartość z powrotem.

Jak ustawić, aby każdy kanał automatycznie pobierał próbki w sposób ciągły i odczytywał kanały równolegle

Pseudo kod może być podobny do czegoś

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

Moja najlepsza próba

Mam więc nadzieję, że poniższe ustawienia ustawiają każdy ADC na ciągłe próbkowanie. To jest kod Arduino.

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

Jak zatem odczytać określony kanał. Jeśli poproszę tylko komponent o wynik, zwróci wynik kanału w rejestrze. Przy powyższej konfiguracji otrzymam odczyt dla kanału 4. Powiedzmy, że chcę odczyt z kanału 2. W jakiś sposób muszę tylko powiedzieć, że chcę wynik kanału 2. Nie chcę poproś go, aby cokolwiek spróbował, powinien po prostu ciągle próbować, a ja chcę tylko najbardziej niechętnie próbkę, którą utworzył podczas automatycznego próbkowania.

Poniżej moje najlepsze przypuszczenie

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

Tak więc przypuszczam, że tak. Jeśli chcę odczytać kanał 2, piszę bajt konfiguracyjny, który jest dokładnie taki sam, jak ten, którego użyłem do rozpoczęcia próbkowania kanału 2.

To jednak nie działa. Próbka nie jest gotowa, nawet jeśli miała więcej niż konieczne 375 ms.

Jak to osiągnąć?

Starałem się jak najlepiej opisywać pożądany rezultat i to, co próbowałem, ale wiem, że nie jest łatwo go przeczytać.

Czy możesz mi doradzić, w jaki sposób pozwolić wszystkim ADC pobierać próbki równolegle, a następnie czytać z nich bez ingerencji?

Mads Skjern
źródło
Dobry początek. Brakuje tylko linku do arkusza danych dla MCP3424, który dodałem.
JRE
MCP3424 jest dostępny w dwóch pakietach, a nie wersjach, i oba są 4 kanałami. ST to TSSOP, SL to Soic. Istnieje 2-kanałowy MCP3422, stały adres, MCP3423, 2-kanałowy, regulowany adres i 4-kanałowy MCP3424.
Passerby
+1 Bardzo dokładne, dobrze napisane pytanie. Niestety ten układ jest pojedynczym ADC. Ilustruje to arkusz danych na „Schemacie bloków funkcjonalnych”. Czytałeś kanały wejściowe jako ADC. Posiadanie wielu kanałów wejściowych pozwala na użycie jednego ADC do próbkowania wielu różnych sygnałów (sekwencyjnie). Przetwarzanie ADC jest znacznie droższe niż multiplekser analogowy (który wybiera kanał), a próbkowanie wielu sygnałów jest powszechnym wymogiem. Dlatego układy ADC często działają w ten sposób. Andy aka odpowiedział na twoje pytanie, ale może poczekaj, zanim zaakceptujesz, ponieważ możesz uzyskać więcej informacji.
żaglowiec
Wierzyłem, że ma 4 ADC, ponieważ RS-Online powiedział, że E / SL miał 4, a E / ST miał 1. Dodałem do opisu
Mads Skjern
2
@MadsSkjern ignoruje RS, Microchip, a ich karta danych jest królem. To błąd w RS. Błędy w witrynach dystrybutorów są dość powszechne.
Passerby

Odpowiedzi:

11

Mam ten ostatni z czterema ADC. Zakładam, że musi to oznaczać, że może wykonywać próbkowanie na kilku kanałach jednocześnie.

Niestety nie. Jest tylko jeden ADC i, aby przekonwertować więcej niż jeden kanał, należy to zrobić sekwencyjnie poprzez zaadresowanie wewnętrznego multipleksera, a tym samym „odczytanie” innego kanału. Niestety nie ma równoczesnego próbkowania:

wprowadź opis zdjęcia tutaj

Uwaga: multiplekser wejściowy wybiera jednocześnie TYLKO jeden z czterech kanałów. Jest to dość powszechna metoda używana do odczytu wielu kanałów, ale istnieją równoczesne próbkowanie przetworników ADC. Spróbuj spojrzeć na portfolio Linear tech, TI lub ADI.

Andy aka
źródło
+1, pokonałeś mnie :-) Może warto podkreślić fakt, że jest to dość powszechne w przypadku jednej próbki ADC wielu kanałów, ponieważ może próbkować różne sygnały analogowe, co jest częstym przypadkiem.
żaglowiec
Ponadto, jeśli wymagane są niskie częstotliwości próbkowania, multipleksowanie / przeplatanie jest często wystarczające
Scott Seidman
Ulepszanie ulepszeń, proszę pana.
żaglowiec
@ Bulmer, jesteś zbyt miły panie !!
Andy alias
5

MCP3424 jest jednym z ADC multipleksera na przednim końcu.

Schemat z arkusza danych pokazuje to dość wyraźnie

Architektura MCP3424

Arkusz danych stanowi kopię zapasową tego wprowadzenia:

4.1 Informacje ogólne

Urządzenia MCP3422 / 3/4 to różnicowe, wielokanałowe, 18-bitowe konwertery A / D Delta-Sigma o niskiej mocy z interfejsem szeregowym I2C. Urządzenia zawierają multiplekser wyboru kanału wejściowego (multiplekser), programowalny wzmacniacz wzmocnienia (PGA), napięcie odniesienia na płycie (2,048 V) i wewnętrzny oscylator.

Dlatego nie można konwertować różnych kanałów naprawdę jednocześnie, ale można próbkować kanały sekwencyjnie ze stosunkowo krótkim opóźnieniem między nimi.

Podczas korzystania z urządzenia należy upewnić się, że bity adresu I2C są stabilne; jeszcze raz z arkusza danych:

MCP3423 i MCP3424 mają dwa piny adresu urządzenia zewnętrznego (Adr1, Adr0). Te piny mogą być ustawione na wysoki poziom logiczny (lub przywiązany do VDD), niski (lub przywiązany do VSS) lub pozostawiony jako swobodny (niepodłączony do niczego lub związany z VDD / 2), Te kombinacje poziomu logicznego za pomocą dwóch styków zezwól na osiem możliwych adresów. Tabela 5-3 pokazuje adres urządzenia w zależności od stanu logicznego pinów wyboru adresu. Urządzenie próbkuje status logiczny pinów Adr0 i Adr1 w następujących zdarzeniach:

za. Uruchomienie urządzenia.

b. Ogólne resetowanie połączeń

(Patrz rozdział 5.4 „Połączenia ogólne”).

do. Zatrzask połączenia ogólnego

(Patrz rozdział 5.4 „Połączenia ogólne”).

Urządzenie próbkuje stan logiczny (piny adresu) podczas powyższych zdarzeń i przechwytuje wartości, aż do wystąpienia nowego zdarzenia zatrzaśnięcia. Podczas normalnej pracy (po zatrzaśnięciu styków adresowych) styki adresowe są wewnętrznie odłączane od reszty obwodu wewnętrznego.

Zaleca się wydanie polecenia ogólnego resetowania połączenia lub ogólnej blokady zatrzasku raz po włączeniu zasilania urządzenia. Zapewni to, że urządzenie odczytuje styki adresowe w stabilnym stanie i uniknie zatrzaskiwania bitów adresu podczas zwiększania napięcia zasilającego. Może to powodować niedokładne wykrywanie pinów adresu.

Sugeruję przestrzeganie tego zalecenia, aby upewnić się, że naprawdę komunikujesz się z urządzeniem.

Aby odczytać konkretny kanał, musisz wybrać kanał w rejestrze konfiguracji i rozpocząć konwersję. Bit RDY obniży się, gdy wynik tej konwersji będzie dostępny w rejestrze wyjściowym.

Peter Smith
źródło