Rohan-Code to measure the tilt of the ADXL355 using COG-AD4050.
Dependencies: include ADXL355 ttmath
Diff: main.cpp
- Revision:
- 1:ba6c18cce219
- Parent:
- 0:e551dfd13154
- Child:
- 2:13377441fbd8
diff -r e551dfd13154 -r ba6c18cce219 main.cpp --- a/main.cpp Tue Aug 21 13:26:31 2018 +0000 +++ b/main.cpp Tue Sep 04 11:53:19 2018 +0000 @@ -1,5 +1,6 @@ /* -Created on: 15/08/2018 + +Created on: 27/08/2018 Author: Rohan Gurav Code: Use the following code to read the ADXL355 values connected to the SPI channel @@ -8,17 +9,15 @@ */ #include "mbed.h" #include "ADXL355.h" -#include "complex.h" - Serial pc(USBTX, USBRX); int axis = 0; ADXL355 accl(SPI1_CS0, SPI1_MOSI, SPI1_MISO, SPI1_SCLK); // PMOD port -float single_axis(float x); -float dual_axis(float x, float y); -float tri_axis(float x, float y, float z); +float single_axis(float a); +float dual_axis(float a, float b); +float tri_axis(float a, float b, float c); int main() { @@ -27,112 +26,134 @@ pc.printf("GET device ID\r\n"); accl.reset(); - uint8_t d; + uint8_t d, ad, mems, device, rev; wait(0.2); - d=accl.read_reg(accl.DEVID_AD); - pc.printf("AD id = %x \r\n",d); - - d=accl.read_reg(accl.DEVID_MST); - pc.printf("MEMS id = %x \r\n",d); - - d=accl.read_reg(accl.PARTID); - pc.printf("device id = %x \r\n",d); - - d=accl.read_reg(accl.REVID); - pc.printf("revision id = %x \r\n",d); + ad = accl.read_reg(accl.DEVID_AD); + mems = accl.read_reg(accl.DEVID_MST); + device = accl.read_reg(accl.PARTID); + rev = accl.read_reg(accl.REVID); pc.printf("GET device data [x, y, z, t] \r\n"); + accl.set_power_ctl_reg(accl.MEASUREMENT); - d=accl.read_reg(accl.POWER_CTL); pc.printf("power control on measurement mode = %x \r\n",d); float x,y,z,t; + float a,b,c; - double tilt_x, tilt_y,tilt_z; + double tilt_x, tilt_y, tilt_z; + double tilt_2x, tilt_2y; + double tilt_3x, tilt_3y, tilt_3z; + + //pc.printf("Enter no of axis for angle calculation (1/2/3):\r\n"); + //pc.scanf("%d",&axis); + axis = 4; + pc.printf("||x_accl||y_accl||z_accl||x_tilt||y_tilt||z_tilt||\r\n"); + + wait(1); - pc.printf("Enter no of axis for angle calculation (1/2/3):\r\n"); - pc.scanf("%d",&axis); - - pc.printf("||x_accl||y_accl||z_accl||Temp||x_tilt||y_tilt||z_tilt||"); - + //Device ID display + pc.printf("AD id = %x MEMS id = %x device=%x revision=%x \r\n", ad, mems, device, rev); + /*The following part is used to perform 2's complemient and then display the data*/ while (1) { - + + //*accl.axis355_sens + x = (accl.convert(accl.scanx())); + y = (accl.convert(accl.scany())); + z = (accl.convert(accl.scanz())); + t = 25+float(accl.scant()-1852)/(-9.05); + + //pc.printf("%d \t %d \t %d \r\n", accl.scanx(), accl.scany(), accl.scanz()); + //pc.printf("%f \t %f \t %f \r\n", x, y, z); + //pc.printf("%f\r\n", asin(0.2)*57.2957); + + tilt_x = single_axis(x); + tilt_y = single_axis(y); + tilt_z = single_axis(z); + + tilt_2x = dual_axis(x,z); + tilt_2y = dual_axis(y,x); + tilt_2y = tilt_2y * (-1); - x = accl.convert(accl.scanx())*accl.axis355_sens; - y = accl.convert(accl.scany())*accl.axis355_sens; - z = accl.convert(accl.scanz())*accl.axis355_sens; - t = 25+float(accl.scant()-1852)/(-9.05); - + tilt_3x = tri_axis(x,y,z); + tilt_3y = tri_axis(y,x,z); + tilt_3z = sqrt((x*x)+(y*y)); + tilt_3z = atan(tilt_3z/z); + tilt_3z = floor(tilt_3z*100)/100; + if (axis==1) { - tilt_x = single_axis(x); - tilt_y = single_axis(y); - tilt_z = single_axis(z); - - pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x,y,z,tilt_x,tilt_y,tilt_z); - wait(0.5); - } + pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x, y, z, tilt_x, tilt_y, tilt_z); + //pc.printf("%f", accl.axis355_sens); + wait(1.0); } if (axis==2) { - tilt_x = dual_axis(x,z); - tilt_y = dual_axis(y,z); - - pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x,y,z,tilt_x,tilt_y); + pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x*accl.axis355_sens, y*accl.axis355_sens, z*accl.axis355_sens, tilt_x, tilt_y); wait(0.5); } if (axis==3) { - tilt_x = tri_axis(x,y,z); - tilt_y = tri_axis(y,x,z); - - tilt_z = atan((sqrt((x*x)+(y*y)))/z); - tilt_z = floor(tilt_z*100)/100; - - pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x,y,z,tilt_x,tilt_y, tilt_z); - wait(0.5); + pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x, y, z, tilt_x, tilt_y, tilt_z); + wait(1.0); + } + + if (axis == 4) + { + pc.printf("axis|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f|%0.2f| \r\n" , x*accl.axis355_sens, y*accl.axis355_sens, z*accl.axis355_sens, tilt_x, tilt_y, tilt_z, tilt_2x, tilt_2y, tilt_3x, tilt_3y, tilt_3z); + wait(1.0); } } } - +//the addition of accl should be equal to 1 i.e. ( x+y+z = 1 ) -//single axis - float single_axis(float x) +//single axis arcsin (0.2) + float single_axis(float a) { + a = a*accl.axis355_sens; + + if (a>1.0f) + { a = 1; + } + else if (a<-1) + { a = -1; + } + else + { a = a; + } + double Y; - //int a=4; - Y = floor(asin(x)*100)/100; - //void arm_cmplx_mag_f32 (double *Y, double *X, int32_t a); - - Y = floor(((57.2957f)*(Y))*100)/100; + + Y = asin(a); + Y = floor((57.2957f*Y)*100)/100; return Y; } -//Dual Axis - float dual_axis(float x, float y) +//Dual Axis + float dual_axis(float a, float b) { double Y; - Y = 57.2957f * (atan(x/y)); + Y = 57.2957f * (atan(a/b)); Y = floor(Y*100)/100; return Y; } //Triaxial - float tri_axis(float x, float y, float z) + float tri_axis(float a, float b, float c) { double Y; double X; - X = (x)/(sqrt((y*y)+(z*z))); + X = (a)/(sqrt((b*b)+(c*c))); Y= atan(X); - Y = floor(Y*57.2957*100)/100; + Y = floor(Y*57.2957f*100)/100; return Y; }