base program for tilt measurement

Dependencies:   COG4050_ADT7420 ADXL362

Fork of COG4050_adxl355_adxl357-ver2 by ADI_CAC

Committer:
vtoffoli
Date:
Fri Sep 07 15:50:53 2018 +0000
Revision:
10:f5ba762b58b4
Parent:
9:6c803986dbde
basic driver;

Who changed what in which revision?

UserRevisionLine numberNew 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 10:f5ba762b58b4 133 w = asin(x)*180/pi;
vtoffoli 10:f5ba762b58b4 134 k = asin(y)*180/pi;
vtoffoli 10:f5ba762b58b4 135 h = asin(z)*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 10:f5ba762b58b4 141 x = accl.convert(accl.scanx());
vtoffoli 10:f5ba762b58b4 142 y = accl.convert(accl.scany());
vtoffoli 10:f5ba762b58b4 143 z = accl.convert(accl.scanz());
vtoffoli 9:6c803986dbde 144 w = atan(x/z)*180/pi;;
vtoffoli 10:f5ba762b58b4 145 k = atan(y/x)*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 10:f5ba762b58b4 152 x = accl.convert(accl.scanx());
vtoffoli 10:f5ba762b58b4 153 y = accl.convert(accl.scany());
vtoffoli 10:f5ba762b58b4 154 z = accl.convert(accl.scanz());
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