Go Down

Topic: balance 3axes (Read 1 time) previous topic - next topic

patsol

Bonjour à tous,

Je voudrais réaliser une balance 3axes avec une arduino uno, une INA125 et des jauges d'extensiometrie en pont de wheastone.
Je m'inspire de ceci: http://cerulean.dk/words/?page_id=42
Pour limiter la conso, j'envisage d'exciter successivement les trois pont et mesurer la microdef sur une seule INA125, (voir mon schémas).
Avant de me lancer, j'aurais aimé avoir votre avis.

al1fch

#1
Sep 29, 2011, 07:04 pm Last Edit: Sep 29, 2011, 07:17 pm by al1fch Reason: 1
Bonjour

Supposons réglé le problême du collage des jauges....

Les ponts de Wheatstone vont se géner avec cette mise en parallèle !!!
Il est déjà difficile de récupérer la faible tension différentielle d'un pont, si en plus il y a des résistances en parallèle je crains qu'il n'y ait plus grand chose d'intéressant à mesurer.
Le fait de ne pas exciter 2 des ponts ne supprime pas la perturbation, les résistances sont toujours là en parallèle avec celles du pont actif qui aura du mal à s'exprimer !!

A mon avis il est impératif de séparer les ponts :
-en mettant un ampli d'instrumentation par pont,
-ou en prenant un bon convertisseur Analogique Numérique possédant les 3 entrées différentielles,
-ou en interposant un multiplexeur analogique entre ponts et Ampli unique

Exemple (parmi d'autres) de convertisseur utilisable : le MCP3424 de Microchip, 18bits, bus I2C, 4 entrées différentielles. http://jeelabs.net/projects/hardware/wiki/Analog_Plug

patsol

Je m'en doutais un peu.
Merci pour le lien, c'est une bonne solution.
Cependant,

  • il me semble que sur arduino, I2c est en 5v.  :smiley-eek-blue:

  • Je suis donc obligé d'exciter les 3 ponts en permanence? ]:)



al1fch

-Les ponts peuvent etre excités sous 5V l'un après l'autre en les reliant chacun à une sortie numérique.
-Si le convertisseur est comme le MCP3424 (5V ou 3,3V) il n'y a pas de probleme. Tout peut être sous 5V

patsol

En voilà des nouvelles qu'elles sont bonnes!
Il n'y a plusqu'à!
Merci encore, et @+, quand le montage sera prêt!

patsol

Quote
-Si le convertisseur est comme le MCP3424 (5V ou 3,3V) il n'y a pas de probleme. Tout peut être sous 5V

et pourtant, je lis à http://jeelabs.net/projects/hardware/wiki/Analog_Plug:
Quote
An I2C bus running at 3.3V is used for I/O,

Faut-il prévoir un convertisseur tel http://www.hobbytronics.co.uk/logic-level-converter ?
Ça me laisse perplexe. :smiley-roll-sweat:

al1fch

Un peu plus bas sur ma même page on voit :
Quote
This plug can be operated at 5V as well as 3.3V.
This board uses the conventions of a JeePlug and can be used with the ports on a JeeNode. It can also be used with other boards and MCU's, if you hook it up properly and adapt the interface code for it.


En fait le schéma montre effectivement une totale adaptabilité au 5V car
-la puce le supporte,
-les résistances de tirage (pull-up) du bus I2C ne sont pas implantées.

patsol

#7
Oct 11, 2011, 09:57 pm Last Edit: Oct 12, 2011, 06:57 pm by patsol Reason: 1
Ça y est, j'ai monté le machin sur mon arduino uno.
j'ai pompé sans tout bien comprendre:
Code: [Select]

#define analogPlug 0x68         // analogPlug I2C address

#include <Wire.h>
byte buffer[3];   // Array to store values

void setup()
{
   Serial.begin(9600);
   
   Wire.begin();
   wire.beginTransmission(analogplug);
   // Set analoogPlug settings
   // chanel1, continuous,18-bit, gain x1
   wire.send(0x1c);
   wire.endTransmission();
}

void loop()
{
   // Read the analogPlug

   Wire.beginTransmission(analogPlug);
   Wire.requestFrom(analogPlug,3); // Read 3 bytes 18-bit
   i = 0;
   while(Wire.available())
   {
       buffer[i] = Wire.receive();
       i++;
   }
   Wire.endTransmission();

   //Combine bytes into integer
   long value = (long) buffer[0] << 16 | buffer[1] << 8 | buffer[2];
   long uvolt = round(value * 2048/131.072);
   // Print out what we have
   Serial.println(uvolt/10);
   delay(400);             // wait for a second  
}



résultat: avec une vieille pile de1.5v, j'obtiens 147871, ce qui colle assez bien avec mon multimetre.
en court circuit, j'ai un beau 0
mais en mettant la même pile à l'envers, tuedieux! j'ai -45312!
j'essaie de comprendre avec le MSB, mais surtout, je n'ai pas encore bien compris pourquoi cette ligne:
Code: [Select]
uvolt = round(value * 2048/131.072);
sans aide, peut-être que j'y arriverais, mais un petit coup de main n'est-ce-pas....

al1fch

#8
Oct 11, 2011, 10:49 pm Last Edit: Oct 12, 2011, 02:10 pm by al1fch Reason: 1
Ce convertisseur travaille içi sur 17 bits de valeur absolue  (FAUX)    et un bit MSB de signe ("18bits")

2 puissance 17 = 131 072 (nombre de valeurs absolues possibles)
La réference de tension interne (précision 0,05 %) est 2,048V ou 2048 mV (pleine échelle en volts)

Le rapport 2048/131,072 permet donc d'afficher une valeur en µV

patsol

Merci, c'est lumineux! 8)

En toute rigueur, avec 17 bits, la valeur max est 131071?
pour le signe et le msb, Pas de soucis.

par contre, nouvelle surprise, quand je branche correctement ma pile, j'obtiens:
0101101010000101010110    1483094
bien, et en inversant la polarité
1110000100000000100001    -1589281
:smiley-roll-blue:

0.1V, ça me fait un peu de peine!


al1fch

#10
Oct 12, 2011, 01:47 pm Last Edit: Oct 12, 2011, 02:11 pm by al1fch Reason: 1
mode 'pinaillage' ON
Quote
En toute rigueur, avec 17 bits, la valeur max est 131071?

Oui?  Et avec la valeur zéro in a 131072 "valeurs possibles " !!
mode 'pinaillage' OFF

100mV d'erreur pour un circuit ayant 1µV de résolution c'est effectivement dérangeant !!!
Je possède cette petite carte mais ne l'ai pas encore testée. Il faut trouver la cause et 'débugger" !!
je n'ai pas le temps en ce moment . Il faudrait vérifier dans la doc du convertisseur comment sont codés les nombres négatifs et voir si le programme de JCW respecte bien ce codage.
J'ai écrit hier un peu vite et sans vérifier '17bits de valeur absolue'.....  :smiley-red: A vérifier, c'est douteux  !!

CORRECTION  : nombres négatifs codés en 'complément à 2'   !!

patsol

Quote
mode 'pinaillage' OFF

Bon, c'était juste pour ma compréhension. C'est à la notion de "valeurs possibles" qu'il faut que je réfléchisse, plutôt que valeur max?

C'est peut-être (sans doute) mon adaptation du code de JCW qui est en cause, mais il semble que celui-ci ne fait aucun effort pour connaître la polarité. Dans certains cas, ça peut être sans intérêt, mais pour mes ponts de jauges, j'ai besoin de la mesure signée.

Quote
Il faudrait vérifier dans la doc du convertisseur comment sont codés les nombres négatifs

c'est le MSB: 1-> négatif 0->positif
0101101010000101010110    1483094
1110000100000000100001    -1589281

Enfin, si j'ai bien compris. C'est peut-être un peu plus compliqué!?

al1fch

Quote

1 11111111111111111  ce que donne le circuit pour -1
   11111111111111111  on laisse le bit de signe
   00000000000000000  on inverse chaque bit
   00000000000000001  on ajoute 1

Il faut faire ce travail pour récupérer la valeur absolue d'un nombre négatif.
C'est un codage fréquent pour les convertisseurs analogique/numérique ou numérique/analogique
Avec ce codage le nombre zéro n'esiste pas en deux exemplaires +0 et -0
De plus de manière paradoxale ça simplifie les opération arithmétiques en binaire.

patsol

#13
Oct 13, 2011, 07:46 pm Last Edit: Oct 14, 2011, 07:49 pm by patsol Reason: 1
Oui, bon, je galère:

j'ai compris  :. et corrigé mon code en fonction de  tes  conseils, al1fch:
Code: [Select]
    int i = 0;
    while(Wire.available())
    {
        buffer[i] = Wire.receive();
        i++;
    }
    Wire.endTransmission();
   //Combine bytes into integer
   int signe = 1;
   long value = (long) buffer[0] << 16 | buffer[1] << 8 | buffer[2];
   if (bitRead(value,17) == 1)  //c'est négatif
   {
     bitWrite(value,17,0);// on laisse le bit de signe
    //!! avec bitWrite(value,16,0), ca regle le probleme, du moins avec ma pile, mais bon!
     signe = -1;
     value = ~ value;//on inverse chaque bit
   }


bon, j'ai pas encore ajouté 1 (mode 'pinaillage' OFF)
Vous ne pensez pas que la méthode de récupération de la valeur est peut-être en cause?


B@tto

Je crois tout simplement que ce qui est en cause c'est les specs du MCP : http://ww1.microchip.com/downloads/en/DeviceDoc/22088c.pdf

Tension minimale : Vss - 0.3 donc si tu lui envois -1.5V c'est un peu normal que ça bug ...

Go Up