A proposito di questa domanda
Non ho una formazione ingegneristica elettronica, e questa è una delle mie prime sfide con la comunicazione via I2C e con la scrittura in un registro, quindi per favore non assumere troppe conoscenze dalla mia parte. Sto programmando un Arduino.
Quando chiedo informazioni su un componente / chip elettronico specifico, presumo che le persone non possano sperimentare / testare per darmi una risposta corretta. Mi aspetto anche che le persone non conoscano nemmeno questo componente. Quindi proverò ad aggiungere molte informazioni in questa domanda.
Per favore fatemi sapere se avete bisogno di ulteriori informazioni.
Il componente ha quattro ADC
Sto usando il componente a 4 canali, MCP3424 ( scheda tecnica ). Viene in due pacchetti. Sto usando MCP3424 E / SL, versione SOIC a 4 canali, non MCP3422 o MCP3423 versione a 2 canali.
Credo che abbia quattro ADC. Su RS-Online, sembra che la versione E / SL abbia 4 ADC ( collegamento diretto ), mentre E / ST ne ha solo uno ( collegamento diretto ).
Presumo che ciò significhi che può eseguire il campionamento su più canali contemporaneamente. Non vedo altri motivi per inserire più di un ADC nel componente.
Ho ragione?
Comunicazione tramite I2C
La comunicazione avviene inviando un byte di configurazione, quindi attendendo la fine di un campionamento e leggendo il risultato.
Formato del byte di configurazione
Quelli interessanti sono:
- bit tre da sinistra, contando da 1: campionamento continuo
- bit uno e due da sinistra, contando da 1: Indirizzo
Ulteriori informazioni sul byte di configurazione sono disponibili nella scheda tecnica a pagina 18, anch'essa illustrata qui .
Formato del risultato letto
I miei esempi saranno solo con una risoluzione di 18 bit (bit 5 e 6 impostati su 1). Il risultato della lettura sarà di quattro byte: i primi tre contenenti il valore e il quarto contenente il byte di configurazione.
Tuttavia, il bit più a sinistra,! RDY, indica se il valore è "nuovo", ovvero se si tratta di una nuova lettura, dall'ultima lettura. La prima volta che legge un risultato, il valore è 0 e per i successivi è 1, finché ADC non è pronto con un nuovo valore di esempio.
Come usarlo senza campionamento in parallelo
So perfettamente come farlo. E tutti gli esempi che ho trovato online, anche semplici. Basta scrivere un byte di configurazione sul componente, quindi rileggere un valore.
Come impostare ogni canale per campionare automaticamente in modo continuo e leggere i canali in parallelo
Lo pseudo codice potrebbe essere come smth
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
Il mio miglior tentativo
Quindi spero che quanto segue imposti ogni ADC a campionare continuamente. Questo è il codice Arduino.
void setup() {
Wire.write(0b00011100);
Wire.write(0b01011100);
Wire.write(0b10011110);
Wire.write(0b11011101);
}
Quindi, come faccio a leggere un canale specifico. Se chiedo solo il componente per il risultato, verrà restituito il risultato del canale sul registro. Con la configurazione sopra, otterrei la lettura per il canale 4. Ma diciamo che voglio la lettura dal canale 2. In qualche modo ho solo bisogno di dirlo, che voglio il risultato del canale 2. Non voglio chiedigli di campionare qualsiasi cosa, dovrebbe semplicemente continuare a fare un campionamento continuo e voglio solo il campione più risentito che ha creato durante il campionamento automatico.
Di seguito è la mia ipotesi migliore
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
}
Quindi la mia ipotesi migliore è. Se voglio leggere il canale 2, scrivo un byte di configurazione che è esattamente lo stesso, come quello che ho usato per iniziare il campionamento del canale 2.
Tuttavia, questo non funziona. Non esiste un campione pronto, anche se ha avuto più dei 375ms necessari.
Come posso raggiungere questo obiettivo?
Ho cercato di fare del mio meglio descrivendo il risultato desiderato e ciò che ho provato, ma so che non è facile da leggere.
Potresti darmi consigli su come fare in modo che tutti gli ADC eseguano il campionamento in parallelo e quindi leggano da essi, senza interferire?