
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
Sensor.cpp@16:9b20d24aae18, 2016-07-03 (annotated)
- Committer:
- Schreeker
- Date:
- Sun Jul 03 14:02:47 2016 +0000
- Revision:
- 16:9b20d24aae18
- Parent:
- 15:462c8c89fe35
- Child:
- 17:0b9e7a05b203
Anpassung an Definitionen des Files cdef.h. 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 | 16:9b20d24aae18 | 92 | stWinkelData->i16SpannungZ = 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 | 16:9b20d24aae18 | 144 | stWinkelData->i16SpannungZ = 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 | } |