jaume bros
/
mma7260
Funcionamiento acelerómetro mma7260
Diff: main.cpp
- Revision:
- 0:1458daeb68fc
diff -r 000000000000 -r 1458daeb68fc main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jan 03 22:47:53 2011 +0000 @@ -0,0 +1,93 @@ +/* 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 + } +}