MCP3424, come leggere i canali in parallelo?


9

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 ). inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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?


Buon inizio. L'unica cosa che manca è un collegamento al foglio dati per l'MCP3424, che ho aggiunto.
JRE,

MCP3424 è disponibile in due pacchetti, non versioni, ed entrambi sono a 4 canali. ST è TSSOP, SL è Soic. Sono disponibili MCP3422 a 2 canali, indirizzo fisso, MCP3423, 2 canali, indirizzo regolabile e MCP3424 a 4 canali.
Passante dal

+1 Domanda molto approfondita e ben scritta. Purtroppo quel chip è un singolo ADC. Ciò è illustrato nella sua scheda tecnica nel "Diagramma a blocchi funzionale". Hai letto i canali di input come ADC. Avere molti canali di ingresso consente di utilizzare un ADC per campionare molti segnali diversi (in sequenza). L'ADC è molto più costoso da realizzare rispetto a un multiplexer analogico (che seleziona il canale) e il campionamento di più segnali è un requisito comune. Quindi i chip ADC funzionano spesso in questo modo. Andy aka ha risposto alla tua domanda, ma forse aspetta prima di accettare, poiché potresti ottenere maggiori informazioni.
bagliore

Credevo che avesse 4 ADC, perché RS-Online diceva che E / SL ne aveva 4 e E / ST ne aveva 1. Ho aggiunto alla descrizione
Mads Skjern

2
@MadsSkjern ignora RS, Microchip e la loro scheda tecnica è re. Questo è un errore su RS. Gli errori sui siti dei distributori sono piuttosto comuni.
Passante dal

Risposte:


11

Ho quest'ultimo con quattro ADC. Presumo che ciò significhi che può eseguire il campionamento su più canali contemporaneamente.

Sfortunatamente no. Esiste un solo ADC e, per convertire più di un canale, questo deve essere fatto in sequenza indirizzando il multiplexer interno "leggendo" quindi un altro canale. Nessun campionamento simultaneo purtroppo: -

inserisci qui la descrizione dell'immagine

Si noti che il multiplexer di ingresso seleziona SOLO uno dei quattro canali alla volta. Questo è un metodo abbastanza comune usato per leggere più canali ma ci sono ADC di campionamento simultanei là fuori. Prova a guardare i portafogli di tecnologia lineare, TI o ADI.


+1, mi hai battuto :-) Potrebbe valere la pena precisare il fatto che è abbastanza comune per un campione ADC canali multipli, perché può campionare diversi segnali analogici, che è un caso comune.
Bagliore

Inoltre, se sono richieste basse frequenze di campionamento, il multiplexing / interleaving è spesso abbastanza buono
Scott Seidman,

Miglioramenti di spiffering, signore.
bagliore

@gbulmer sei troppo gentile signore !!
Andy alias il

5

L' MCP3424 è un singolo ADC con un multiplexer sul lato frontale.

Questo diagramma dal foglio dati lo mostra abbastanza chiaramente

Architettura MCP3424

Il foglio dati lo supporta con l'introduzione:

4.1 Panoramica generale

I dispositivi MCP3422 / 3/4 sono convertitori multicanale differenziali Delta-Sigma 18 bit a bassa potenza e multicanale con interfaccia seriale I2C. I dispositivi contengono un multiplexer di selezione del canale di ingresso (mux), un amplificatore di guadagno programmabile (PGA), un riferimento di tensione a bordo (2.048 V) e un oscillatore interno.

Pertanto, non è possibile convertire canali diversi contemporaneamente, ma è possibile campionare i canali in sequenza con un ritardo relativamente breve tra di essi.

Quando si utilizza il dispositivo, è necessario assicurarsi che i bit dell'indirizzo I2C siano stabili; ancora una volta, dal foglio dati:

MCP3423 e MCP3424 hanno due pin di indirizzo dispositivo esterno (Adr1, Adr0). Questi pin possono essere impostati su un livello logico alto (o legato a VDD), basso (o legato a VSS) o lasciato flottante (non collegato a nulla o legato a VDD / 2), Queste combinazioni di livello logico utilizzano i due pin consentire otto indirizzi possibili. La Tabella 5-3 mostra l'indirizzo del dispositivo in base allo stato logico dei pin di selezione dell'indirizzo. Il dispositivo campiona lo stato logico dei pin Adr0 e Adr1 nei seguenti eventi:

un. Accensione del dispositivo.

b. Ripristino chiamate generali

(Vedi Sezione 5.4 “Chiamata generale”).

c. Blocco chiamate generale

(Vedi Sezione 5.4 “Chiamata generale”).

Il dispositivo campiona lo stato logico (pin dell'indirizzo) durante gli eventi precedenti e blocca i valori fino a quando si verifica un nuovo evento di latch. Durante il normale funzionamento (dopo che i pin di indirizzo sono bloccati), i pin di indirizzo sono disabilitati internamente dal resto del circuito interno.

Si consiglia di emettere un comando di ripristino delle chiamate generali o di blocco delle chiamate generali dopo l'accensione del dispositivo. Ciò garantirà che il dispositivo legga i pin dell'indirizzo in una condizione stabile ed eviti di bloccare i bit dell'indirizzo mentre l'alimentatore sta aumentando. Ciò potrebbe causare un rilevamento impreciso del pin dell'indirizzo.

Ti suggerirei di seguire questa raccomandazione per assicurarti di comunicare davvero con il dispositivo.

Per leggere un determinato canale, è necessario selezionare il canale nel registro di configurazione e avviare una conversione. Il bit RDY si ridurrà quando il risultato di tale conversione è disponibile nel registro di output.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.