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?