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
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?