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 ).
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
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?