MCP3424, ¿cómo leer canales en paralelo?


9

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 asumas demasiado conocimiento de mi parte. Estoy programando un Arduino.

Al preguntar sobre un componente / chip electrónico específico, supongo 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.

Avíseme 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 el MCP3424 E / SL, versión SOIC de 4 canales, no el MCP3422 o la versión 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 el E / ST tiene solo uno ( enlace directo ). ingrese la descripción de la imagen aquí

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

Estoy en lo cierto?

Comunicación a través de I2C

La comunicación ocurre enviando un byte de configuración, luego esperando que finalice una muestra y leyendo 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 hoja de datos de la página 18, que también se muestra aquí .

Formato de resultado de lectura

Mis ejemplos solo serán con una resolución de 18 bits (bits 5 y 6 establecidos en 1). El resultado de lectura será de cuatro bytes: los tres primeros 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 cómo hacer esto. Y todos los ejemplos que he encontrado en línea, también simples de esto. Simplemente escriba un byte de configuración en el componente, luego vuelva a leer 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 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 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 decirlo, que quiero el resultado del canal 2. No quiero pedirle que muestree cualquier cosa, debería seguir haciendo un muestreo continuo, y solo quiero la muestra más reenviada que creó mientras se muestreaba 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
}

Entonces mi mejor suposición es. Si quiero leer el canal 2, escribo un byte de configuración que es exactamente el mismo que el que usé para iniciar el muestreo del canal 2.

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

¿Cómo logro esto?

He intentado dar lo mejor de mí describiendo 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 muestreen en paralelo y luego leerlos sin interferir?


Buen comienzo. Lo único que falta es un enlace a la hoja de datos para el MCP3424, que he agregado.
JRE

MCP3424 viene en dos paquetes, no en versiones, y ambos son 4 canales. ST es TSSOP, SL es Soic. Existe el MCP3422 de 2 canales, dirección fija, MCP3423, 2 canales, dirección ajustable y MCP3424 de 4 canales.
Passerby

+1 Pregunta muy exhaustiva y bien escrita. Lamentablemente ese chip es un solo ADC. Esto se ilustra en su hoja de datos en el "Diagrama de bloque funcional". Ha leído los canales de entrada con el significado de ADC. Tener muchos canales de entrada permite que se use 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 alias ha respondido a su pregunta, pero tal vez espere antes de aceptar, ya que puede obtener más información.
gbulmer

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
Mads Skjern,

2
@MadsSkjern ignora RS, Microchip y su hoja de datos es el rey. Eso es un error en RS. Los errores en los sitios de distribución son bastante comunes.
Passerby

Respuestas:


11

Tengo este último con cuatro ADC. 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 tiene que 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 SOLO uno de los cuatro canales en cualquier momento. Este es un método bastante común utilizado para leer múltiples canales, pero existen ADC de muestreo simultáneo. Intente mirar las carteras de Linear tech, TI o ADI.


+1, ya me ganaste :-) Puede valer la pena explicar el hecho de que es bastante común que un ADC muestree múltiples canales, ya que puede muestrear diferentes señales analógicas, que es un caso común.
gbulmer

Además, si se requieren bajas tasas de muestreo, la multiplexación / intercalado a menudo es lo suficientemente bueno
Scott Seidman

Spiffing mejoras, señor.
gbulmer

@gbulmer eres muy amable señor !!
Andy aka

5

El MCP3424 es un ADC único con un multiplexor en el extremo frontal.

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 A / D Delta-Sigma de 18 bits multicanal diferenciales 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 a bordo (2.048V) y un oscilador interno.

Por lo tanto, no puede convertir diferentes canales de manera simultánea, 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 establecer en un nivel lógico alto (o vinculado a VDD), bajo (o vinculado a VSS), o dejar flotando (no conectado a nada, o vinculado a VDD / 2), estas combinaciones de nivel lógico utilizando los dos pines 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 muestra el estado lógico de los pines Adr0 y Adr1 en los siguientes eventos:

a. Encendido del dispositivo.

si. Restablecimiento general de llamadas

(Consulte la Sección 5.4 “Llamada general”).

C. General Call Latch

(Consulte la Sección 5.4 “Llamada general”).

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

Se recomienda emitir un comando Restablecimiento de llamada general o Bloqueo de llamada general una vez que el dispositivo se ha encendido. Esto asegurará que el dispositivo lea los pines de dirección en una condición estable y evitará enganchar los bits de dirección mientras la fuente de alimentación se está incrementando. 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.