Pages: [1]   Go Down
Author Topic: Tuto - LTC2400 convertisseur A/D 24bits  (Read 1839 times)
0 Members and 1 Guest are viewing this topic.
Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3759
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

    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  smiley-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-grin
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  smiley-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.

Code:
#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  smiley-wink
Logged


Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3759
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tiens moi au jus smiley-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 !
Logged


Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3759
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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) :

Code:

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 smiley-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
Logged


Belgium
Offline Offline
Jr. Member
**
Karma: 1
Posts: 80
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

D'abord Merci,

Juste une remarque quand même  :smiley : 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
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3759
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged


Pages: [1]   Go Up
Jump to: