Xavier GERONIMI / Mbed 2 deprecated ADXL335_3axe_accel_etallonage

Dependencies:   mbed mbed

Fork of ADXL335_3axis_Accel by SHIVAM TRIPATHI

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*****************************************
00002  ****** 3-axis Accelerometer ADXL335 *****  
00003  *****************************************/
00004 
00005 #include "mbed.h"
00006 
00007 #define ETALONNAGE 100
00008 #define VERIFICATION 100
00009 #define MESURE 500
00010 //#define LIMITE 65535 * 1 / 1000
00011 #define LIMITE 4095 * 1 / 1000
00012 #define LSB 14.365
00013 
00014 Timer timer;
00015 
00016 Serial pc(SERIAL_TX, SERIAL_RX);
00017 
00018 AnalogIn acc_x(A0);     // Output of X-axis
00019 AnalogIn acc_y(A1);     // Output of y-axis
00020 AnalogIn acc_z(A2);     // Output of z-axis
00021 DigitalOut led(LED1);   // output of LED
00022 
00023 void mesure_zero_acceleration(int *zero_x, int *zero_y, int *zero_z)
00024 {
00025     float fx, fy, fz;
00026     float f_etalonnage = (float)ETALONNAGE;
00027     int x, y, z;
00028     int c, k;
00029     
00030     for (c = 0; c < ETALONNAGE; c++)
00031     {
00032            x = 0;
00033            y = 0;
00034            z = 0;
00035            for (k = 0; k < MESURE; k++)
00036            {
00037               x += acc_x.read_u16() >> 4;
00038               y += acc_y.read_u16() >> 4;
00039               z += acc_z.read_u16() >> 4;
00040            }
00041            *zero_x += x;
00042            *zero_y += y;
00043            *zero_z += z;
00044     }
00045     fx = *zero_x / f_etalonnage;
00046     fy = *zero_y / f_etalonnage;
00047     fz = *zero_z / f_etalonnage;
00048     *zero_x /= ETALONNAGE;
00049     *zero_y /= ETALONNAGE;
00050     *zero_z /= ETALONNAGE;
00051     
00052     if ((fx - *zero_x) >= 0.5) *zero_x ++;
00053     if ((fy - *zero_y) >= 0.5) *zero_y ++;
00054     if ((fz - *zero_z) >= 0.5) *zero_z ++;
00055     
00056     pc.printf("AX_0;AY_0;AZ_0\n");
00057     pc.printf("%d;%d;%d\n", *zero_x, *zero_y, *zero_z);
00058 }
00059 
00060 void verif_zero_acceleration(int zero_x, int zero_y, int zero_z)
00061 {
00062     int x, y, z;
00063     float fx, fy, fz;
00064     float f_mesure = (float)MESURE;
00065     int c, k;
00066     
00067     for (c = 0; c < VERIFICATION; c++)
00068     {
00069         x = 0; y = 0; z = 0;
00070         
00071         for (k = 0; k < MESURE; k++)
00072         {
00073             x += ( acc_x.read_u16() >> 4 );
00074             y += ( acc_y.read_u16() >> 4 );
00075             z += ( acc_z.read_u16() >> 4 );
00076         }
00077         
00078         x -= zero_x;
00079         y -= zero_y;
00080         z -= zero_z;
00081         
00082         fx = x / f_mesure;
00083         fy = y / f_mesure;
00084         fz = z / f_mesure;
00085         x /= MESURE;
00086         y /= MESURE;
00087         z /= MESURE;
00088         
00089         if (fx < 0)
00090         {
00091             if ( (fx - x) <= - 0.5 ) x--;
00092         }else
00093             if ( (fx - x) >= 0.5 ) x++;
00094         if (fy < 0)
00095         {
00096             if ( (fy - y) <= - 0.5 ) y--;
00097         }else
00098             if ( (fy - y) >= 0.5 ) y++;
00099         if (fz < 0)
00100         {
00101             if ( (fz - z) <= - 0.5 ) z--;
00102         }else
00103             if ( (fz - z) >= 0.5 ) z++;
00104         
00105         if( abs (x) > LIMITE )
00106         {
00107              pc.printf("Etalonnage en X manque! Ecart = %d\n", abs(x) - LIMITE);
00108              exit(EXIT_FAILURE);
00109         }
00110         if( abs (y) > LIMITE > LIMITE )
00111         {
00112              pc.printf("Etalonnage en Y manque! Ecart = %d\n", abs(y) - LIMITE);
00113              exit(EXIT_FAILURE);
00114         }
00115         if( abs (z) > LIMITE )
00116         {
00117             pc.printf("Etalonnage en Z manque! Ecart = %d\n", abs(z) - LIMITE);
00118             exit(EXIT_FAILURE);
00119         }
00120     }
00121 }
00122 
00123 int main() {
00124     int ax, ay, az;                            // Store the acceleration
00125     /*
00126     float vx = 0, vy = 0, vz = 0;              // Store the speed
00127     float x = 0, y = 0, z = 0;                 // Store the position
00128     */
00129     float fx, fy, fz;
00130     float f_mesure = (float)MESURE;
00131     int zero_x = 0, zero_y = 0, zero_z = 0; // 0 acceleration
00132     float t;                                // Measurement Time
00133     int i, cpt = 0;                         // Counters
00134     
00135     wait(2);
00136     
00137     timer.start();
00138     
00139     pc.baud(9600);
00140     
00141     mesure_zero_acceleration(&zero_x, &zero_y, &zero_z);
00142     //verif_zero_acceleration(zero_x, zero_y, zero_z);
00143     
00144     led = 1;
00145     
00146     pc.printf("Temps d'acquisition;AX;AY;AZ;Numero d'echantillon\n");
00147     //pc.printf("AX;AY;AZ;VX;VY;VZ;X;Y;Z\n");
00148     
00149     while(1) {
00150         cpt ++;
00151         ax = 0; ay = 0; az = 0;
00152         //timer.start();
00153         for (i = 0; i < MESURE; i++)
00154         {
00155             ax += ( acc_x.read_u16() >> 4 );           // Reads X-axis value (on 16 bits converted to 12)
00156             ay += ( acc_y.read_u16() >> 4 );           // Reads Y-axis value
00157             az += ( acc_z.read_u16() >> 4 );           // Reads Z-axis value
00158         }
00159         //timer.stop();
00160         t = timer.read();
00161         //timer.reset();
00162         
00163         ax -= zero_x;
00164         ay -= zero_y;
00165         az -= zero_z;
00166     
00167         fx = ax / f_mesure;
00168         fy = ay / f_mesure;
00169         fz = az / f_mesure;
00170         ax /= MESURE;
00171         ay /= MESURE;
00172         az /= MESURE;
00173         
00174         if (fx < 0)
00175         {
00176             if ( (fx - ax) <= - 0.5 ) ax--;
00177         }else
00178             if ( (fx - ax) >= 0.5 ) ax++;
00179         if (fy < 0)
00180         {
00181             if ( (fy - ay) <= - 0.5 ) ay--;
00182         }else
00183             if ( (fy - ay) >= 0.5 ) ay++;
00184         if (fz < 0)
00185         {
00186             if ( (fz - az) <= - 0.5 ) az--;
00187         }else
00188             if ( (fz - az) >= 0.5 ) az++;
00189     
00190         if(ax == -1 || ax == 1) ax = 0;
00191         if(ay == -1 || ay == 1) ay = 0;
00192         if(az == -1 || az == 1) az = 0;
00193     
00194         pc.printf("%f;%d;%d;%d;%d\n", t, ax, ay, az, cpt);
00195         
00196         /*
00197         
00198         vx += (ax * t * LSB);
00199         vy += (ay * t * LSB);
00200         vz += (az * t * LSB);
00201         
00202         x += (vx * t * LSB);
00203         y += (vy * t * LSB);
00204         z += (vz * t * LSB);
00205         
00206         if (cpt % 16 == 0) pc.printf("%d;%d;%d;%d;%d;%d;%d;%d;%d\n", ax, ay, az, vx, vy, vz, x, y, z);   
00207         
00208         */    
00209     }
00210 }