Go Down

Topic: MCP3423 - I2C (Read 915 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy