-
17/05/2011 - 16h02 dragon56360
probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
Comme je l'ai marque dans le titre, j ai un probleme (peut etre de lecture je ne sais pas trop). En effet je lis les registres de mon accelerometre (le MSB=registre 0x32 et le LSB=registre 0x33) pour l'axe x, puis je multiplie le MSB par 256 auquel j ajoute la valeur du LSB pour avoir la veritable acceleration suivant x. Je suis avec un precision +-2g pour l accelerometre et je n obtient que des valeurs comprises entre 255 et 0 alors qu elles devraient etre comprises entre 0 et 1023... voila quelques parties de mon codes ou peuvent etre les erreurs. Alors si vous voyez quelque chose d anormal n esitez pas a me prevenir merci d avance.
****************************** **********************
Voici ma fonction lecture:
int read(int esclave,int registre) {
unsigned char valeur;
initialisation();
StartI2C();
IdleI2C();
WriteI2C(esclave);//adresse de l esclave
IdleI2C();
WriteI2C(registre);//adresse du registre
IdleI2C();
StopI2C();
IdleI2C();
StartI2C();
IdleI2C();
WriteI2C(esclave+1);//adresse de l esclave en mode lecture
IdleI2C();
valeur=ReadI2C();
IdleI2C();
NotAckI2C();
IdleI2C();
StopI2C();
return valeur;
****************************** ********************
Voici un morceau d'une de mes fonction appelee dans le main:
unsigned int acc_x;
unsigned char x_MSB,x_LSB;
x_MSB=read(0xA6,0x32);//on lit le registre ds l accelerometre suivant x
x_LSB=read(0xA6,0x33);//on lit le registre ds l accelerometre suivant x
acc_x=((x_MSB & 0x80) != 0) ? (((~0)>>16)<<16) | ((x_MSB<<8)+x_L): (x_MSB<<8)+x_LSB;
sprintf(s,"acc_x=%d\r\n",acc_x );
putsUSBUSART(s);//je transmet mes donnees par USB
-
17/05/2011 - 16h22 dragon56360
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
je viens de me rendre compte que la fonction est declaree comme un int, je l ai donc changee en char read, mais les valeurs restent alors figee en 64...
-
17/05/2011 - 16h44 simon.
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
 Envoyé par dragon56360 acc_x=((x_MSB & 0x80) != 0) ? (((~0)>>16)<<16) | ((x_MSB<<8)+x_L): (x_MSB<<8)+x_LSB;
Qu'est-ce que c'est que ce tas de spaghettis...
Tu attends des valeurs entre 0 et 1023 ? Alors pourquoi tester le bit fort du MSB ?
Bref, je te propose: acc_x = (((int) x_MSB) << 8) | ((int) x_LSB);
Y'a un peu ceinture et bretelles, mais ça devrait le faire.
-
17/05/2011 - 17h09 dragon56360
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
effectivement ca aide un peu, puisque maintenant mes valeurs vont a peu pres de -255(bizarre puisque j utilise des unsigned) a 266 (MSB vaut 1 et LSB vaut 10) mais le MSB passe de 1 a 255 et la je ne comprend vraiment pas pourquoi.
-
17/05/2011 - 17h27 simon.
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
Ah mais un coup d'oeil rapide au datasheet revele que les valeurs renvoyées sont visiblement signées... donc ca serait normal.
Comme tu utilises %d dans le printf le fait que ton acc_x soit unsigned n'a aucune importance.
-
18/05/2011 - 04h04 maclag
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
Bonjour,
Je ne sais pas comment tu obtiens le "de 0 à 255" et les valeurs suivantes.
Par contre, si la sortie est signée, la plage de fonctionnement +/-2G donne +/-512 en signé (enfin, -512 à +511).
Et si tu ne prends les sorties qu'en position statique, l'accéléromètre ne voit pas plus que la gravité, et là on aura donc +/-1G soit -256/+255.
Apparemment, tu n'en es pas si loin...
-
18/05/2011 - 08h02 thibaultblf
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
Laurent, on t'a reconnu ! the dragon of belle ile
-
18/05/2011 - 08h28 dragon56360
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
Merci maclag, en effet en "secouant" un peu man accelerometre, mes valeurs s'echelonnent de -512 à 511!!!! Alors qu en le deplaceant lentement, mes valeurs vont de -255 a 270. Le 270, la je ne vois pas mais mes valeurs s'echelonnent sur la bonne plage. Merci a tous pour vos reponse je crois qu on me probleme est regle ou "presque" regle.
-
18/05/2011 - 10h11 maclag
Re : probleme de lecture i2c entre pic18f2550 et accelerometre adxl345
C'est tout-à-fait normal si tu n'as pas un parfait 0 à l'offset et pas exactement 256LSB/G en sensibilité. Les capteurs sortis d'usine ont une erreur, et tu es encore dans les clous des spécifications.
Refais une calibration vite fait (capteur fixe, orienté une fois vers le haut, mesure, une fois vers le bas, mesure) sur chaque axe si tu veux être précis.
| | |