Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ADXL335_3axis_Accel by
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 }
Generated on Tue Aug 23 2022 23:28:43 by
1.7.2
