Thomas Allen
/
AccelerometerTest1611
11/16
main.cpp@3:08f020c3d2b7, 2015-11-22 (annotated)
- Committer:
- el13ytg
- Date:
- Sun Nov 22 00:10:04 2015 +0000
- Revision:
- 3:08f020c3d2b7
- Parent:
- 1:e41af8c958b8
v3.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 | |
el13ytg | 0:0dc99d71b2f3 | 15 | //Global Variables |
el13ytg | 3:08f020c3d2b7 | 16 | float X, Y, Z; //variables to store XYZ readings |
el13ytg | 1:e41af8c958b8 | 17 | float Xo, Yo, Zo; //variables to store 0G bias readings |
el13ytg | 0:0dc99d71b2f3 | 18 | int flag; //flag for ISR |
el13ytg | 3:08f020c3d2b7 | 19 | float CalX[1000], CalY[1000], CalZ[1000]; //arrays to store calibration readings |
el13ytg | 3:08f020c3d2b7 | 20 | int n = 0; //variable to store the number of readings |
el13ytg | 0:0dc99d71b2f3 | 21 | |
el13ytg | 0:0dc99d71b2f3 | 22 | //Function Prototypes |
el13ytg | 0:0dc99d71b2f3 | 23 | void Calibrate(); |
el13ytg | 3:08f020c3d2b7 | 24 | void Send_Data(); |
el13ytg | 0:0dc99d71b2f3 | 25 | void ISR(); |
el13ytg | 3:08f020c3d2b7 | 26 | |
el13ytg | 0:0dc99d71b2f3 | 27 | |
el13ytg | 0:0dc99d71b2f3 | 28 | //Main Function |
el13ytg | 0:0dc99d71b2f3 | 29 | int main() { |
el13ytg | 0:0dc99d71b2f3 | 30 | |
el13ytg | 3:08f020c3d2b7 | 31 | wait(2.0); //allow accelerometer to stabilise |
el13ytg | 3:08f020c3d2b7 | 32 | timer.attach(&Calibrate, 0.001); //attach Calibrate function to timer |
el13ytg | 3:08f020c3d2b7 | 33 | |
el13ytg | 3:08f020c3d2b7 | 34 | while (1) { |
el13ytg | 0:0dc99d71b2f3 | 35 | if (flag) { //if flag has been set |
el13ytg | 0:0dc99d71b2f3 | 36 | flag = 0; //reset flag |
el13ytg | 0:0dc99d71b2f3 | 37 | Send_Data(); |
el13ytg | 0:0dc99d71b2f3 | 38 | } |
el13ytg | 0:0dc99d71b2f3 | 39 | } |
el13ytg | 0:0dc99d71b2f3 | 40 | } |
el13ytg | 0:0dc99d71b2f3 | 41 | |
el13ytg | 0:0dc99d71b2f3 | 42 | //Function Definitions |
el13ytg | 3:08f020c3d2b7 | 43 | void Calibrate() { |
el13ytg | 3:08f020c3d2b7 | 44 | CalX[n] = XIn.read() * 3.3; //read XYZ pins and store in array |
el13ytg | 3:08f020c3d2b7 | 45 | CalY[n] = YIn.read() * 3.3; |
el13ytg | 3:08f020c3d2b7 | 46 | CalZ[n] = ZIn.read() * 3.3; |
el13ytg | 3:08f020c3d2b7 | 47 | n++; //increment counter |
el13ytg | 1:e41af8c958b8 | 48 | |
el13ytg | 3:08f020c3d2b7 | 49 | if (n == 1000) { //when enough samples have been taken |
el13ytg | 3:08f020c3d2b7 | 50 | timer.detach(); //detach timer from Calibrate() |
el13ytg | 1:e41af8c958b8 | 51 | |
el13ytg | 3:08f020c3d2b7 | 52 | for (int i = 0; i < 1000; i++) { //sum sample readings |
el13ytg | 3:08f020c3d2b7 | 53 | Xo = Xo + CalX[i]; |
el13ytg | 3:08f020c3d2b7 | 54 | Yo = Yo + CalY[i]; |
el13ytg | 3:08f020c3d2b7 | 55 | Zo = Zo + CalZ[i]; |
el13ytg | 3:08f020c3d2b7 | 56 | } |
el13ytg | 3:08f020c3d2b7 | 57 | |
el13ytg | 3:08f020c3d2b7 | 58 | Xo = Xo / 1000; //find mean and store it |
el13ytg | 3:08f020c3d2b7 | 59 | Yo = Yo / 1000; |
el13ytg | 3:08f020c3d2b7 | 60 | Zo = Zo / 1000; |
el13ytg | 1:e41af8c958b8 | 61 | |
el13ytg | 3:08f020c3d2b7 | 62 | pc.printf("Calibration Values = %.3f | %.3f | %.3f\n\r", Xo, Yo, Zo); //debug |
el13ytg | 3:08f020c3d2b7 | 63 | timer.attach(&ISR, 0.001); //attach timer to ISR for real data collection |
el13ytg | 3:08f020c3d2b7 | 64 | } |
el13ytg | 0:0dc99d71b2f3 | 65 | } |
el13ytg | 0:0dc99d71b2f3 | 66 | |
el13ytg | 0:0dc99d71b2f3 | 67 | void Send_Data() { |
el13ytg | 3:08f020c3d2b7 | 68 | X = ((XIn.read() * 3.3) - Xo) / 0.3; //read input, subtract zeroed value to find offset, and convert to g (300mv/g) |
el13ytg | 3:08f020c3d2b7 | 69 | Y = ((YIn.read() * 3.3) - Yo) / 0.3; |
el13ytg | 3:08f020c3d2b7 | 70 | Z = ((ZIn.read() * 3.3) - Zo) / 0.3; |
el13ytg | 3:08f020c3d2b7 | 71 | pc.printf("%.3f %.3f %.3f",X, Y, Z); //print output to serial |
el13ytg | 0:0dc99d71b2f3 | 72 | } |
el13ytg | 0:0dc99d71b2f3 | 73 | |
el13ytg | 3:08f020c3d2b7 | 74 | void ISR() { |
el13ytg | 3:08f020c3d2b7 | 75 | flag = 1; //set flag |
el13ytg | 0:0dc99d71b2f3 | 76 | } |