MCP3424, ¿cómo leer canales en paralelo?

Acerca de 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 asuma demasiados conocimientos de mi parte. Estoy programando un Arduino.

Cuando pregunto 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, hágamelo saber si necesita más información.

El componente tiene cuatro ADC

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

Creo que tiene cuatro ADC. En RS-Online, parece que la versión E/SL tiene 4 ADC ( enlace directo ), mientras que la E/ST solo tiene uno ( enlace directo ).ingrese la descripción de la imagen aquí

Supongo que esto debe significar que puede hacer muestreo en varios canales simultáneamente. No veo ninguna otra razón para poner más de un ADC en el componente.

¿Tengo razón?

Comunicación vía I2C

La comunicación ocurre al enviar un byte de configuración, luego esperar a que finalice un muestreo y leer el resultado.

Formato del byte de configuración

ingrese la descripción de la imagen aquí

Los interesantes son:

  • bit tres desde la izquierda, contando desde 1: Muestreo continuo
  • bit uno y dos desde la izquierda, contando desde 1: Dirección

Puede encontrar más información sobre el byte de configuración en la página 18 de la hoja de datos, que también se muestra aquí .

Formato del resultado de la lectura

Mis ejemplos solo serán con una resolución de 18 bits (bit 5 y 6 configurados en 1). El resultado de la lectura será de cuatro bytes: los primeros tres contienen el valor y el cuarto 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 lectura nueva, desde la última lectura. La primera vez que 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. Simplemente escriba un byte de configuración en el componente y luego lea un valor.

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

El pseudocódigo podría ser algo así como

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

Así que espero que lo siguiente configure cada ADC para muestrear continuamente. Este es el código de 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 el resultado al componente, devolverá el resultado del canal en el registro. Con la configuración anterior, obtendría la lectura del 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 pruebe cualquier cosa, debería seguir haciendo un muestreo continuo, y solo quiero la muestra más resentida que creó mientras muestreaba automáticamente.

A continuación se muestra mi mejor suposición

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 el mismo que usé para comenzar a muestrear el canal 2.

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

¿Cómo logro esto?

He intentado hacer todo lo posible para 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 permitir que todos los ADC muestreen en paralelo y luego leer de ellos, sin interferir?

Buen comienzo. Lo único que falta es un enlace a la hoja de datos del MCP3424, que he agregado.
MCP3424 viene en dos paquetes, no en versiones, y ambos son de 4 canales. ST es TSSOP, SL es Soic. Existe el MCP3422 de 2 canales, dirección fija, el MCP3423 de 2 canales, dirección ajustable y el MCP3424 de 4 canales.
+1 Pregunta muy completa y bien escrita. Lamentablemente, ese chip es un solo ADC. Eso se ilustra en su hoja de datos en el "Diagrama de bloques funcional". Ha leído los canales de entrada en el sentido de ADC. Tener muchos canales de entrada permite usar un ADC para muestrear muchas señales diferentes (secuencialmente). El ADC es mucho más costoso de fabricar que un multiplexor analógico (que selecciona el canal), y el muestreo de múltiples señales es un requisito común. Por lo tanto, los chips ADC a menudo funcionan de esta manera. Andy, también conocido como, ha respondido a su pregunta, pero tal vez espere antes de aceptar, ya que podría obtener más información.
Creí que tenía 4 ADC, porque RS-Online dijo que E/SL tenía 4 y E/ST tenía 1. He agregado a la descripción
@MadsSkjern ignora RS, Microchip y su hoja de datos es el rey. Eso es un error en RS. Los errores en los sitios de los distribuidores son bastante comunes.

Respuestas (2)

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

Lamentablemente no. Solo hay un ADC y, para convertir más de un canal, esto debe hacerse secuencialmente dirigiéndose al multiplexor interno y "leyendo" otro canal. Desafortunadamente, no hay muestreo simultáneo: -

ingrese la descripción de la imagen aquí

Tenga en cuenta que el multiplexor de entrada selecciona SÓLO uno de los cuatro canales a la vez. Este es un método bastante común que se usa para leer múltiples canales, pero existen ADC de muestreo simultáneo. Trate de mirar las carteras de Linear tech, TI o ADI.

+1, me ganaste :-) Podría valer la pena explicar el hecho de que es bastante común que un ADC muestree múltiples canales, porque puede muestrear diferentes señales analógicas, lo cual es un caso común.
Además, si se requieren tasas de muestreo bajas, el multiplexado/entrelazado suele ser lo suficientemente bueno
Salpicaduras de mejoras, señor.
@gbulmer es muy amable señor!!

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

Este diagrama de la hoja de datos muestra esto con bastante claridad.

Arquitectura MCP3424

La hoja de datos respalda esto con la introducción:

4.1 Descripción general

Los dispositivos MCP3422/3/4 son convertidores Delta-Sigma A/D de 18 bits, diferenciales, multicanal y de baja potencia con una interfaz serial I2C. Los dispositivos contienen un multiplexor de selección de canal de entrada (mux), un amplificador de ganancia programable (PGA), una referencia de voltaje integrada (2,048 V) y un oscilador interno.

Por lo tanto, no puede convertir diferentes canales realmente simultáneamente, pero puede muestrear los canales secuencialmente con un retraso relativamente corto entre ellos.

Al usar el dispositivo, debe asegurarse de que los bits de dirección I2C sean estables; una vez más, de la hoja de datos:

El MCP3423 y el MCP3424 tienen dos pines de dirección de dispositivo externo (Adr1, Adr0). Estos pines se pueden configurar en una lógica alta (o vinculada a VDD), baja (o vinculada a VSS) o izquierda flotante (no conectada a nada o vinculada a VDD/2). Estas combinaciones de nivel lógico utilizan las dos clavijas permitir ocho direcciones posibles. La Tabla 5-3 muestra la dirección del dispositivo según el estado lógico de los pines de selección de dirección. El dispositivo muestrea el estado lógico de los pines Adr0 y Adr1 en los siguientes eventos:

una. Encendido del dispositivo.

b. Restablecimiento general de llamadas

(Ver Sección 5.4 “Convocatoria General”).

C. Bloqueo de llamada general

(Ver Sección 5.4 “Convocatoria General”).

El dispositivo muestra el estado lógico (pines de dirección) durante los eventos anteriores y bloquea los valores hasta que ocurre un nuevo evento de bloqueo. Durante el funcionamiento normal (después de que los pines de dirección estén enganchados), los pines de dirección se desactivan internamente del resto del circuito interno.

Se recomienda emitir un comando General Call Reset o General Call Latch una vez que el dispositivo se haya encendido. Esto asegurará que el dispositivo lea los pines de dirección en una condición estable y evitará bloquear los bits de dirección mientras la fuente de alimentación aumenta. Esto podría causar una detección de pin de dirección inexacta.

Le sugiero que siga 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.