Funcionamiento acelerómetro mma7260

Dependencies:   mbed

Committer:
jaume
Date:
Mon Jan 03 22:47:53 2011 +0000
Revision:
0:1458daeb68fc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jaume 0:1458daeb68fc 1 /* Proyecto: MMA7260 Jaume */
jaume 0:1458daeb68fc 2 #include "mbed.h"
jaume 0:1458daeb68fc 3
jaume 0:1458daeb68fc 4 BusOut mleds(LED1, LED2, LED3, LED4);
jaume 0:1458daeb68fc 5 AnalogIn acelX (p20); //Al eje X del acelerometro
jaume 0:1458daeb68fc 6 AnalogIn acelY (p19); //Al eje Y del acelerometro
jaume 0:1458daeb68fc 7 AnalogIn acelZ (p18); //Al eje Z del acelerometro
jaume 0:1458daeb68fc 8 Serial pc(USBTX, USBRX); // tx, rx a 9600
jaume 0:1458daeb68fc 9
jaume 0:1458daeb68fc 10 int x, y, z; // mediciones en grados
jaume 0:1458daeb68fc 11 float oneG_x, oneG_y, oneG_z; // medidadas a operar
jaume 0:1458daeb68fc 12 float zeroG_x, zeroG_y, zeroG_z; // medidas a operar
jaume 0:1458daeb68fc 13 float med_x, med_y, med_z; // medidas adquiridas
jaume 0:1458daeb68fc 14
jaume 0:1458daeb68fc 15 // lee los pins analogicos 64 valores trabajando a 3.3v
jaume 0:1458daeb68fc 16 void DoMeasureXYZ() { // a 90 2,45v a 0 1,65v a -90 0,85v
jaume 0:1458daeb68fc 17 int j;
jaume 0:1458daeb68fc 18 for (j=0;j<64;j++) {
jaume 0:1458daeb68fc 19 wait_ms(1);
jaume 0:1458daeb68fc 20 med_x += acelX.read_u16(); //lecturas de 12 bits
jaume 0:1458daeb68fc 21 wait_ms(1);
jaume 0:1458daeb68fc 22 med_y += acelY.read_u16();
jaume 0:1458daeb68fc 23 wait_ms(1);
jaume 0:1458daeb68fc 24 med_z += acelZ.read_u16();
jaume 0:1458daeb68fc 25 }
jaume 0:1458daeb68fc 26 med_x = med_x/64;
jaume 0:1458daeb68fc 27 med_y = med_y/64;
jaume 0:1458daeb68fc 28 med_z = med_z/64;
jaume 0:1458daeb68fc 29 }
jaume 0:1458daeb68fc 30
jaume 0:1458daeb68fc 31 void Read_Angles() {
jaume 0:1458daeb68fc 32 float div_x, x_rad, div_y, y_rad, div_z, z_rad ;
jaume 0:1458daeb68fc 33 DoMeasureXYZ();
jaume 0:1458daeb68fc 34 div_x = (med_x-zeroG_x) / (oneG_x-zeroG_x); // med_G/sensibil
jaume 0:1458daeb68fc 35 x_rad = asin( div_x ); // x angulo en radians
jaume 0:1458daeb68fc 36 x = (x_rad*180) / 3.14; // x angulo en grados
jaume 0:1458daeb68fc 37
jaume 0:1458daeb68fc 38 div_y = (med_y-zeroG_y) / (oneG_y-zeroG_y); // med_G/sensibil
jaume 0:1458daeb68fc 39 y_rad = asin( div_y ); // y angulo en radians
jaume 0:1458daeb68fc 40 y = (y_rad*180) / 3.14; // y angulo en grados
jaume 0:1458daeb68fc 41
jaume 0:1458daeb68fc 42 div_z = (med_z-zeroG_z) / (oneG_z-zeroG_z); // med_G/sensibil
jaume 0:1458daeb68fc 43 z_rad = asin( div_z ); // z angulo en radians
jaume 0:1458daeb68fc 44 z = (z_rad*180) / 3.14; // z angulo en grados
jaume 0:1458daeb68fc 45 }
jaume 0:1458daeb68fc 46
jaume 0:1458daeb68fc 47 void calibrar() {
jaume 0:1458daeb68fc 48 printf("1.-Acelerometro posicionado paralelo al suelo \n");
jaume 0:1458daeb68fc 49 printf ("Pulsa una tecla para seguir:\n");
jaume 0:1458daeb68fc 50 while (!pc.getc()); // espera mientras no pulses una tecla
jaume 0:1458daeb68fc 51 // Medir 0g en eje X y eje Y y -1g para eje Z.
jaume 0:1458daeb68fc 52 DoMeasureXYZ();
jaume 0:1458daeb68fc 53 zeroG_x += med_x; // 0g 165mV
jaume 0:1458daeb68fc 54 zeroG_y += med_y; // 0g 165mV
jaume 0:1458daeb68fc 55 oneG_z += med_z; //-1g 85mV
jaume 0:1458daeb68fc 56 printf("2.- Acelerometro con eje X vertical flecha hacia arriba \n");
jaume 0:1458daeb68fc 57 printf ("Pulsa una tecla para seguir:\n");
jaume 0:1458daeb68fc 58 while (!pc.getc()); // espera mientras no pulses una tecla
jaume 0:1458daeb68fc 59 // para medir -1g en eje X y 0g en eje Z. El eje y es 0g ya de antes
jaume 0:1458daeb68fc 60 DoMeasureXYZ();
jaume 0:1458daeb68fc 61 oneG_x += med_x; // -1g
jaume 0:1458daeb68fc 62 zeroG_y += med_y; // 0g
jaume 0:1458daeb68fc 63 zeroG_z += med_z; // 0g
jaume 0:1458daeb68fc 64 printf ("3.- Acelerometro con eje Y vertical flecha hacia arriba \n");
jaume 0:1458daeb68fc 65 printf ("Pulsa una tecla para seguir:\n");
jaume 0:1458daeb68fc 66 while (!pc.getc()); // espera mientras no pulses una tecla
jaume 0:1458daeb68fc 67 // para medir -1G en eje Y Los otros siguen valeindo 0g
jaume 0:1458daeb68fc 68 DoMeasureXYZ();
jaume 0:1458daeb68fc 69 zeroG_x += med_x; // 0g
jaume 0:1458daeb68fc 70 oneG_y += med_y; // -1g
jaume 0:1458daeb68fc 71 zeroG_z += med_z; // 0g
jaume 0:1458daeb68fc 72 // Igualar valores medidos a 0g
jaume 0:1458daeb68fc 73 zeroG_x = zeroG_x/2;
jaume 0:1458daeb68fc 74 zeroG_y = zeroG_y/2;
jaume 0:1458daeb68fc 75 zeroG_z = zeroG_z/2;
jaume 0:1458daeb68fc 76 printf ("A 0g x %.3f y %.3f z %.3f \n",zeroG_x, zeroG_y, zeroG_z);
jaume 0:1458daeb68fc 77 printf ("A -1g x %.3f y %.3f z %.3f \n",oneG_x, oneG_y, oneG_z);
jaume 0:1458daeb68fc 78 }
jaume 0:1458daeb68fc 79
jaume 0:1458daeb68fc 80 int main() {
jaume 0:1458daeb68fc 81 calibrar(); // Primero calibrar: Z plano X e Y flecha arriba
jaume 0:1458daeb68fc 82 while (1) {
jaume 0:1458daeb68fc 83 Read_Angles(); // Transformamos lecturas a angulos
jaume 0:1458daeb68fc 84 printf ("----------------GRADOS-------\n");
jaume 0:1458daeb68fc 85 printf ("Angulo en eje X %d \n",x);
jaume 0:1458daeb68fc 86 printf ("Angulo en eje Y %d \n",y);
jaume 0:1458daeb68fc 87 printf ("Angulo en eje Z %d \n",z);
jaume 0:1458daeb68fc 88 mleds = (x+y+z)/8;
jaume 0:1458daeb68fc 89 printf ("-------------------------------\n");
jaume 0:1458daeb68fc 90 printf ("Pulsa una tecla para seguir \n");
jaume 0:1458daeb68fc 91 while (!pc.getc()); // espera mientras no pulses una tecla
jaume 0:1458daeb68fc 92 }
jaume 0:1458daeb68fc 93 }