Fixed algorithm to read 3 bytes of accelerometer data registers
Fork of COG4050_adxl355_adxl357 by
main.cpp@9:6c803986dbde, 2018-09-03 (annotated)
- Committer:
- vtoffoli
- Date:
- Mon Sep 03 10:39:56 2018 +0000
- Revision:
- 9:6c803986dbde
- Parent:
- 8:9e6ead2ee8d7
- Child:
- 10:e054891b3598
update 2018_09_03;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
APS_Lab | 0:74a0756399ff | 1 | #include "mbed.h" |
vtoffoli | 8:9e6ead2ee8d7 | 2 | #include <math.h> |
vtoffoli | 4:23b53636b576 | 3 | #include <inttypes.h> |
vtoffoli | 2:14dc1ec57f3b | 4 | #include "ADXL355.h" |
vtoffoli | 8:9e6ead2ee8d7 | 5 | #include "CALIBRATION.h" |
vtoffoli | 2:14dc1ec57f3b | 6 | |
vtoffoli | 2:14dc1ec57f3b | 7 | Serial pc(USBTX, USBRX); |
vtoffoli | 2:14dc1ec57f3b | 8 | |
vtoffoli | 7:5aaa09c40283 | 9 | ADXL355 accl(SPI1_CS0, SPI1_MOSI, SPI1_MISO, SPI1_SCLK); // PMOD port |
vtoffoli | 8:9e6ead2ee8d7 | 10 | CALIBRATION test; |
vtoffoli | 9:6c803986dbde | 11 | #define pi 3.14159265; |
vtoffoli | 8:9e6ead2ee8d7 | 12 | float angle[3][12] = { {-55, -125, -147, 33, -128, 52, 0, 0, 0, 0, 0, 0}, |
vtoffoli | 8:9e6ead2ee8d7 | 13 | {6, -6, 20, -20, -69, 69, 0, 0, 0, 0, 0, 0 }, |
vtoffoli | 8:9e6ead2ee8d7 | 14 | {1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}}; |
vtoffoli | 9:6c803986dbde | 15 | float meas[3][12] = { {-0.09, 0.16, -0.31, 0.37, 0.91, -0.88}, |
vtoffoli | 8:9e6ead2ee8d7 | 16 | {-0.78, 0.81, -0.46, 0.49, -0.28, 0.32}, |
vtoffoli | 8:9e6ead2ee8d7 | 17 | {0.54, -0.55, -0.78, 0.76, -0.20, 0.20}}; |
vtoffoli | 2:14dc1ec57f3b | 18 | int main(){ |
vtoffoli | 2:14dc1ec57f3b | 19 | pc.baud(9600); |
vtoffoli | 2:14dc1ec57f3b | 20 | pc.printf("SPI ADXL355 and ADXL357 Demo\n"); |
vtoffoli | 2:14dc1ec57f3b | 21 | pc.printf("GET device ID\n"); |
vtoffoli | 4:23b53636b576 | 22 | accl.reset(); |
vtoffoli | 4:23b53636b576 | 23 | uint8_t d; |
vtoffoli | 7:5aaa09c40283 | 24 | d=accl.read_reg(accl.DEVID_AD); |
vtoffoli | 7:5aaa09c40283 | 25 | pc.printf("AD id = %x \r\n",d); |
vtoffoli | 7:5aaa09c40283 | 26 | d=accl.read_reg(accl.DEVID_MST); |
vtoffoli | 7:5aaa09c40283 | 27 | pc.printf("MEMS id = %x \r\n",d); |
vtoffoli | 7:5aaa09c40283 | 28 | d=accl.read_reg(accl.PARTID); |
vtoffoli | 7:5aaa09c40283 | 29 | pc.printf("device id = %x \r\n",d); |
vtoffoli | 7:5aaa09c40283 | 30 | d=accl.read_reg(accl.REVID); |
vtoffoli | 7:5aaa09c40283 | 31 | pc.printf("revision id = %x \r\n",d); |
vtoffoli | 4:23b53636b576 | 32 | pc.printf("GET device data [x, y, z, t] \r\n"); |
vtoffoli | 4:23b53636b576 | 33 | accl.set_power_ctl_reg(accl.MEASUREMENT); |
vtoffoli | 4:23b53636b576 | 34 | d=accl.read_reg(accl.POWER_CTL); |
vtoffoli | 4:23b53636b576 | 35 | pc.printf("power control on measurement mode = %x \r\n",d); |
vtoffoli | 9:6c803986dbde | 36 | float x, y, z, w, k, h; |
vtoffoli | 6:45d2393ef468 | 37 | float t; |
vtoffoli | 7:5aaa09c40283 | 38 | // save data info a file |
vtoffoli | 9:6c803986dbde | 39 | pc.printf("x \t y \t z \t t\r\n"); |
vtoffoli | 8:9e6ead2ee8d7 | 40 | for(int i=0; i<100; i++) { |
vtoffoli | 7:5aaa09c40283 | 41 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 7:5aaa09c40283 | 42 | y = accl.convert(accl.scany())*accl.axis355_sens; |
vtoffoli | 7:5aaa09c40283 | 43 | z = accl.convert(accl.scanz())*accl.axis355_sens; |
vtoffoli | 6:45d2393ef468 | 44 | t = 25+float(accl.scant()-1852)/(-9.05); |
vtoffoli | 9:6c803986dbde | 45 | pc.printf("%f \t %f \t %f \t %f \r\n" , x,y,z,t); |
vtoffoli | 9:6c803986dbde | 46 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 47 | // test the calibration procedure |
vtoffoli | 9:6c803986dbde | 48 | test.matrix_reset(); |
vtoffoli | 9:6c803986dbde | 49 | pc.printf("Start calibration test (y/n)?\r\n"); |
vtoffoli | 9:6c803986dbde | 50 | char calib = pc.getc(); |
vtoffoli | 9:6c803986dbde | 51 | switch(calib){ |
vtoffoli | 9:6c803986dbde | 52 | case 'y': pc.printf("Select the calibration procedure: 2point or 4point? (2/4)\r\n"); |
vtoffoli | 9:6c803986dbde | 53 | char point = pc.getc(); |
vtoffoli | 9:6c803986dbde | 54 | if(point == '2'){ |
vtoffoli | 9:6c803986dbde | 55 | pc.printf("Place the device verticaly to obtain x value close to -1, press any character to start the aquisition \r\n"); |
vtoffoli | 9:6c803986dbde | 56 | pc.getc(); |
vtoffoli | 9:6c803986dbde | 57 | x = accl.convert(accl.scanx())*accl.axis355_sens; y = x; |
vtoffoli | 9:6c803986dbde | 58 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 59 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 60 | if (x<y) {y=x;} |
vtoffoli | 9:6c803986dbde | 61 | pc.printf("%f \t %f \r\n" , x,y); |
vtoffoli | 9:6c803986dbde | 62 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 63 | pc.printf("Place the device verticaly to obtain x value close to +1, press any character to start the aquisition \r\n"); |
vtoffoli | 9:6c803986dbde | 64 | pc.getc(); |
vtoffoli | 9:6c803986dbde | 65 | x = accl.convert(accl.scanx())*accl.axis355_sens; z = x; |
vtoffoli | 9:6c803986dbde | 66 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 67 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 68 | if (x>z) {z=x;} |
vtoffoli | 9:6c803986dbde | 69 | pc.printf("%f \t %f \r\n" , x,z); |
vtoffoli | 9:6c803986dbde | 70 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 71 | float meas[] = {z, y}; |
vtoffoli | 9:6c803986dbde | 72 | test.convert_2p(meas, 0); |
vtoffoli | 9:6c803986dbde | 73 | pc.printf("The input for the calibration process are: %f \t %f \r\n" , meas[0], meas[1]); |
vtoffoli | 9:6c803986dbde | 74 | pc.printf("The result (Sensibility and Bias) is: %f \t %f \r\n" , test.adxl355_sensitivity.S[0], test.adxl355_sensitivity.B[0]); |
vtoffoli | 9:6c803986dbde | 75 | } |
vtoffoli | 9:6c803986dbde | 76 | else if(point == '4'){ |
vtoffoli | 9:6c803986dbde | 77 | pc.printf("Place the device verticaly to obtain x value close to 0, press any character to start the aquisition \r\n"); |
vtoffoli | 9:6c803986dbde | 78 | pc.getc(); |
vtoffoli | 9:6c803986dbde | 79 | x = accl.convert(accl.scanx())*accl.axis355_sens; y = x; |
vtoffoli | 9:6c803986dbde | 80 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 81 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 82 | y=(y+x)/2; |
vtoffoli | 9:6c803986dbde | 83 | pc.printf("%f \t %f \r\n" , x,y); |
vtoffoli | 9:6c803986dbde | 84 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 85 | pc.printf("Rotate the device to obtain x value close to -1, press any character to start the aquisition \r\n"); |
vtoffoli | 9:6c803986dbde | 86 | pc.getc(); |
vtoffoli | 9:6c803986dbde | 87 | x = accl.convert(accl.scanx())*accl.axis355_sens; z = x; |
vtoffoli | 9:6c803986dbde | 88 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 89 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 90 | if (x<z) {z=x;} |
vtoffoli | 9:6c803986dbde | 91 | pc.printf("%f \t %f \r\n" , x,z); |
vtoffoli | 9:6c803986dbde | 92 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 93 | pc.printf("Place the device verticaly to obtain x value close to 0, press any character to start the aquisition \r\n"); |
vtoffoli | 9:6c803986dbde | 94 | pc.getc(); |
vtoffoli | 9:6c803986dbde | 95 | x = accl.convert(accl.scanx())*accl.axis355_sens; w = x; |
vtoffoli | 9:6c803986dbde | 96 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 97 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 98 | w=(w+x)/2; |
vtoffoli | 9:6c803986dbde | 99 | pc.printf("%f \t %f \r\n" , x,w); |
vtoffoli | 9:6c803986dbde | 100 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 101 | pc.printf("Rotate the device verticaly to obtain x value close to +1, press any character to start the aquisition \r\n"); |
vtoffoli | 9:6c803986dbde | 102 | pc.getc(); |
vtoffoli | 9:6c803986dbde | 103 | x = accl.convert(accl.scanx())*accl.axis355_sens; k = x; |
vtoffoli | 9:6c803986dbde | 104 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 105 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 106 | if (x>k) {k=x;} |
vtoffoli | 9:6c803986dbde | 107 | pc.printf("%f \t %f \r\n" , x,k); |
vtoffoli | 9:6c803986dbde | 108 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 109 | float meas[] = {y, z, w, k}; |
vtoffoli | 9:6c803986dbde | 110 | test.convert_4p(meas, 0); |
vtoffoli | 9:6c803986dbde | 111 | pc.printf("The input for the calibration process are: %f \t %f \t %f \t %f \t \r\n" , y, z, w, k); |
vtoffoli | 9:6c803986dbde | 112 | pc.printf("The result (Sensibility and Bias) is: %f \t %f \r\n" , test.adxl355_sensitivity.S[0], test.adxl355_sensitivity.B[0]); |
vtoffoli | 9:6c803986dbde | 113 | } |
vtoffoli | 9:6c803986dbde | 114 | else {pc.printf("Input value not recognized \r\n"); pc.printf("%c \r\n",point);} |
vtoffoli | 9:6c803986dbde | 115 | break; |
vtoffoli | 9:6c803986dbde | 116 | case 'n': pc.printf("No calibration test \r\n"); |
vtoffoli | 9:6c803986dbde | 117 | break; |
vtoffoli | 9:6c803986dbde | 118 | default: pc.printf("Input value not recognized \r\n"); |
vtoffoli | 9:6c803986dbde | 119 | break; |
vtoffoli | 9:6c803986dbde | 120 | } |
vtoffoli | 9:6c803986dbde | 121 | // test reading angle |
vtoffoli | 9:6c803986dbde | 122 | pc.printf("Start reading angle after calibration (y/n)?\r\n"); |
vtoffoli | 9:6c803986dbde | 123 | calib = pc.getc(); |
vtoffoli | 9:6c803986dbde | 124 | switch(calib){ |
vtoffoli | 9:6c803986dbde | 125 | case 'y': pc.printf("Select the procedure for angle measurement: 1axis, 2axis or 3axis? (1/2/3)\r\n"); |
vtoffoli | 9:6c803986dbde | 126 | char point = pc.getc(); |
vtoffoli | 9:6c803986dbde | 127 | pc.printf("x \t y \t z \t pitch \t roll \t tau \r\n"); |
vtoffoli | 9:6c803986dbde | 128 | if(point == '1'){ |
vtoffoli | 9:6c803986dbde | 129 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 130 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 131 | y = accl.convert(accl.scany())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 132 | z = accl.convert(accl.scanz())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 133 | w = asin(x/9.81)*180/pi; |
vtoffoli | 9:6c803986dbde | 134 | k = asin(y/9.81)*180/pi; |
vtoffoli | 9:6c803986dbde | 135 | h = asin(z/9.81)*180/pi; |
vtoffoli | 9:6c803986dbde | 136 | pc.printf("%f \t %f \t %f \t %f \t %f \t %f \r\n" , x,y,z,w,k,h); |
vtoffoli | 9:6c803986dbde | 137 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 138 | } |
vtoffoli | 9:6c803986dbde | 139 | else if(point == '2'){ |
vtoffoli | 9:6c803986dbde | 140 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 141 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 142 | y = accl.convert(accl.scany())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 143 | z = accl.convert(accl.scanz())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 144 | w = atan(x/z)*180/pi;; |
vtoffoli | 9:6c803986dbde | 145 | k = atan(y/z)*180/pi;; |
vtoffoli | 9:6c803986dbde | 146 | h = 0; |
vtoffoli | 9:6c803986dbde | 147 | pc.printf("%f \t %f \t %f \t %f \t %f \t %f \r\n" , x,y,z,w,k,h); |
vtoffoli | 9:6c803986dbde | 148 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 149 | } |
vtoffoli | 9:6c803986dbde | 150 | else if(point == '3'){ |
vtoffoli | 9:6c803986dbde | 151 | for(int i=0; i<50; i++){ |
vtoffoli | 9:6c803986dbde | 152 | x = accl.convert(accl.scanx())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 153 | y = accl.convert(accl.scany())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 154 | z = accl.convert(accl.scanz())*accl.axis355_sens; |
vtoffoli | 9:6c803986dbde | 155 | w = atan2(x,sqrt(pow(y,2)+pow(z,2)))*180/pi; |
vtoffoli | 9:6c803986dbde | 156 | k = atan2(y,sqrt(pow(x,2)+pow(z,2)))*180/pi; |
vtoffoli | 9:6c803986dbde | 157 | h = atan2(sqrt(pow(x,2)+pow(y,2)),z)*180/pi; |
vtoffoli | 9:6c803986dbde | 158 | pc.printf("%f \t %f \t %f \t %f \t %f \t %f \r\n" , x,y,z,w,k,h); |
vtoffoli | 9:6c803986dbde | 159 | wait(0.1);} |
vtoffoli | 9:6c803986dbde | 160 | } |
vtoffoli | 9:6c803986dbde | 161 | else {pc.printf("Input value not recognized \r\n"); pc.printf("%c \r\n",point);} |
vtoffoli | 9:6c803986dbde | 162 | break; |
vtoffoli | 9:6c803986dbde | 163 | case 'n': pc.printf("No calibration test \r\n"); |
vtoffoli | 9:6c803986dbde | 164 | break; |
vtoffoli | 9:6c803986dbde | 165 | default: pc.printf("Input value not recognized \r\n"); |
vtoffoli | 9:6c803986dbde | 166 | break; |
vtoffoli | 9:6c803986dbde | 167 | } |
vtoffoli | 2:14dc1ec57f3b | 168 | } |
vtoffoli | 6:45d2393ef468 | 169 |