
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
Sensor.cpp@11:5861bc23022a, 2016-06-28 (annotated)
- Committer:
- Schreeker
- Date:
- Tue Jun 28 19:05:15 2016 +0000
- Revision:
- 11:5861bc23022a
- Parent:
- 9:38d287593320
- Child:
- 13:676721490d37
Hinzuf?gen der Funktionen vDebugData und vLCDDebug. Erstere gibt Spannungswerte der Achsen mit Faktor 10000 multipliziert zur?ck, zweitere zeigt diese Werte an f?r Kalibrierung der Nullage. 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 | 7:882edb5f9466 | 17 | #define URefX 1.6135 |
Schreeker | 7:882edb5f9466 | 18 | #define UDiffX 0.3255 |
Schreeker | 7:882edb5f9466 | 19 | |
Schreeker | 7:882edb5f9466 | 20 | #define URefY 1.6135 |
Schreeker | 7:882edb5f9466 | 21 | #define UDiffY 0.3255 |
Schreeker | 7:882edb5f9466 | 22 | |
Schreeker | 7:882edb5f9466 | 23 | #define URefZ 1.6135 |
Schreeker | 7:882edb5f9466 | 24 | #define UDiffZ 0.3255 |
Schreeker | 7:882edb5f9466 | 25 | |
Schreeker | 5:c0d6d490dd5b | 26 | /* Variabeln */ |
Schreeker | 7:882edb5f9466 | 27 | |
NilsKemmer | 2:cf8b98404b66 | 28 | /*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/ |
Schreeker | 5:c0d6d490dd5b | 29 | struct SensData stSensData; |
Schreeker | 7:882edb5f9466 | 30 | |
NilsKemmer | 3:740ab0a19e1d | 31 | /*Struktur zum Speichern der umgerechneten Messdaten von SensData*/ |
Schreeker | 5:c0d6d490dd5b | 32 | struct WinkelData stWinkelData; |
Schreeker | 7:882edb5f9466 | 33 | |
NilsKemmer | 2:cf8b98404b66 | 34 | /*Konfiguriert die angegebenen Pins als analoge Eingaenge*/ |
NilsKemmer | 2:cf8b98404b66 | 35 | AnalogIn oZData(PC_2); |
NilsKemmer | 2:cf8b98404b66 | 36 | AnalogIn oYData(PC_3); |
NilsKemmer | 2:cf8b98404b66 | 37 | AnalogIn oXData(PC_4); |
NilsKemmer | 2:cf8b98404b66 | 38 | |
Schreeker | 7:882edb5f9466 | 39 | /************************************************************************************ |
Schreeker | 7:882edb5f9466 | 40 | * void vgetSensData(struct SensData *stSensData) |
Schreeker | 7:882edb5f9466 | 41 | * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in |
Schreeker | 7:882edb5f9466 | 42 | Strukturen. |
Schreeker | 7:882edb5f9466 | 43 | * Parameter: |
Schreeker | 7:882edb5f9466 | 44 | *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 45 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 7:882edb5f9466 | 46 | * return Parameter: |
Schreeker | 7:882edb5f9466 | 47 | keine |
Schreeker | 7:882edb5f9466 | 48 | *************************************************************************************/ |
Schreeker | 5:c0d6d490dd5b | 49 | void vgetSensData(struct SensData *stSensData){ |
Schreeker | 5:c0d6d490dd5b | 50 | /* Variabeln */ |
Schreeker | 5:c0d6d490dd5b | 51 | int i=0; // Laufvariable |
Schreeker | 5:c0d6d490dd5b | 52 | double XDataRead = 0.0; // Speichervariabel für X Sampels |
Schreeker | 5:c0d6d490dd5b | 53 | double YDataRead = 0.0; // Speichervariabel für Y Sampels |
Schreeker | 5:c0d6d490dd5b | 54 | double ZDataRead = 0.0; // Speichervariabel für Z Sampels |
Schreeker | 5:c0d6d490dd5b | 55 | |
Schreeker | 5:c0d6d490dd5b | 56 | /*Auslesen der Daten, Mittelung und Speichern in Struktur*/ |
Schreeker | 5:c0d6d490dd5b | 57 | for(i=0; i<10000; i++){ |
Schreeker | 5:c0d6d490dd5b | 58 | XDataRead += oXData.read_u16(); |
NilsKemmer | 6:e57f9887ad02 | 59 | YDataRead += oYData.read_u16(); |
Schreeker | 7:882edb5f9466 | 60 | ZDataRead += oZData.read_u16(); |
Schreeker | 5:c0d6d490dd5b | 61 | } |
Schreeker | 5:c0d6d490dd5b | 62 | stSensData->wSensX = XDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 63 | stSensData->wSensY = YDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 64 | stSensData->wSensZ = ZDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 65 | |
Schreeker | 5:c0d6d490dd5b | 66 | /* Rücksetzten der Speichervariabeln*/ |
Schreeker | 5:c0d6d490dd5b | 67 | XDataRead = 0.0; |
Schreeker | 5:c0d6d490dd5b | 68 | YDataRead = 0.0; |
Schreeker | 5:c0d6d490dd5b | 69 | ZDataRead = 0.0; |
NilsKemmer | 3:740ab0a19e1d | 70 | } |
Schreeker | 7:882edb5f9466 | 71 | |
Schreeker | 7:882edb5f9466 | 72 | /************************************************************************************ |
Schreeker | 7:882edb5f9466 | 73 | * void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData) |
Schreeker | 7:882edb5f9466 | 74 | * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für |
Schreeker | 7:882edb5f9466 | 75 | LED-Ansteuerung. |
Schreeker | 7:882edb5f9466 | 76 | * Parameter: |
Schreeker | 7:882edb5f9466 | 77 | *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 78 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 7:882edb5f9466 | 79 | *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 80 | der berechneten Winkel für die X-, Y- und Z-Achse. |
Schreeker | 7:882edb5f9466 | 81 | * return Parameter: |
Schreeker | 7:882edb5f9466 | 82 | keine |
Schreeker | 7:882edb5f9466 | 83 | *************************************************************************************/ |
Schreeker | 5:c0d6d490dd5b | 84 | void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData){ |
NilsKemmer | 3:740ab0a19e1d | 85 | /*Variablen*/ |
NilsKemmer | 3:740ab0a19e1d | 86 | double dGMessX; |
NilsKemmer | 3:740ab0a19e1d | 87 | double dGMessY; |
NilsKemmer | 3:740ab0a19e1d | 88 | double dGMessZ; |
Schreeker | 9:38d287593320 | 89 | |
Schreeker | 9:38d287593320 | 90 | int iVorzeichenX = 0; |
Schreeker | 9:38d287593320 | 91 | int iVorzeichenY = 0; |
Schreeker | 9:38d287593320 | 92 | |
Schreeker | 7:882edb5f9466 | 93 | /* Berechnung des Z-Winkels */ |
Schreeker | 7:882edb5f9466 | 94 | dGMessZ = (stSensData->wSensZ/65535.0)*3.3; |
Schreeker | 7:882edb5f9466 | 95 | stWinkelData->i16WinkelZ = dGMessZ*10000; |
Schreeker | 9:38d287593320 | 96 | |
Schreeker | 7:882edb5f9466 | 97 | /* Berechnung des X-Winkels */ |
Schreeker | 7:882edb5f9466 | 98 | dGMessX = (stSensData->wSensX/65535.0)*3.3; |
Schreeker | 9:38d287593320 | 99 | /* Auswertung des Vorzeichens */ |
Schreeker | 9:38d287593320 | 100 | if(dGMessX<URefX){ |
Schreeker | 9:38d287593320 | 101 | iVorzeichenX = 1; |
Schreeker | 9:38d287593320 | 102 | } |
Schreeker | 9:38d287593320 | 103 | stWinkelData->i16WinkelX = dGMessX*10000; |
Schreeker | 5:c0d6d490dd5b | 104 | dGMessX = (int)(dGMessX*1000)/1000.0; |
Schreeker | 7:882edb5f9466 | 105 | dGMessX = abs(dGMessX-URefX)/(UDiffX); |
Schreeker | 4:ed779bcb8ce6 | 106 | dGMessX = (int)(dGMessX*1000)/1000.0; |
Schreeker | 4:ed779bcb8ce6 | 107 | if(dGMessX<=1 || dGMessX>=-1){ |
Schreeker | 5:c0d6d490dd5b | 108 | stWinkelData->i16WinkelX = asin(dGMessX)*(180/pi); |
Schreeker | 9:38d287593320 | 109 | } |
Schreeker | 9:38d287593320 | 110 | if(iVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX; |
Schreeker | 7:882edb5f9466 | 111 | /* Berechnung des Y-Winkels */ |
Schreeker | 5:c0d6d490dd5b | 112 | dGMessY = (stSensData->wSensY/65535.0)*3.3; |
Schreeker | 9:38d287593320 | 113 | /* Auswertung des Vorzeichens */ |
Schreeker | 9:38d287593320 | 114 | if(dGMessY<URefY){ |
Schreeker | 9:38d287593320 | 115 | iVorzeichenY = 1; |
Schreeker | 9:38d287593320 | 116 | } |
Schreeker | 7:882edb5f9466 | 117 | stWinkelData->i16WinkelY = dGMessY*10000; |
NilsKemmer | 6:e57f9887ad02 | 118 | dGMessY = (int)(dGMessY*1000)/1000.0; |
Schreeker | 7:882edb5f9466 | 119 | dGMessY = abs(dGMessY-URefY)/UDiffY; |
NilsKemmer | 6:e57f9887ad02 | 120 | dGMessY = (int)(dGMessY*1000)/1000.0; |
Schreeker | 4:ed779bcb8ce6 | 121 | if(dGMessY<=1 || dGMessY>=-1){ |
Schreeker | 7:882edb5f9466 | 122 | stWinkelData->i16WinkelY = asin(dGMessY)*(180/pi); |
Schreeker | 9:38d287593320 | 123 | } |
Schreeker | 9:38d287593320 | 124 | if(iVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY; |
Schreeker | 11:5861bc23022a | 125 | } |
Schreeker | 11:5861bc23022a | 126 | |
Schreeker | 11:5861bc23022a | 127 | /************************************************************************************ |
Schreeker | 11:5861bc23022a | 128 | * void void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData) |
Schreeker | 11:5861bc23022a | 129 | * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der |
Schreeker | 11:5861bc23022a | 130 | Nulllage und für Debugzwecke. Speicherung der Spannungen in WinkelData |
Schreeker | 11:5861bc23022a | 131 | * Parameter: |
Schreeker | 11:5861bc23022a | 132 | *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern |
Schreeker | 11:5861bc23022a | 133 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 11:5861bc23022a | 134 | *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern |
Schreeker | 11:5861bc23022a | 135 | der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse. |
Schreeker | 11:5861bc23022a | 136 | * return Parameter: |
Schreeker | 11:5861bc23022a | 137 | keine |
Schreeker | 11:5861bc23022a | 138 | *************************************************************************************/ |
Schreeker | 11:5861bc23022a | 139 | void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData){ |
Schreeker | 11:5861bc23022a | 140 | /*Variablen*/ |
Schreeker | 11:5861bc23022a | 141 | double dGMessX; |
Schreeker | 11:5861bc23022a | 142 | double dGMessY; |
Schreeker | 11:5861bc23022a | 143 | double dGMessZ; |
Schreeker | 11:5861bc23022a | 144 | |
Schreeker | 11:5861bc23022a | 145 | /* Berechnung des Z-Winkels */ |
Schreeker | 11:5861bc23022a | 146 | dGMessZ = (stSensData->wSensZ/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 147 | stWinkelData->i16WinkelZ = dGMessZ*10000; |
Schreeker | 11:5861bc23022a | 148 | |
Schreeker | 11:5861bc23022a | 149 | /* Berechnung des X-Winkels */ |
Schreeker | 11:5861bc23022a | 150 | dGMessX = (stSensData->wSensX/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 151 | stWinkelData->i16WinkelX = dGMessX*10000; |
Schreeker | 11:5861bc23022a | 152 | |
Schreeker | 11:5861bc23022a | 153 | /* Berechnung des Y-Winkels */ |
Schreeker | 11:5861bc23022a | 154 | dGMessY = (stSensData->wSensY/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 155 | stWinkelData->i16WinkelY = dGMessY*10000; |
Schreeker | 11:5861bc23022a | 156 | } |