Tuto - LTC2400 convertisseur A/D 24bits

Bonjour à tous,

Ca fait un moment que je voulais transmettre le fruit mon dur labeur ! Alors je vais donc vous parler de cette bestiole :

http://radiospares-fr.rs-online.com/web/search/searchBrowseAction.html?method=searchProducts&searchTerm=ltc2400

Datasheet :

http://docs-europe.origin.electrocomponents.com/webdocs/05ad/0900766b805ad384.pdf

Alors il y avait déja des choses ici :

http://interface.khm.de/index.php/lab/experiments/connect-a-ltc2400-high-precision-24-bit-analog-to-digital-converter/

Mais je n'ai jamais réussi à faire marcher ce qui était expliqué ...

Comme expliqué dans le titre, il s'agit d'un convertisseur analogique/numérique 24 bits (entre nous, 24 bits c'est un petit peu abusé, mais la précision est quand même nettement supérieure à ce qu'offre l'arduino en standard).

Pour les débutants ou ceux qui sont assez peu familiers de ces histoire de bits (sans mauvais jeu de mots), 24 bits cela signifie que la puce va être capable de dicerner 2^24 paliers de tension. A comparer avec les 10 bits de l'arduino :wink: si on veut traduire cela encore plus concretement, si la tension de référence est de 5V, cela nous donne une sensibilité de 0,3 µV (attention comme dit précedement, on tape dans du très sensible la, le moindre parasite a un impact énorme), alors que sur l'arduino on est à 5 mV. Donc cette petite puce permet assez simplement d'améliorer grandement la sensibilité d'une arduino.

Hardware

Bon comme j'ai appris l'électronique un peu sur le tas, si il y a des experts qui veulent rajouter des choses ils sont les bienvenues !!

Si vous regardez la datasheet, elle est très bien fichue, il y a plein de schémas. Moi j'ai réduit le montage au plus simple, donc au niveau connectique cela donne :

1 : 5V
2 : 5V
3 : tension à mesurer. Important : mettait une résistance de 5K entre le point de mesure et la patte, sinon ça fait n'importe quoi dans les basses tensions.
4 : GND
5 : à relier soit au 5V soit au GND, je n'ai pas pris le temps de tester l'influence sur la qualité de la mesure, la seule chose qui apparait dans la datasheet c'est que relié au GND elle va plus vite. Donc pour ma part, GND :smiley:
6 : a relier à un pin digital de l'arduino.
7 : a relier à un pin digital de l'arduino.
8 : GND

Après il faut bien penser à mettre des condos pour stabiliser les tensions un peu partout :wink:

Software

Pour le software, si vous voulez tout comprendre il faut regarder les pages 10 à 12 de la datasheet : en fait je génère les cycles d'horloge sur le port digital relié au SCK, et les données sortent sur le SDO. Comme l'acquisition ici est beaucoup plus lente que sur l'arduino (100-200 ms), le programme "guette" l'état du SDO qui passe à l'état bas une fois que la conversion est terminée, et lance les cycles d'horloge pour récupérer les données.

#define SDO  50 //SDO 
#define SCK  52 //SCK

int Buffer[31];

boolean State;
float Mesure;
float Vref = 5;

void setup()
{
  Serial.begin(9600);
  pinMode(SDO,INPUT);
  pinMode(SCK,OUTPUT);
  digitalWrite(SCK,LOW);
}

void loop() {

delay(20);

State1=digitalRead(SDO);

if (State==LOW){ //test si la conversion est terminée
  
                for(int x=0;x<=31;x++) {
                  Buffer[x]='\o'; //mise à zero de la variable
                }
                for (int i=31;i>=0;i--){
                                        
                                        
                                        if (State==HIGH){
                                                          Buffer [i]=1 ;
                                                        } else {
                                                          Buffer [i]=0;
                                                        }
                                        
                                        digitalWrite(SCK,HIGH);   //cycle horloge 
                                        digitalWrite(SCK,LOW); 
                                        
                                        
                                        State=digitalRead(SDO);

                                        }
               
                                        digitalWrite(SCK,HIGH);   //cycle d'horloge pour relancer conversion   
                                        digitalWrite(SCK,LOW); 
                                        

                Mesure=0;
               
                for (int x=27;x>=4;x--) {
                  Mesure=Mesure+Buffer[x]*pow(2,x-4); //conversion binaire ==> décimal
                }
                if (Buffer[28]==1 || Buffer [29]==0) Mesure=0; //si la mesure est <0 ou au-dessus de Vref
                

                Mesure=Mesure*Vref*1000000;
                Mesure=Mesure/16777215;
               
                Serial.println(Mesure);
        
}
}

Pensez bien sûr à adapter les numéros de pin aux votres :wink:

Cool ton tuto tombe bien, j'ai justement reçu mon LTC2400 pour mon projet d'altimètre :slight_smile:

Tiens moi au jus :wink: j'ai un peu ressorti le code du grenier, je dois m'en resservir bientôt, j'espère qu'il n'y a pas d'erreur dedans !

Bon il y a vait quelques petites erreurs dans mon code, voici la version corrigée qui donne de bien meilleurs résultats (mesure du domaine du µV) :

int LTCSCK=32; // pin 7 du LTC2400
int LTCSDO=34; //pin 6 du LTC2400
int BufferLTC[31];
Vref=5;  // la tension que vous envoyez sur le pin 2 du LTC2400


unsigned long Mesure(){
    

digitalWrite(LTCSCK,HIGH);   //cycle pour lancer conversion
delay(1);
digitalWrite(LTCSCK,LOW); 
delay(140);

State=digitalRead(LTCSDO);

  while(State==HIGH) {
    delay(1);
    State=digitalRead(LTCSDO);
  }
  
  for(int x=0;x<=31;x++) {
                  
    BufferLTC[x]='\0'; //mise à zero de la variable
               
              }
                for (int i=31;i>=1;i--){
                                       
                  digitalWrite(LTCSCK,HIGH);   //cycle horloge 
                  delay(1);
                  digitalWrite(LTCSCK,LOW); 
                  delay(1);
                                        
                                        if (State==HIGH){
                                                          BufferLTC[i]=1 ;
                                                        } else {
                                                          BufferLTC[i]=0;
                                                        }
                                                                                                                      
                                        State=digitalRead(LTCSDO);
                                        

                                        }
                                                                          
               V=0.00;
               
               for (int x=27;x>=4;x--) {
               double y=pow(2.00,(x-4.00));
               V=V+BufferLTC[x]*y;                 }
                
                if (BufferLTC[29]==0) V=0.00; 
                if (BufferLTC[28]==1) V=Vref;
                                
                V=V*Vref*1000000;
                V=V/16777215.00;
                
return V;  
  
}

Avec ça il suffit ensuite dans votre code d'appeler Mesure() pour obtenir une mesure en µV :wink:

Et puis parce que je suis une grosse tâche, il y avait également une inversion sur la connexion des pins :

1 : 5V
2 : 5V
3 : tension à mesurer. Important : mettait une résistance de 5K entre le point de mesure et la patte, sinon ça fait n'importe quoi dans les basses tensions.
4 : GND
8 : à relier soit au 5V soit au GND, je n'ai pas pris le temps de tester l'influence sur la qualité de la mesure, la seule chose qui apparait dans la datasheet c'est que relié au GND elle va plus vite. Donc pour ma part, GND
7 : a relier à un pin digital de l'arduino.
6 : a relier à un pin digital de l'arduino.
5 : GND

D'abord Merci,

Juste une remarque quand même ::slight_smile: : dommage que tu n'utilises pas une interruption pour détecter la fin d'une mesure. Cela permettrai à l'arduino de faire autre chose que d'attendre.

Gozaki

www.laboelectronique.be

Huuummm pas bête du tout !! Perso ça ne me sert pas dans mon projet mais c'est une piste d'amélioration pour d'autres :wink: