Go Down

Topic: [Librairie] MCP3424 - ADC 18 bits i2c (Read 4398 times) previous topic - next topic

B@tto

Aug 22, 2012, 01:31 pm Last Edit: Apr 03, 2013, 02:48 pm by B@tto Reason: 1
Bonjour à tous !

Je viens vous faire partager ma première librairie destinée à géré un MCP3424 qui est un ADC (Analogic to Digital Converter) connectable en i2c.

Pour les débutants : en gros un ADC correspond à la fonction analogRead sur arduino, sauf qu'ici on la le voir un peu plus loin, en plus performant ;) Et l'i2c  c'est un protocole de communication qui utilise 2 fils et un système d'adresse.

Pour commencer la datasheet de la bête : http://ww1.microchip.com/downloads/en/devicedoc/22088c.pdf

Alors le format est pas sympa si on veut faire du prototypage, mais existe des adaptateurs à souder.

(cf. schéma joint)

Les point importants à retenir : il a 4 voies et comporte un amplificateur différentiel en entrée, autrement dit on peut soit faire une différence entre deux tensions (par exemple sur un montage en pont de wheatstone) soit mettre une borne à la masse et s'en servir pour mesurer une tension simple. Ensuite à retenir : il peut mesurer des différences maxi de +- 2.048V, autrement dit, si on met une borne à la masse, l'amplificateur sera saturé à 2.048V. En revanche en différentiel ça fait une amplitude totale de 2 * 2.048 = 4.096 V. Le gain de l'amplificateur est directement programmable, de 1 à 8, sachant que la limite des +- 2.048V est valable pour l'étage ADC, donc par exemple à gain = 8, la saturation sera atteinte à 2.048 / 8 = 0.256V. La résolution est également programmable, on a le choix entre 12, 14, 16 ou 18 bits, avec des vitesses d'échantillonnage de plus en plus lente au fur et à mesure qu'on est plus précis. On peut ensuite choisir entre deux mode de con,version : un mode "one-shot" et un mode continu.

Pour la librairie et bien c'est au final très simple à mettre en oeuvre, je vous invite à consulter les exemples joints à la librairie, en voici un :

Code: [Select]
#include <MCP3424.h>
#include <Wire.h>

MCP3424 MCP(6); // Declaration of MCP3424 i2c adress=6

long Voltage[4]; // Array used to store results

void setup() {
 
 Serial.begin(9600);  // start serial for output
 
}

void loop(){
 
 for(int i=1;i<=4;i++){
      MCP.Configuration(i,18,1,8);
      Voltage[i]=MCP.Measure();
      Serial.print("Channel ");
      Serial.print(i);
      Serial.print(" : ");  
      Serial.print(Voltage[i]);
      Serial.println(" microVolt");
 }
  delay(500);
}


Ici on balaye les 4 canaux. A noter également que lorsque l'on fait appel à la fonction mesure, le programme attend que la conversion soit terminée.

Alors au niveau des perfs, et bien je dois avouer que je suis épaté par ce composant : je mesure des tensions de l'ordre du µV sans problème. En plus il possede sa propre référence analogique ce qui lui permet d'être très juste et l'i2c permet de le placer au plus près de la source ce qui limite les risque de parasite.

Voila j'espère que ça servira à d'autres et n'hésitez pas s'il y a des questions ;)

EDIT 12/11/2012 / Mise à jour, compatibilité avec IDE 1.0 vérifié et correction d'un bug lié à la détection d'une conversion terminée
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

icare

Bonjour B@tto,
Bravo pour ta librairie sur le convertisseur AD
@+
icare
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Artouste


...
Alors au niveau des perfs, et bien je dois avouer que je suis épaté par ce composant : je mesure des tensions de l'ordre du µV sans problème. En plus il possede sa propre référence analogique ce qui lui permet d'être très juste et l'i2c permet de le placer au plus près de la source ce qui limite les risque de parasite.

Voila j'espère que ça servira à d'autres et n'hésitez pas s'il y a des questions ;)


sympa
Mis dans la "besace" pour éventuelle utilisation "plus tard"   :smiley-mr-green:

B@tto

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Hexor

Bonjour B@tto,

Tout d'abord merci pour cette librairie !

Par contre je rencontre un petit soucis (qui vient surement de moi !)

J'utilise un MCP3424 + 4 jauges Fx1901 + ta librairie.
J'utilise donc ton exemple qui balaye les 4 entrée.
Tout marche bien pour la 1ere vague de lecture, par contre après toutes les valeur correspondent à la lecture de la 4ème entrée de la 1ere vague de lecture  :o
Et donc si je reset l'Arduino, la 1ere vague de lecture est bonne et après....

Code: [Select]
Channel 1 : 390 microVolt
Channel 2 : 125 microVolt
Channel 3 : -906 microVolt
Channel 4 : 7859 microVolt
Channel 1 : 7859 microVolt
Channel 2 : 7859 microVolt
Channel 3 : 7859 microVolt
Channel 4 : 7859 microVolt
Channel 1 : 7859 microVolt
Channel 2 : 7859 microVolt
Channel 3 : 7859 microVolt
Channel 4 : 7859 microVolt
Channel 1 : 7859 microVolt
Channel 2 : 7859 microVolt
Channel 3 : 7859 microVolt
Channel 4 : 7859 microVolt
...


Voici le code utilisé (le digitalWrite sert à activer l'alim du MCP3424):
Code: [Select]

/* MCP 3424 version 1.2 example sketch Multichannel
Written by B@tto
Contact : batto@hotmail.fr

In this example, the four channel are measured and results displayed by serail connection.
*/

#include <MCP3424.h>
#include <Wire.h>

MCP3424 MCP(0); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V

long Voltage[4]; // Array used to store results

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  delay(1000);
  Serial.begin(9600);  // start serial for output

}

void loop(){

  for(int i=1;i<=4;i++){

    MCP.Configuration(i,18,1,1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8
    Voltage[i]=MCP.Measure(); // Measure is stocked in array Voltage, note that the library will wait for a completed conversion that takes around 200 ms@18bits
    Serial.print("Channel "); // print results
    Serial.print(i);
    Serial.print(" : "); 
    Serial.print(Voltage[i]);
    Serial.println(" microVolt");

  }
 
  delay(500);
}


As-tu une idée stp ?
Merci  :D

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