COG4050 and ADXL355 Tilt sensing

Dependencies:   ADXL355 include ttmath

Committer:
RGurav
Date:
Tue Aug 21 13:26:31 2018 +0000
Revision:
0:e551dfd13154
Rohan - COG4050 and ADXL355 Tilt sensing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RGurav 0:e551dfd13154 1 /*
RGurav 0:e551dfd13154 2 Created on: 15/08/2018
RGurav 0:e551dfd13154 3 Author: Rohan Gurav
RGurav 0:e551dfd13154 4
RGurav 0:e551dfd13154 5 Code: Use the following code to read the ADXL355 values connected to the SPI channel
RGurav 0:e551dfd13154 6 of the EV-COG4050-Expander board port0. Check the readme.md for connection info
RGurav 0:e551dfd13154 7
RGurav 0:e551dfd13154 8 */
RGurav 0:e551dfd13154 9 #include "mbed.h"
RGurav 0:e551dfd13154 10 #include "ADXL355.h"
RGurav 0:e551dfd13154 11 #include "complex.h"
RGurav 0:e551dfd13154 12
RGurav 0:e551dfd13154 13
RGurav 0:e551dfd13154 14 Serial pc(USBTX, USBRX);
RGurav 0:e551dfd13154 15 int axis = 0;
RGurav 0:e551dfd13154 16
RGurav 0:e551dfd13154 17 ADXL355 accl(SPI1_CS0, SPI1_MOSI, SPI1_MISO, SPI1_SCLK); // PMOD port
RGurav 0:e551dfd13154 18
RGurav 0:e551dfd13154 19 float single_axis(float x);
RGurav 0:e551dfd13154 20 float dual_axis(float x, float y);
RGurav 0:e551dfd13154 21 float tri_axis(float x, float y, float z);
RGurav 0:e551dfd13154 22
RGurav 0:e551dfd13154 23 int main()
RGurav 0:e551dfd13154 24 {
RGurav 0:e551dfd13154 25 pc.baud(9600);
RGurav 0:e551dfd13154 26 pc.printf("SPI ADXL355 and ADXL357 Demo\r\n");
RGurav 0:e551dfd13154 27 pc.printf("GET device ID\r\n");
RGurav 0:e551dfd13154 28
RGurav 0:e551dfd13154 29 accl.reset();
RGurav 0:e551dfd13154 30 uint8_t d;
RGurav 0:e551dfd13154 31
RGurav 0:e551dfd13154 32 wait(0.2);
RGurav 0:e551dfd13154 33
RGurav 0:e551dfd13154 34 d=accl.read_reg(accl.DEVID_AD);
RGurav 0:e551dfd13154 35 pc.printf("AD id = %x \r\n",d);
RGurav 0:e551dfd13154 36
RGurav 0:e551dfd13154 37 d=accl.read_reg(accl.DEVID_MST);
RGurav 0:e551dfd13154 38 pc.printf("MEMS id = %x \r\n",d);
RGurav 0:e551dfd13154 39
RGurav 0:e551dfd13154 40 d=accl.read_reg(accl.PARTID);
RGurav 0:e551dfd13154 41 pc.printf("device id = %x \r\n",d);
RGurav 0:e551dfd13154 42
RGurav 0:e551dfd13154 43 d=accl.read_reg(accl.REVID);
RGurav 0:e551dfd13154 44 pc.printf("revision id = %x \r\n",d);
RGurav 0:e551dfd13154 45
RGurav 0:e551dfd13154 46 pc.printf("GET device data [x, y, z, t] \r\n");
RGurav 0:e551dfd13154 47 accl.set_power_ctl_reg(accl.MEASUREMENT);
RGurav 0:e551dfd13154 48
RGurav 0:e551dfd13154 49 d=accl.read_reg(accl.POWER_CTL);
RGurav 0:e551dfd13154 50 pc.printf("power control on measurement mode = %x \r\n",d);
RGurav 0:e551dfd13154 51
RGurav 0:e551dfd13154 52 float x,y,z,t;
RGurav 0:e551dfd13154 53
RGurav 0:e551dfd13154 54 double tilt_x, tilt_y,tilt_z;
RGurav 0:e551dfd13154 55
RGurav 0:e551dfd13154 56 pc.printf("Enter no of axis for angle calculation (1/2/3):\r\n");
RGurav 0:e551dfd13154 57 pc.scanf("%d",&axis);
RGurav 0:e551dfd13154 58
RGurav 0:e551dfd13154 59 pc.printf("||x_accl||y_accl||z_accl||Temp||x_tilt||y_tilt||z_tilt||");
RGurav 0:e551dfd13154 60
RGurav 0:e551dfd13154 61 /*The following part is used to perform 2's complemient and then display the data*/
RGurav 0:e551dfd13154 62 while (1)
RGurav 0:e551dfd13154 63 {
RGurav 0:e551dfd13154 64
RGurav 0:e551dfd13154 65
RGurav 0:e551dfd13154 66 x = accl.convert(accl.scanx())*accl.axis355_sens;
RGurav 0:e551dfd13154 67 y = accl.convert(accl.scany())*accl.axis355_sens;
RGurav 0:e551dfd13154 68 z = accl.convert(accl.scanz())*accl.axis355_sens;
RGurav 0:e551dfd13154 69 t = 25+float(accl.scant()-1852)/(-9.05);
RGurav 0:e551dfd13154 70
RGurav 0:e551dfd13154 71 if (axis==1)
RGurav 0:e551dfd13154 72 {
RGurav 0:e551dfd13154 73 tilt_x = single_axis(x);
RGurav 0:e551dfd13154 74 tilt_y = single_axis(y);
RGurav 0:e551dfd13154 75 tilt_z = single_axis(z);
RGurav 0:e551dfd13154 76
RGurav 0:e551dfd13154 77 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);
RGurav 0:e551dfd13154 78 wait(0.5);
RGurav 0:e551dfd13154 79 }
RGurav 0:e551dfd13154 80
RGurav 0:e551dfd13154 81 if (axis==2)
RGurav 0:e551dfd13154 82 {
RGurav 0:e551dfd13154 83 tilt_x = dual_axis(x,z);
RGurav 0:e551dfd13154 84 tilt_y = dual_axis(y,z);
RGurav 0:e551dfd13154 85
RGurav 0:e551dfd13154 86 pc.printf("||%0.2f||%0.2f||%0.2f||%0.2f||%0.2f|| \r\n" , x,y,z,tilt_x,tilt_y);
RGurav 0:e551dfd13154 87 wait(0.5);
RGurav 0:e551dfd13154 88 }
RGurav 0:e551dfd13154 89
RGurav 0:e551dfd13154 90 if (axis==3)
RGurav 0:e551dfd13154 91 {
RGurav 0:e551dfd13154 92 tilt_x = tri_axis(x,y,z);
RGurav 0:e551dfd13154 93 tilt_y = tri_axis(y,x,z);
RGurav 0:e551dfd13154 94
RGurav 0:e551dfd13154 95 tilt_z = atan((sqrt((x*x)+(y*y)))/z);
RGurav 0:e551dfd13154 96 tilt_z = floor(tilt_z*100)/100;
RGurav 0:e551dfd13154 97
RGurav 0:e551dfd13154 98 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);
RGurav 0:e551dfd13154 99 wait(0.5);
RGurav 0:e551dfd13154 100 }
RGurav 0:e551dfd13154 101
RGurav 0:e551dfd13154 102 }
RGurav 0:e551dfd13154 103
RGurav 0:e551dfd13154 104 }
RGurav 0:e551dfd13154 105
RGurav 0:e551dfd13154 106
RGurav 0:e551dfd13154 107 //single axis
RGurav 0:e551dfd13154 108 float single_axis(float x)
RGurav 0:e551dfd13154 109 {
RGurav 0:e551dfd13154 110 double Y;
RGurav 0:e551dfd13154 111 //int a=4;
RGurav 0:e551dfd13154 112 Y = floor(asin(x)*100)/100;
RGurav 0:e551dfd13154 113 //void arm_cmplx_mag_f32 (double *Y, double *X, int32_t a);
RGurav 0:e551dfd13154 114
RGurav 0:e551dfd13154 115 Y = floor(((57.2957f)*(Y))*100)/100;
RGurav 0:e551dfd13154 116 return Y;
RGurav 0:e551dfd13154 117
RGurav 0:e551dfd13154 118 }
RGurav 0:e551dfd13154 119
RGurav 0:e551dfd13154 120 //Dual Axis
RGurav 0:e551dfd13154 121 float dual_axis(float x, float y)
RGurav 0:e551dfd13154 122 {
RGurav 0:e551dfd13154 123 double Y;
RGurav 0:e551dfd13154 124 Y = 57.2957f * (atan(x/y));
RGurav 0:e551dfd13154 125 Y = floor(Y*100)/100;
RGurav 0:e551dfd13154 126 return Y;
RGurav 0:e551dfd13154 127 }
RGurav 0:e551dfd13154 128
RGurav 0:e551dfd13154 129 //Triaxial
RGurav 0:e551dfd13154 130 float tri_axis(float x, float y, float z)
RGurav 0:e551dfd13154 131 {
RGurav 0:e551dfd13154 132 double Y;
RGurav 0:e551dfd13154 133 double X;
RGurav 0:e551dfd13154 134 X = (x)/(sqrt((y*y)+(z*z)));
RGurav 0:e551dfd13154 135 Y= atan(X);
RGurav 0:e551dfd13154 136 Y = floor(Y*57.2957*100)/100;
RGurav 0:e551dfd13154 137 return Y;
RGurav 0:e551dfd13154 138 }