Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« on: September 29, 2011, 11:38:09 am » |
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=42Pour 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.
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #1 on: September 29, 2011, 12:04:24 pm » |
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
|
|
|
|
« Last Edit: September 29, 2011, 12:17:59 pm by al1fch »
|
Logged
|
|
|
|
|
Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« Reply #2 on: September 29, 2011, 12:47:04 pm » |
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.
 - Je suis donc obligé d'exciter les 3 ponts en permanence? ]

|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #3 on: September 29, 2011, 01:19:22 pm » |
-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
|
|
|
|
|
Logged
|
|
|
|
|
Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« Reply #4 on: September 29, 2011, 02:07:22 pm » |
En voilà des nouvelles qu'elles sont bonnes! Il n'y a plusqu'à! Merci encore, et @+, quand le montage sera prêt!
|
|
|
|
|
Logged
|
|
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #6 on: September 30, 2011, 06:22:31 am » |
Un peu plus bas sur ma même page on voit : 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.
|
|
|
|
|
Logged
|
|
|
|
|
Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« Reply #7 on: October 11, 2011, 02:57:48 pm » |
Ça y est, j'ai monté le machin sur mon arduino uno. j'ai pompé sans tout bien comprendre: #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: uvolt = round(value * 2048/131.072); sans aide, peut-être que j'y arriverais, mais un petit coup de main n'est-ce-pas....
|
|
|
|
« Last Edit: October 12, 2011, 11:57:15 am by patsol »
|
Logged
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #8 on: October 11, 2011, 03:49:36 pm » |
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
|
|
|
|
« Last Edit: October 12, 2011, 07:10:20 am by al1fch »
|
Logged
|
|
|
|
|
Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« Reply #9 on: October 12, 2011, 05:20:24 am » |
Merci, c'est lumineux!  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  0.1V, ça me fait un peu de peine!
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #10 on: October 12, 2011, 06:47:52 am » |
mode 'pinaillage' ON 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'.....  A vérifier, c'est douteux !! CORRECTION : nombres négatifs codés en 'complément à 2' !!
|
|
|
|
« Last Edit: October 12, 2011, 07:11:33 am by al1fch »
|
Logged
|
|
|
|
|
Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« Reply #11 on: October 12, 2011, 07:16:53 am » |
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. 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é!?
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #12 on: October 12, 2011, 07:29:42 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Corsica
Offline
Jr. Member
Karma: 0
Posts: 82
|
 |
« Reply #13 on: October 13, 2011, 12:46:54 pm » |
Oui, bon, je galère: j'ai compris  et corrigé mon code en fonction de tes conseils, al1fch: 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?
|
|
|
|
« Last Edit: October 14, 2011, 12:49:46 pm by patsol »
|
Logged
|
|
|
|
|
Ales
Offline
Edison Member
Karma: 7
Posts: 1665
Do or DIY
|
 |
« Reply #14 on: October 14, 2011, 02:53:37 am » |
Je crois tout simplement que ce qui est en cause c'est les specs du MCP : http://ww1.microchip.com/downloads/en/DeviceDoc/22088c.pdfTension minimale : Vss - 0.3 donc si tu lui envois -1.5V c'est un peu normal que ça bug ...
|
|
|
|
|
Logged
|
|
|
|
|
|