MCP3424, ¿cómo leer canales en paralelo?

9

Sobre esta pregunta

No tengo experiencia en ingeniería electrónica, y este es uno de mis primeros desafíos con la comunicación a través de I2C y con la escritura en un registro, así que no asumas demasiado conocimiento por mi parte. Estoy programando un Arduino.

Al preguntar sobre un componente / chip electrónico específico, asumo que las personas no pueden experimentar / probar para darme una respuesta correcta. También espero que la gente ni siquiera conozca este componente. Por lo tanto, intentaré agregar mucha información en esta pregunta.

Por favor, avíseme si necesita más información.

El componente tiene cuatro ADC

Estoy utilizando el componente de 4 canales, MCP3424 ( hoja de datos ). Viene en dos paquetes. Estoy usando MCP3424 E / SL, versión SOIC de 4 canales, no la versión MCP3422 o MCP3423 de 2 canales.

Creo que tiene cuatro ADCs. En RS-Online, parece que la versión E / SL tiene 4 ADCs ( enlace directo ), mientras que el E / ST tiene solo uno ( enlace directo ).

Supongoqueestodebesignificarquepuedehacermuestreosenvarioscanalessimultáneamente.NoveoningunaotrarazónparaponermásdeunADCenelcomponente.

¿Tengorazón?

ComunicaciónatravésdeI2C

Lacomunicaciónocurrealenviarunbytedeconfiguración,luegoesperaraquefinaliceunmuestreoyleerelresultado.

Formatodelbytedeconfiguración

Losinteresantesson:

  • bittresdesdelaizquierda,contandodesde1:muestreocontinuo
  • bitunoydosdesdelaizquierda,contandodesde1:Dirección

Puedeencontrarmásinformaciónsobreelbytedeconfiguraciónenlahojadedatos,página18,quetambiénsemuestra aquí .

Formato del resultado de lectura

Mis ejemplos solo serán con una resolución de 18 bits (los bits 5 y 6 se establecen en 1). El resultado de la lectura será de cuatro bytes: los tres primeros que contienen el valor y el cuarto que contiene el byte de configuración.

Sin embargo, el bit más a la izquierda,! RDY, indica si el valor es "nuevo", es decir, si es una nueva lectura, desde la última lectura. La primera vez que se lee un resultado, el valor es 0, y para los siguientes es 1, hasta que el ADC esté listo con un nuevo valor de muestra.

Cómo usarlo sin muestreo en paralelo

Sé perfectamente bien cómo hacer esto. Y todos los ejemplos que he encontrado en línea, también son simples du this. Solo escriba un byte de configuración en el componente, luego lea un valor de vuelta.

Cómo configurar cada canal para muestrear automáticamente, y leer los canales en paralelo

El pseudo código podría ser similar a

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

Mi mejor intento

Espero que lo siguiente establezca que cada ADC muestree continuamente. Este es el código Arduino.

void setup() {

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

Entonces, ¿cómo leo un canal específico? Si solo le pido al componente el resultado, devolverá el resultado del canal en el registro. Con la configuración anterior, obtendría la lectura para el canal 4. Pero digamos que quiero la lectura del canal 2. De alguna manera, solo necesito decirle que quiero el resultado del canal 2. No quiero Pídale que muestre algo, debería seguir haciendo un muestreo continuo, y solo quiero la muestra más reenviada que creó al muestrear automáticamente.

A continuación es mi mejor conjetura

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
}

Así que mi mejor conjetura es. Si quiero leer el canal 2, escribo un byte de configuración que es exactamente igual al que usé para iniciar el muestreo del canal 2.

Sin embargo, esto no funciona. No hay ninguna muestra lista, incluso si ha tenido más de los 375 ms necesarios.

¿Cómo logro esto?

He intentado hacer mi mejor esfuerzo al describir el resultado deseado y lo que he intentado, pero sé que no es fácil de leer.

¿Podría darme consejos sobre cómo dejar que todos los ADC muestren en paralelo y luego leerlos sin interferir?

    
pregunta Mads Skjern

2 respuestas

11
  

Tengo este último con cuatro ADCs. Supongo que esto debe significar, que puede   hacer muestreos en varios canales simultáneamente.

Lamentablemente no. Solo hay un ADC y, para convertir más de un canal, esto se debe hacer de forma secuencial dirigiéndose al multiplexor interno, de modo que "lea" otro canal. Desafortunadamente, no hay muestreo simultáneo: -

Tenga en cuenta que el multiplexor de entrada selecciona SOLO uno de los cuatro canales a la vez. Este es un método bastante común para leer múltiples canales, pero hay ADC de muestreo simultáneo. Intente buscar en las carteras de Linear tech, TI o ADI.

    
respondido por el Andy aka
5

El MCP3424 es un solo ADC con un multiplexor en la parte frontal.

Este diagrama de la hoja de datos lo muestra con bastante claridad

Lahojadedatosrespaldaestoconlaintroducción:

4.1Descripcióngeneral

LosdispositivosMCP3422/3/4sonconversoresDelta-SigmaA/Ddiferenciales,multicanal,debajapotencia,conunainterfazserieI2C.Losdispositivoscontienenunmultiplexordeseleccióndecanaldeentrada(mux),unamplificadordegananciaprogramable(PGA),unareferenciadevoltajeabordo(2.048V)yunosciladorinterno.

Porlotanto,nopuedeconvertirdiferentescanalesdemanerasimultánea,peropuedemuestrearloscanalesdeformasecuencialconunretrasorelativamentecortoentreellos.

Alusareldispositivo,debeasegurarsedequelosbitsdedirecciónI2Cseanestables;Unavezmás,apartirdelahojadedatos:

ElMCP3423yelMCP3424tienendospinesdedireccióndedispositivoexterno(Adr1,Adr0).Estospinessepuedenestablecerenunvalorlógicoalto(ovinculadoaVDD),bajo(ovinculadoaVSS),oflotandoalaizquierda(noconectadoanada,ovinculadoaVDD/2),estascombinacionesdenivellógicoutilizandolosdospinespermitenochodireccionesposibles.LaTabla5-3muestraladireccióndeldispositivosegúnelestadológicodelospinesdeseleccióndedirección.EldispositivomuestraelestadológicodelAdr0yAdr1pinesenlossiguienteseventos:

a.Encendidodeldispositivo.

b.Restablecimientogeneraldellamadas

(ConsultelaSección5.4"Llamada general").

c. Cierre general de llamadas

(Consulte la Sección 5.4 "Llamada general").

El dispositivo muestra el estado lógico (pines de dirección) durante los eventos anteriores y bloquea los valores hasta que se produce un nuevo evento de retención. Durante el funcionamiento normal (después de que las patillas de dirección se enclavan), las patillas de dirección se deshabilitan internamente del resto del circuito interno.

Se recomienda emitir un comando de reinicio de llamada general o de bloqueo de llamada general una vez después de que el dispositivo se haya encendido. Esto asegurará que el dispositivo lea los pines de dirección en una condición estable, y evite bloquear los bits de dirección mientras la fuente de alimentación está aumentando. Esto podría causar un pin de dirección inexacto detección.

Le sugeriría que siguiera esta recomendación para asegurarse de que realmente se está comunicando con el dispositivo.

Para leer un canal en particular, debe seleccionar el canal en el registro de Configuración e iniciar una conversión. El bit RDY bajará cuando el resultado de esa conversión esté disponible en el registro de salida.

    
respondido por el Peter Smith

Lea otras preguntas en las etiquetas