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 ).
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
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?
Respuestas:
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: -
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.
fuente
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.
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.
fuente