Rohan-Code to measure the tilt of the ADXL355 using COG-AD4050.
Dependencies: include ADXL355 ttmath
main.cpp@0:e551dfd13154, 2018-08-21 (annotated)
- Committer:
- RGurav
- Date:
- Tue Aug 21 13:26:31 2018 +0000
- Revision:
- 0:e551dfd13154
- Child:
- 1:ba6c18cce219
Rohan - COG4050 and ADXL355 Tilt sensing
Who changed what in which revision?
User | Revision | Line number | New 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 | } |