Go Down

Topic: MCP3423 - I2C (Read 842 times) previous topic - next topic

bodhi

Buenas tardes,
quiero trabajar leyendo entradas analógicas vía i2c con el chip MCP3423 (18bits, 2 entradas analógicas). He visto una librería para el MCP3421 (18bits, 1 entrada analógica), donde queda claro el funcionamiento. El problema viene que leyendo el datasheet para ambos no me queda claro como leer las 2 entradas del MCP3423. Para leer los 3 bytes del MCP3421 se utiliza el siguiente código:
      Wire.requestFrom(_adr, 4);
      _b2 = Wire.read();
      _b3 = Wire.read();
      _b4 = Wire.read();
      _confRead = Wire.read();
      Wire.endTransmission();
Para el MCP3423, debería leer 8 bytes ?. Lo pregunto porque estoy pensando en comprármelo y antes quería saber si era fácil de comunicar con él o iba a ser un engorro.
Gracias,

curro92

Hola,
yo usé el ejemplo que aparece aquí http://forums.adafruit.com/viewtopic.php?f=31&t=12269
Al principio se definen los canales, y luego se configura el MCP3424
Code: [Select]

#define MCP342X_CHANNEL_1  0X00 // select MUX channel 1
#define MCP342X_CHANNEL_2  0X20 // select MUX channel 2
#define MCP342X_CHANNEL_3  0X40 // select MUX channel 3
#define MCP342X_CHANNEL_4  0X60 // select MUX channel 4

uint8_t adcConfig = MCP342X_START | MCP342X_CHANNEL_1 | MCP342X_CONTINUOUS;
 
mcp342xWrite(adcConfig);


bodhi

Gracias por responder !
por lo que veo en el ejemplo, siempre hay que mandar el byte de configuración para leer el canal. En mi caso, al tener sólo 2 entradas, me valdría el ejemplo que me pones modificando sólo el "for" de lectura de canales. Pongo el código por si a alguien pudiera servirle.
A2
Code: [Select]
void loop()
{         
   for(chan = 0; chan < 4; chan++)
   {
      adcConfig = 0;  // if adcConfig not reset, chan gets stuck at 3
      adcConfig |= chan << 5 | res << 2 | gain | MCP342X_START;
      mcp342xWrite(adcConfig);
      int32_t data;
     
      if (!mcp342xRead(data)) halt();
     
      // voltage in millivolts
      double mv = (double)data/mvDivisor;
      // uncomment line below to convert reading to microvolts
      // int32_t uv = (data*1000L)/mvDivisor;
      Serial.print(chan, HEX);
      Serial.print(" = ");               // take out the /10 below for straight mV
      Serial.print(mv/10);               // format for LM35 temperature
      if(chan < 3) Serial.print("\t");   // make it a tab delim table
}
   }

Go Up