
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
Sensor.cpp@15:462c8c89fe35, 2016-07-03 (annotated)
- Committer:
- Schreeker
- Date:
- Sun Jul 03 12:00:47 2016 +0000
- Revision:
- 15:462c8c89fe35
- Parent:
- 13:676721490d37
- Child:
- 16:9b20d24aae18
Lagesensor abgeschlossen. Kalibrierung +- 80 Grad sehr ungenau, evtl ab 80 Ueberkopflage einstellen? setLED hinzugefuegt komplett. setLCD erweitert mit bStateLCD zum Anzeigen der Ueberkopflage oder der Winkel im Normalfall. Simon Rutzen
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
NilsKemmer | 2:cf8b98404b66 | 1 | /********************************************************************************** |
NilsKemmer | 2:cf8b98404b66 | 2 | * File name: Sensor.h |
NilsKemmer | 2:cf8b98404b66 | 3 | * Zweck: Beinhaltet alle Funktionen zum Auslesen des Beschleunigungssensors |
NilsKemmer | 2:cf8b98404b66 | 4 | bezüglich der X-, Y-, Z-Koordinaten |
NilsKemmer | 2:cf8b98404b66 | 5 | * Author: Simon Rutzen, Nils Kemmer |
NilsKemmer | 2:cf8b98404b66 | 6 | * Changes: keine |
NilsKemmer | 2:cf8b98404b66 | 7 | ***********************************************************************************/ |
NilsKemmer | 2:cf8b98404b66 | 8 | |
NilsKemmer | 2:cf8b98404b66 | 9 | /*Include*/ |
NilsKemmer | 2:cf8b98404b66 | 10 | #include "Sensor.h" |
NilsKemmer | 2:cf8b98404b66 | 11 | #include "mbed.h" |
NilsKemmer | 3:740ab0a19e1d | 12 | #include "math.h" |
NilsKemmer | 2:cf8b98404b66 | 13 | |
Schreeker | 7:882edb5f9466 | 14 | /*define*/ |
Schreeker | 7:882edb5f9466 | 15 | #define pi 3.141 |
Schreeker | 7:882edb5f9466 | 16 | |
Schreeker | 15:462c8c89fe35 | 17 | #define URefX 1.6267 // Kalibrierung. Unsicherheit auf der letzten Stelle |
Schreeker | 15:462c8c89fe35 | 18 | #define UDiffX 0.3203 // Kalibrierung. X auf 90° entspricht 1,9470, X auf -90° entspricht 1.2970, 0° entspricht 1,6267 |
Schreeker | 7:882edb5f9466 | 19 | |
Schreeker | 15:462c8c89fe35 | 20 | #define URefY 1.6311 // Kalibrierung. Unsicherheit auf der letzten Stelle |
Schreeker | 15:462c8c89fe35 | 21 | #define UDiffY 0.3289 // Kalibrierung. Y auf -90° entspricht 1,2978 V, Y auf 90° entspricht 1.9600, 0° entspricht 1,6311 |
Schreeker | 15:462c8c89fe35 | 22 | |
Schreeker | 5:c0d6d490dd5b | 23 | /* Variabeln */ |
Schreeker | 7:882edb5f9466 | 24 | |
NilsKemmer | 2:cf8b98404b66 | 25 | /*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/ |
Schreeker | 5:c0d6d490dd5b | 26 | struct SensData stSensData; |
Schreeker | 7:882edb5f9466 | 27 | |
NilsKemmer | 3:740ab0a19e1d | 28 | /*Struktur zum Speichern der umgerechneten Messdaten von SensData*/ |
Schreeker | 5:c0d6d490dd5b | 29 | struct WinkelData stWinkelData; |
Schreeker | 7:882edb5f9466 | 30 | |
NilsKemmer | 2:cf8b98404b66 | 31 | /*Konfiguriert die angegebenen Pins als analoge Eingaenge*/ |
NilsKemmer | 2:cf8b98404b66 | 32 | AnalogIn oZData(PC_2); |
NilsKemmer | 2:cf8b98404b66 | 33 | AnalogIn oYData(PC_3); |
NilsKemmer | 2:cf8b98404b66 | 34 | AnalogIn oXData(PC_4); |
NilsKemmer | 2:cf8b98404b66 | 35 | |
Schreeker | 7:882edb5f9466 | 36 | /************************************************************************************ |
Schreeker | 7:882edb5f9466 | 37 | * void vgetSensData(struct SensData *stSensData) |
Schreeker | 7:882edb5f9466 | 38 | * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in |
Schreeker | 7:882edb5f9466 | 39 | Strukturen. |
Schreeker | 7:882edb5f9466 | 40 | * Parameter: |
Schreeker | 7:882edb5f9466 | 41 | *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 42 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 7:882edb5f9466 | 43 | * return Parameter: |
Schreeker | 7:882edb5f9466 | 44 | keine |
Schreeker | 7:882edb5f9466 | 45 | *************************************************************************************/ |
Schreeker | 5:c0d6d490dd5b | 46 | void vgetSensData(struct SensData *stSensData){ |
Schreeker | 5:c0d6d490dd5b | 47 | /* Variabeln */ |
Schreeker | 5:c0d6d490dd5b | 48 | int i=0; // Laufvariable |
Schreeker | 5:c0d6d490dd5b | 49 | double XDataRead = 0.0; // Speichervariabel für X Sampels |
Schreeker | 5:c0d6d490dd5b | 50 | double YDataRead = 0.0; // Speichervariabel für Y Sampels |
Schreeker | 5:c0d6d490dd5b | 51 | double ZDataRead = 0.0; // Speichervariabel für Z Sampels |
Schreeker | 5:c0d6d490dd5b | 52 | |
Schreeker | 5:c0d6d490dd5b | 53 | /*Auslesen der Daten, Mittelung und Speichern in Struktur*/ |
Schreeker | 5:c0d6d490dd5b | 54 | for(i=0; i<10000; i++){ |
Schreeker | 5:c0d6d490dd5b | 55 | XDataRead += oXData.read_u16(); |
NilsKemmer | 6:e57f9887ad02 | 56 | YDataRead += oYData.read_u16(); |
Schreeker | 7:882edb5f9466 | 57 | ZDataRead += oZData.read_u16(); |
Schreeker | 5:c0d6d490dd5b | 58 | } |
Schreeker | 5:c0d6d490dd5b | 59 | stSensData->wSensX = XDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 60 | stSensData->wSensY = YDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 61 | stSensData->wSensZ = ZDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 62 | |
Schreeker | 5:c0d6d490dd5b | 63 | /* Rücksetzten der Speichervariabeln*/ |
Schreeker | 5:c0d6d490dd5b | 64 | XDataRead = 0.0; |
Schreeker | 5:c0d6d490dd5b | 65 | YDataRead = 0.0; |
Schreeker | 5:c0d6d490dd5b | 66 | ZDataRead = 0.0; |
NilsKemmer | 3:740ab0a19e1d | 67 | } |
Schreeker | 7:882edb5f9466 | 68 | |
Schreeker | 7:882edb5f9466 | 69 | /************************************************************************************ |
Schreeker | 7:882edb5f9466 | 70 | * void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData) |
Schreeker | 7:882edb5f9466 | 71 | * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für |
Schreeker | 7:882edb5f9466 | 72 | LED-Ansteuerung. |
Schreeker | 7:882edb5f9466 | 73 | * Parameter: |
Schreeker | 7:882edb5f9466 | 74 | *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 75 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 7:882edb5f9466 | 76 | *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 77 | der berechneten Winkel für die X-, Y- und Z-Achse. |
Schreeker | 7:882edb5f9466 | 78 | * return Parameter: |
Schreeker | 7:882edb5f9466 | 79 | keine |
Schreeker | 7:882edb5f9466 | 80 | *************************************************************************************/ |
Schreeker | 5:c0d6d490dd5b | 81 | void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData){ |
NilsKemmer | 3:740ab0a19e1d | 82 | /*Variablen*/ |
NilsKemmer | 3:740ab0a19e1d | 83 | double dGMessX; |
NilsKemmer | 3:740ab0a19e1d | 84 | double dGMessY; |
NilsKemmer | 3:740ab0a19e1d | 85 | double dGMessZ; |
Schreeker | 9:38d287593320 | 86 | |
Schreeker | 9:38d287593320 | 87 | int iVorzeichenX = 0; |
Schreeker | 9:38d287593320 | 88 | int iVorzeichenY = 0; |
Schreeker | 9:38d287593320 | 89 | |
Schreeker | 7:882edb5f9466 | 90 | /* Berechnung des Z-Winkels */ |
Schreeker | 7:882edb5f9466 | 91 | dGMessZ = (stSensData->wSensZ/65535.0)*3.3; |
Schreeker | 7:882edb5f9466 | 92 | stWinkelData->i16WinkelZ = dGMessZ*10000; |
Schreeker | 9:38d287593320 | 93 | |
Schreeker | 7:882edb5f9466 | 94 | /* Berechnung des X-Winkels */ |
Schreeker | 7:882edb5f9466 | 95 | dGMessX = (stSensData->wSensX/65535.0)*3.3; |
Schreeker | 9:38d287593320 | 96 | /* Auswertung des Vorzeichens */ |
Schreeker | 9:38d287593320 | 97 | if(dGMessX<URefX){ |
Schreeker | 9:38d287593320 | 98 | iVorzeichenX = 1; |
Schreeker | 9:38d287593320 | 99 | } |
Schreeker | 9:38d287593320 | 100 | stWinkelData->i16WinkelX = dGMessX*10000; |
Schreeker | 5:c0d6d490dd5b | 101 | dGMessX = (int)(dGMessX*1000)/1000.0; |
Schreeker | 7:882edb5f9466 | 102 | dGMessX = abs(dGMessX-URefX)/(UDiffX); |
Schreeker | 4:ed779bcb8ce6 | 103 | dGMessX = (int)(dGMessX*1000)/1000.0; |
Schreeker | 4:ed779bcb8ce6 | 104 | if(dGMessX<=1 || dGMessX>=-1){ |
Schreeker | 5:c0d6d490dd5b | 105 | stWinkelData->i16WinkelX = asin(dGMessX)*(180/pi); |
Schreeker | 9:38d287593320 | 106 | } |
Schreeker | 9:38d287593320 | 107 | if(iVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX; |
Schreeker | 7:882edb5f9466 | 108 | /* Berechnung des Y-Winkels */ |
Schreeker | 5:c0d6d490dd5b | 109 | dGMessY = (stSensData->wSensY/65535.0)*3.3; |
Schreeker | 9:38d287593320 | 110 | /* Auswertung des Vorzeichens */ |
Schreeker | 9:38d287593320 | 111 | if(dGMessY<URefY){ |
Schreeker | 9:38d287593320 | 112 | iVorzeichenY = 1; |
Schreeker | 9:38d287593320 | 113 | } |
Schreeker | 7:882edb5f9466 | 114 | stWinkelData->i16WinkelY = dGMessY*10000; |
NilsKemmer | 6:e57f9887ad02 | 115 | dGMessY = (int)(dGMessY*1000)/1000.0; |
Schreeker | 7:882edb5f9466 | 116 | dGMessY = abs(dGMessY-URefY)/UDiffY; |
NilsKemmer | 6:e57f9887ad02 | 117 | dGMessY = (int)(dGMessY*1000)/1000.0; |
Schreeker | 4:ed779bcb8ce6 | 118 | if(dGMessY<=1 || dGMessY>=-1){ |
Schreeker | 7:882edb5f9466 | 119 | stWinkelData->i16WinkelY = asin(dGMessY)*(180/pi); |
Schreeker | 9:38d287593320 | 120 | } |
Schreeker | 9:38d287593320 | 121 | if(iVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY; |
Schreeker | 11:5861bc23022a | 122 | } |
Schreeker | 11:5861bc23022a | 123 | |
Schreeker | 11:5861bc23022a | 124 | /************************************************************************************ |
Schreeker | 11:5861bc23022a | 125 | * void void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData) |
Schreeker | 11:5861bc23022a | 126 | * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der |
Schreeker | 11:5861bc23022a | 127 | Nulllage und für Debugzwecke. Speicherung der Spannungen in WinkelData |
Schreeker | 11:5861bc23022a | 128 | * Parameter: |
Schreeker | 11:5861bc23022a | 129 | *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern |
Schreeker | 11:5861bc23022a | 130 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 11:5861bc23022a | 131 | *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern |
Schreeker | 11:5861bc23022a | 132 | der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse. |
Schreeker | 11:5861bc23022a | 133 | * return Parameter: |
Schreeker | 11:5861bc23022a | 134 | keine |
Schreeker | 11:5861bc23022a | 135 | *************************************************************************************/ |
Schreeker | 11:5861bc23022a | 136 | void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData){ |
Schreeker | 11:5861bc23022a | 137 | /*Variablen*/ |
Schreeker | 11:5861bc23022a | 138 | double dGMessX; |
Schreeker | 11:5861bc23022a | 139 | double dGMessY; |
Schreeker | 11:5861bc23022a | 140 | double dGMessZ; |
Schreeker | 11:5861bc23022a | 141 | |
Schreeker | 11:5861bc23022a | 142 | /* Berechnung des Z-Winkels */ |
Schreeker | 11:5861bc23022a | 143 | dGMessZ = (stSensData->wSensZ/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 144 | stWinkelData->i16WinkelZ = dGMessZ*10000; |
Schreeker | 11:5861bc23022a | 145 | |
Schreeker | 11:5861bc23022a | 146 | /* Berechnung des X-Winkels */ |
Schreeker | 11:5861bc23022a | 147 | dGMessX = (stSensData->wSensX/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 148 | stWinkelData->i16WinkelX = dGMessX*10000; |
Schreeker | 11:5861bc23022a | 149 | |
Schreeker | 11:5861bc23022a | 150 | /* Berechnung des Y-Winkels */ |
Schreeker | 11:5861bc23022a | 151 | dGMessY = (stSensData->wSensY/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 152 | stWinkelData->i16WinkelY = dGMessY*10000; |
Schreeker | 11:5861bc23022a | 153 | } |