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.
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 ).
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?
La comunicación ocurre al enviar un byte de configuración, luego esperar a que finalice un muestreo y leer el resultado.
Los interesantes son:
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í .
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.
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.
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
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.
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?
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: -
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.
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.
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.
JRE
Transeúnte
gbulmer
mads skjern
Transeúnte