
Funcionamiento acelerómetro mma7260
main.cpp
- Committer:
- jaume
- Date:
- 2011-01-03
- Revision:
- 0:1458daeb68fc
File content as of revision 0:1458daeb68fc:
/* Proyecto: MMA7260 Jaume */ #include "mbed.h" BusOut mleds(LED1, LED2, LED3, LED4); AnalogIn acelX (p20); //Al eje X del acelerometro AnalogIn acelY (p19); //Al eje Y del acelerometro AnalogIn acelZ (p18); //Al eje Z del acelerometro Serial pc(USBTX, USBRX); // tx, rx a 9600 int x, y, z; // mediciones en grados float oneG_x, oneG_y, oneG_z; // medidadas a operar float zeroG_x, zeroG_y, zeroG_z; // medidas a operar float med_x, med_y, med_z; // medidas adquiridas // lee los pins analogicos 64 valores trabajando a 3.3v void DoMeasureXYZ() { // a 90 2,45v a 0 1,65v a -90 0,85v int j; for (j=0;j<64;j++) { wait_ms(1); med_x += acelX.read_u16(); //lecturas de 12 bits wait_ms(1); med_y += acelY.read_u16(); wait_ms(1); med_z += acelZ.read_u16(); } med_x = med_x/64; med_y = med_y/64; med_z = med_z/64; } void Read_Angles() { float div_x, x_rad, div_y, y_rad, div_z, z_rad ; DoMeasureXYZ(); div_x = (med_x-zeroG_x) / (oneG_x-zeroG_x); // med_G/sensibil x_rad = asin( div_x ); // x angulo en radians x = (x_rad*180) / 3.14; // x angulo en grados div_y = (med_y-zeroG_y) / (oneG_y-zeroG_y); // med_G/sensibil y_rad = asin( div_y ); // y angulo en radians y = (y_rad*180) / 3.14; // y angulo en grados div_z = (med_z-zeroG_z) / (oneG_z-zeroG_z); // med_G/sensibil z_rad = asin( div_z ); // z angulo en radians z = (z_rad*180) / 3.14; // z angulo en grados } void calibrar() { printf("1.-Acelerometro posicionado paralelo al suelo \n"); printf ("Pulsa una tecla para seguir:\n"); while (!pc.getc()); // espera mientras no pulses una tecla // Medir 0g en eje X y eje Y y -1g para eje Z. DoMeasureXYZ(); zeroG_x += med_x; // 0g 165mV zeroG_y += med_y; // 0g 165mV oneG_z += med_z; //-1g 85mV printf("2.- Acelerometro con eje X vertical flecha hacia arriba \n"); printf ("Pulsa una tecla para seguir:\n"); while (!pc.getc()); // espera mientras no pulses una tecla // para medir -1g en eje X y 0g en eje Z. El eje y es 0g ya de antes DoMeasureXYZ(); oneG_x += med_x; // -1g zeroG_y += med_y; // 0g zeroG_z += med_z; // 0g printf ("3.- Acelerometro con eje Y vertical flecha hacia arriba \n"); printf ("Pulsa una tecla para seguir:\n"); while (!pc.getc()); // espera mientras no pulses una tecla // para medir -1G en eje Y Los otros siguen valeindo 0g DoMeasureXYZ(); zeroG_x += med_x; // 0g oneG_y += med_y; // -1g zeroG_z += med_z; // 0g // Igualar valores medidos a 0g zeroG_x = zeroG_x/2; zeroG_y = zeroG_y/2; zeroG_z = zeroG_z/2; printf ("A 0g x %.3f y %.3f z %.3f \n",zeroG_x, zeroG_y, zeroG_z); printf ("A -1g x %.3f y %.3f z %.3f \n",oneG_x, oneG_y, oneG_z); } int main() { calibrar(); // Primero calibrar: Z plano X e Y flecha arriba while (1) { Read_Angles(); // Transformamos lecturas a angulos printf ("----------------GRADOS-------\n"); printf ("Angulo en eje X %d \n",x); printf ("Angulo en eje Y %d \n",y); printf ("Angulo en eje Z %d \n",z); mleds = (x+y+z)/8; printf ("-------------------------------\n"); printf ("Pulsa una tecla para seguir \n"); while (!pc.getc()); // espera mientras no pulses una tecla } }