Thomas Allen
/
AccelerometerTest1611
11/16
main.cpp@1:e41af8c958b8, 2015-11-20 (annotated)
- Committer:
- el13ytg
- Date:
- Fri Nov 20 19:27:43 2015 +0000
- Revision:
- 1:e41af8c958b8
- Parent:
- 0:0dc99d71b2f3
- Child:
- 3:08f020c3d2b7
v2.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el13ytg | 0:0dc99d71b2f3 | 1 | //AccelerometerTest |
el13ytg | 0:0dc99d71b2f3 | 2 | //Toby Galal |
el13ytg | 0:0dc99d71b2f3 | 3 | //6 November 2015 |
el13ytg | 0:0dc99d71b2f3 | 4 | //A program used to gather data from ADXL335 accelerometers and print them to file (.txt) in a MatLab-compliant format |
el13ytg | 0:0dc99d71b2f3 | 5 | |
el13ytg | 0:0dc99d71b2f3 | 6 | #include "mbed.h" |
el13ytg | 0:0dc99d71b2f3 | 7 | |
el13ytg | 0:0dc99d71b2f3 | 8 | //Hardware Initialisation |
el13ytg | 0:0dc99d71b2f3 | 9 | AnalogIn XIn(p15); //X Input |
el13ytg | 0:0dc99d71b2f3 | 10 | AnalogIn YIn(p16); //Y Input |
el13ytg | 0:0dc99d71b2f3 | 11 | AnalogIn ZIn(p17); //Z Input |
el13ytg | 1:e41af8c958b8 | 12 | Serial pc(USBTX, USBRX); //Serial to print readings to terminal |
el13ytg | 0:0dc99d71b2f3 | 13 | Ticker timer; //Timer to call ISR |
el13ytg | 0:0dc99d71b2f3 | 14 | LocalFileSystem local("local"); // create local filesystem |
el13ytg | 1:e41af8c958b8 | 15 | BusOut leds(LED4,LED3,LED2,LED1); //debugio |
el13ytg | 0:0dc99d71b2f3 | 16 | |
el13ytg | 0:0dc99d71b2f3 | 17 | //Global Variables |
el13ytg | 0:0dc99d71b2f3 | 18 | float XOut, YOut, ZOut; //variables to store XYZ readings |
el13ytg | 1:e41af8c958b8 | 19 | float Xo, Yo, Zo; //variables to store 0G bias readings |
el13ytg | 0:0dc99d71b2f3 | 20 | int flag; //flag for ISR |
el13ytg | 1:e41af8c958b8 | 21 | float X[2000], Y[2000], Z[2000]; //arrays to store results |
el13ytg | 1:e41af8c958b8 | 22 | float CalX[20], CalY[20], CalZ[20]; //arrays to store calibration readings |
el13ytg | 0:0dc99d71b2f3 | 23 | int n; //variable to store the number of readings |
el13ytg | 0:0dc99d71b2f3 | 24 | |
el13ytg | 0:0dc99d71b2f3 | 25 | //Function Prototypes |
el13ytg | 0:0dc99d71b2f3 | 26 | void Calibrate(); |
el13ytg | 0:0dc99d71b2f3 | 27 | void ISR(); |
el13ytg | 0:0dc99d71b2f3 | 28 | void Send_Data(); |
el13ytg | 0:0dc99d71b2f3 | 29 | void writeDataToFile(); |
el13ytg | 0:0dc99d71b2f3 | 30 | |
el13ytg | 0:0dc99d71b2f3 | 31 | //Main Function |
el13ytg | 0:0dc99d71b2f3 | 32 | int main() { |
el13ytg | 0:0dc99d71b2f3 | 33 | |
el13ytg | 1:e41af8c958b8 | 34 | wait(5.0); //allow accelerometer to stabilise |
el13ytg | 0:0dc99d71b2f3 | 35 | Calibrate(); |
el13ytg | 1:e41af8c958b8 | 36 | pc.printf("Ready in:"); |
el13ytg | 1:e41af8c958b8 | 37 | for (int i = 10; i > 0; i--) { |
el13ytg | 1:e41af8c958b8 | 38 | pc.printf("%d\n\r", i); |
el13ytg | 1:e41af8c958b8 | 39 | wait(1.0); |
el13ytg | 1:e41af8c958b8 | 40 | } |
el13ytg | 0:0dc99d71b2f3 | 41 | |
el13ytg | 1:e41af8c958b8 | 42 | timer.attach(&ISR, 0.005); //attach ISR function to timer (100Hz) |
el13ytg | 1:e41af8c958b8 | 43 | |
el13ytg | 1:e41af8c958b8 | 44 | while (n < 2000) { |
el13ytg | 0:0dc99d71b2f3 | 45 | if (flag) { //if flag has been set |
el13ytg | 0:0dc99d71b2f3 | 46 | flag = 0; //reset flag |
el13ytg | 0:0dc99d71b2f3 | 47 | Send_Data(); |
el13ytg | 0:0dc99d71b2f3 | 48 | } |
el13ytg | 0:0dc99d71b2f3 | 49 | } |
el13ytg | 1:e41af8c958b8 | 50 | pc.printf("Writing...\n\r"); |
el13ytg | 0:0dc99d71b2f3 | 51 | writeDataToFile(); |
el13ytg | 1:e41af8c958b8 | 52 | pc.printf("Done.\n\r"); |
el13ytg | 0:0dc99d71b2f3 | 53 | } |
el13ytg | 0:0dc99d71b2f3 | 54 | |
el13ytg | 0:0dc99d71b2f3 | 55 | //Function Definitions |
el13ytg | 0:0dc99d71b2f3 | 56 | void Calibrate() { |
el13ytg | 1:e41af8c958b8 | 57 | |
el13ytg | 1:e41af8c958b8 | 58 | for (int i = 0; i < 20; i++) { //read and store 20 samples |
el13ytg | 1:e41af8c958b8 | 59 | CalX[i] = XIn.read() * 3.3; |
el13ytg | 1:e41af8c958b8 | 60 | CalY[i] = YIn.read() * 3.3; |
el13ytg | 1:e41af8c958b8 | 61 | CalZ[i] = ZIn.read() * 3.3; |
el13ytg | 1:e41af8c958b8 | 62 | } |
el13ytg | 1:e41af8c958b8 | 63 | |
el13ytg | 1:e41af8c958b8 | 64 | for (int i = 0; i < 20; i++) { //sum readings |
el13ytg | 1:e41af8c958b8 | 65 | Xo = Xo + CalX[i]; |
el13ytg | 1:e41af8c958b8 | 66 | Yo = Yo + CalY[i]; |
el13ytg | 1:e41af8c958b8 | 67 | Zo = Zo + CalZ[i]; |
el13ytg | 1:e41af8c958b8 | 68 | } |
el13ytg | 1:e41af8c958b8 | 69 | |
el13ytg | 1:e41af8c958b8 | 70 | Xo = Xo / 20; //find mean and store it |
el13ytg | 1:e41af8c958b8 | 71 | Yo = Yo / 20; |
el13ytg | 1:e41af8c958b8 | 72 | Zo = Zo / 20; |
el13ytg | 1:e41af8c958b8 | 73 | |
el13ytg | 1:e41af8c958b8 | 74 | pc.printf("Calibration Values = %.3f | %.3f | %.3f\n\r", Xo, Yo, Zo); |
el13ytg | 0:0dc99d71b2f3 | 75 | } |
el13ytg | 0:0dc99d71b2f3 | 76 | |
el13ytg | 0:0dc99d71b2f3 | 77 | void ISR() { |
el13ytg | 0:0dc99d71b2f3 | 78 | flag = 1; |
el13ytg | 0:0dc99d71b2f3 | 79 | } |
el13ytg | 0:0dc99d71b2f3 | 80 | |
el13ytg | 0:0dc99d71b2f3 | 81 | void Send_Data() { |
el13ytg | 1:e41af8c958b8 | 82 | XOut = (XIn.read() * 3.3) - Xo; //differences |
el13ytg | 1:e41af8c958b8 | 83 | YOut = (YIn.read() * 3.3) - Yo; |
el13ytg | 1:e41af8c958b8 | 84 | ZOut = (ZIn.read() * 3.3) - Zo; |
el13ytg | 1:e41af8c958b8 | 85 | X[n] = XOut / 0.3; //convert voltage to g-force (300mv/g) and store in array |
el13ytg | 1:e41af8c958b8 | 86 | Y[n] = YOut / 0.3; |
el13ytg | 1:e41af8c958b8 | 87 | Z[n] = ZOut / 0.3; |
el13ytg | 0:0dc99d71b2f3 | 88 | n++; |
el13ytg | 0:0dc99d71b2f3 | 89 | |
el13ytg | 1:e41af8c958b8 | 90 | pc.printf("%d) X = %.2f | Y = %.2f | Z = %.2f\n\r", n, XOut, YOut, ZOut); |
el13ytg | 0:0dc99d71b2f3 | 91 | } |
el13ytg | 0:0dc99d71b2f3 | 92 | |
el13ytg | 0:0dc99d71b2f3 | 93 | void writeDataToFile() { |
el13ytg | 0:0dc99d71b2f3 | 94 | |
el13ytg | 0:0dc99d71b2f3 | 95 | leds = 15; // turn on LEDs for feedback |
el13ytg | 0:0dc99d71b2f3 | 96 | FILE *results = fopen("/local/results.txt", "w"); // open 'results.txt' for writing |
el13ytg | 0:0dc99d71b2f3 | 97 | |
el13ytg | 0:0dc99d71b2f3 | 98 | fprintf(results, "x = ["); //print X array |
el13ytg | 0:0dc99d71b2f3 | 99 | |
el13ytg | 1:e41af8c958b8 | 100 | for (int i = 0; i < 1999; i++) { |
el13ytg | 1:e41af8c958b8 | 101 | fprintf(results, "%.3f,", X[i]); |
el13ytg | 0:0dc99d71b2f3 | 102 | } |
el13ytg | 0:0dc99d71b2f3 | 103 | |
el13ytg | 1:e41af8c958b8 | 104 | fprintf(results, "%.3f]\n\r", X[1999]); |
el13ytg | 0:0dc99d71b2f3 | 105 | |
el13ytg | 0:0dc99d71b2f3 | 106 | fprintf(results, "y = ["); //print Y array |
el13ytg | 0:0dc99d71b2f3 | 107 | |
el13ytg | 1:e41af8c958b8 | 108 | for (int i = 0; i < 1999; i++) { |
el13ytg | 1:e41af8c958b8 | 109 | fprintf(results, "%.3f,", Y[i]); |
el13ytg | 0:0dc99d71b2f3 | 110 | } |
el13ytg | 0:0dc99d71b2f3 | 111 | |
el13ytg | 1:e41af8c958b8 | 112 | fprintf(results, "%.3f]\n\r", Y[1999]); |
el13ytg | 0:0dc99d71b2f3 | 113 | |
el13ytg | 0:0dc99d71b2f3 | 114 | fprintf(results, "z = ["); //print Z array |
el13ytg | 0:0dc99d71b2f3 | 115 | |
el13ytg | 1:e41af8c958b8 | 116 | for (int i = 0; i < 1999; i++) { |
el13ytg | 1:e41af8c958b8 | 117 | fprintf(results, "%.3f,", Z[i]); |
el13ytg | 0:0dc99d71b2f3 | 118 | } |
el13ytg | 0:0dc99d71b2f3 | 119 | |
el13ytg | 1:e41af8c958b8 | 120 | fprintf(results, "%.3f]\n\r", Z[1999]); |
el13ytg | 0:0dc99d71b2f3 | 121 | |
el13ytg | 0:0dc99d71b2f3 | 122 | fclose(results); // close file |
el13ytg | 0:0dc99d71b2f3 | 123 | leds = 0; // turn off LEDs to signify file access has finished |
el13ytg | 0:0dc99d71b2f3 | 124 | } |