
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
Sensor.cpp@20:094cdb790dcb, 2016-07-29 (annotated)
- Committer:
- Schreeker
- Date:
- Fri Jul 29 14:58:49 2016 +0000
- Revision:
- 20:094cdb790dcb
- Parent:
- 17:0b9e7a05b203
Anpassung an Programmierrichtlinie Dokument, sowie letzte Kontrolle und Funktionstest. Alles Ok! Codestatus endg?ltig! 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 |
Schreeker | 20:094cdb790dcb | 6 | * Changes: |
Schreeker | 20:094cdb790dcb | 7 | 23.05.16 Erstellung des Files, Strukturen und Funktionen vgetSensData, vcalcdata |
Schreeker | 20:094cdb790dcb | 8 | 24.05.16 vcalcData Berechnung des Winkels eingefügt (X-Achse), Defines eingefügt |
Schreeker | 20:094cdb790dcb | 9 | Referenzmessungswerte X-Y-Z Achse 0° und +-90° eingetragen, vgetSensData |
Schreeker | 20:094cdb790dcb | 10 | Mittelung des Messwerte eingefügt (alle Achsen), calcData Werte auf 3 |
Schreeker | 20:094cdb790dcb | 11 | Nachkommastellen begrenzt |
Schreeker | 20:094cdb790dcb | 12 | 25.05.16 Y-Achsen Winkelberechnungen analog zu X-Achse eingefügt |
Schreeker | 20:094cdb790dcb | 13 | 27.05.16 Defines Referenzwerte zur Berechnung der Winkel aller Achsen eingefügt |
Schreeker | 20:094cdb790dcb | 14 | Funktionen Kommentare eingefügt |
Schreeker | 20:094cdb790dcb | 15 | 05.06.16 Unterscheidung negativer oder positiver Winkel eingefügt (Neigung aller |
Schreeker | 20:094cdb790dcb | 16 | Achsen) |
Schreeker | 20:094cdb790dcb | 17 | 28.06.16 vDebugData zur Ermittlung der Spannungswerte vom a-Sensor erstellt |
Schreeker | 20:094cdb790dcb | 18 | 30.06.16 Neue Kalibrierung, Defines geändert |
Schreeker | 20:094cdb790dcb | 19 | 06.07.16 Endgültige Kalibrierung, Defines angepasst |
Schreeker | 20:094cdb790dcb | 20 | 07.07.16 Überkopflage bei 80° definiert, Defines angepasst |
Schreeker | 20:094cdb790dcb | 21 | 29.07.16 Anpassung an Programmierrichtlinie-Dokument und letzte endgültige |
Schreeker | 20:094cdb790dcb | 22 | Kontrolle Simon Rutzen |
NilsKemmer | 2:cf8b98404b66 | 23 | ***********************************************************************************/ |
NilsKemmer | 2:cf8b98404b66 | 24 | |
NilsKemmer | 2:cf8b98404b66 | 25 | /*Include*/ |
NilsKemmer | 2:cf8b98404b66 | 26 | #include "Sensor.h" |
NilsKemmer | 2:cf8b98404b66 | 27 | #include "mbed.h" |
NilsKemmer | 3:740ab0a19e1d | 28 | #include "math.h" |
NilsKemmer | 2:cf8b98404b66 | 29 | |
Schreeker | 7:882edb5f9466 | 30 | /*define*/ |
Schreeker | 17:0b9e7a05b203 | 31 | #define pi 3.1412 |
Schreeker | 7:882edb5f9466 | 32 | |
Schreeker | 15:462c8c89fe35 | 33 | #define URefX 1.6267 // Kalibrierung. Unsicherheit auf der letzten Stelle |
Schreeker | 15:462c8c89fe35 | 34 | #define UDiffX 0.3203 // Kalibrierung. X auf 90° entspricht 1,9470, X auf -90° entspricht 1.2970, 0° entspricht 1,6267 |
Schreeker | 17:0b9e7a05b203 | 35 | // UDiffX = X auf 90° - Nullage 0° |
Schreeker | 7:882edb5f9466 | 36 | |
Schreeker | 15:462c8c89fe35 | 37 | #define URefY 1.6311 // Kalibrierung. Unsicherheit auf der letzten Stelle |
Schreeker | 15:462c8c89fe35 | 38 | #define UDiffY 0.3289 // Kalibrierung. Y auf -90° entspricht 1,2978 V, Y auf 90° entspricht 1.9600, 0° entspricht 1,6311 |
Schreeker | 17:0b9e7a05b203 | 39 | // UDiffY = Y auf 90° - Nullage 0° |
Schreeker | 15:462c8c89fe35 | 40 | |
Schreeker | 5:c0d6d490dd5b | 41 | /* Variabeln */ |
Schreeker | 7:882edb5f9466 | 42 | |
NilsKemmer | 2:cf8b98404b66 | 43 | /*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/ |
Schreeker | 20:094cdb790dcb | 44 | struct stSensData stSensData = {.wSensX = 0, .wSensY = 0, .wSensZ = 0}; |
Schreeker | 7:882edb5f9466 | 45 | |
Schreeker | 20:094cdb790dcb | 46 | /*Struktur zum Speichern der umgerechneten Messdaten von stSensData*/ |
Schreeker | 20:094cdb790dcb | 47 | struct stWinkelData stWinkelData = {.i16WinkelX = 0, .i16WinkelY = 0, .i16SpannungZ = 0}; |
Schreeker | 7:882edb5f9466 | 48 | |
NilsKemmer | 2:cf8b98404b66 | 49 | /*Konfiguriert die angegebenen Pins als analoge Eingaenge*/ |
NilsKemmer | 2:cf8b98404b66 | 50 | AnalogIn oZData(PC_2); |
NilsKemmer | 2:cf8b98404b66 | 51 | AnalogIn oYData(PC_3); |
NilsKemmer | 2:cf8b98404b66 | 52 | AnalogIn oXData(PC_4); |
NilsKemmer | 2:cf8b98404b66 | 53 | |
Schreeker | 7:882edb5f9466 | 54 | /************************************************************************************ |
Schreeker | 20:094cdb790dcb | 55 | * void Sensor_vgetSensData(struct stSensData *stSensData) |
Schreeker | 7:882edb5f9466 | 56 | * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in |
Schreeker | 7:882edb5f9466 | 57 | Strukturen. |
Schreeker | 7:882edb5f9466 | 58 | * Parameter: |
Schreeker | 20:094cdb790dcb | 59 | *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 60 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 7:882edb5f9466 | 61 | * return Parameter: |
Schreeker | 7:882edb5f9466 | 62 | keine |
Schreeker | 7:882edb5f9466 | 63 | *************************************************************************************/ |
Schreeker | 20:094cdb790dcb | 64 | void Sensor_vgetSensData(struct stSensData *stSensData){ |
Schreeker | 5:c0d6d490dd5b | 65 | /* Variabeln */ |
Schreeker | 5:c0d6d490dd5b | 66 | int i=0; // Laufvariable |
Schreeker | 5:c0d6d490dd5b | 67 | double XDataRead = 0.0; // Speichervariabel für X Sampels |
Schreeker | 5:c0d6d490dd5b | 68 | double YDataRead = 0.0; // Speichervariabel für Y Sampels |
Schreeker | 5:c0d6d490dd5b | 69 | double ZDataRead = 0.0; // Speichervariabel für Z Sampels |
Schreeker | 5:c0d6d490dd5b | 70 | |
Schreeker | 5:c0d6d490dd5b | 71 | /*Auslesen der Daten, Mittelung und Speichern in Struktur*/ |
Schreeker | 5:c0d6d490dd5b | 72 | for(i=0; i<10000; i++){ |
Schreeker | 5:c0d6d490dd5b | 73 | XDataRead += oXData.read_u16(); |
NilsKemmer | 6:e57f9887ad02 | 74 | YDataRead += oYData.read_u16(); |
Schreeker | 7:882edb5f9466 | 75 | ZDataRead += oZData.read_u16(); |
Schreeker | 5:c0d6d490dd5b | 76 | } |
Schreeker | 5:c0d6d490dd5b | 77 | stSensData->wSensX = XDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 78 | stSensData->wSensY = YDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 79 | stSensData->wSensZ = ZDataRead/10000; |
Schreeker | 5:c0d6d490dd5b | 80 | |
Schreeker | 5:c0d6d490dd5b | 81 | /* Rücksetzten der Speichervariabeln*/ |
Schreeker | 5:c0d6d490dd5b | 82 | XDataRead = 0.0; |
Schreeker | 5:c0d6d490dd5b | 83 | YDataRead = 0.0; |
Schreeker | 5:c0d6d490dd5b | 84 | ZDataRead = 0.0; |
NilsKemmer | 3:740ab0a19e1d | 85 | } |
Schreeker | 7:882edb5f9466 | 86 | |
Schreeker | 7:882edb5f9466 | 87 | /************************************************************************************ |
Schreeker | 20:094cdb790dcb | 88 | * void Sensor_vcalcData(struct stSensData *stSensData, struct stWinkelData *stWinkelData) |
Schreeker | 7:882edb5f9466 | 89 | * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für |
Schreeker | 7:882edb5f9466 | 90 | LED-Ansteuerung. |
Schreeker | 7:882edb5f9466 | 91 | * Parameter: |
Schreeker | 20:094cdb790dcb | 92 | *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern |
Schreeker | 7:882edb5f9466 | 93 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 20:094cdb790dcb | 94 | *stWinkelData: Pointer auf eine Struktur vom Typ stWinkelData zum Abspeichern |
Schreeker | 20:094cdb790dcb | 95 | der berechneten Winkel für die X- und Y-Achse, sowie Spannungswert |
Schreeker | 20:094cdb790dcb | 96 | für die Z-Achse. |
Schreeker | 7:882edb5f9466 | 97 | * return Parameter: |
Schreeker | 7:882edb5f9466 | 98 | keine |
Schreeker | 7:882edb5f9466 | 99 | *************************************************************************************/ |
Schreeker | 20:094cdb790dcb | 100 | void Sensor_vcalcData(struct stSensData *stSensData, struct stWinkelData *stWinkelData){ |
NilsKemmer | 3:740ab0a19e1d | 101 | /*Variablen*/ |
Schreeker | 20:094cdb790dcb | 102 | double dGMessX = 0.0; |
Schreeker | 20:094cdb790dcb | 103 | double dGMessY = 0.0; |
Schreeker | 20:094cdb790dcb | 104 | double dGMessZ = 0.0; |
Schreeker | 9:38d287593320 | 105 | |
Schreeker | 20:094cdb790dcb | 106 | byte bVorzeichenX = 0; |
Schreeker | 20:094cdb790dcb | 107 | byte bVorzeichenY = 0; |
Schreeker | 9:38d287593320 | 108 | |
Schreeker | 7:882edb5f9466 | 109 | /* Berechnung des Z-Winkels */ |
Schreeker | 7:882edb5f9466 | 110 | dGMessZ = (stSensData->wSensZ/65535.0)*3.3; |
Schreeker | 16:9b20d24aae18 | 111 | stWinkelData->i16SpannungZ = dGMessZ*10000; |
Schreeker | 9:38d287593320 | 112 | |
Schreeker | 7:882edb5f9466 | 113 | /* Berechnung des X-Winkels */ |
Schreeker | 7:882edb5f9466 | 114 | dGMessX = (stSensData->wSensX/65535.0)*3.3; |
Schreeker | 9:38d287593320 | 115 | /* Auswertung des Vorzeichens */ |
Schreeker | 9:38d287593320 | 116 | if(dGMessX<URefX){ |
Schreeker | 20:094cdb790dcb | 117 | bVorzeichenX = 1; |
Schreeker | 9:38d287593320 | 118 | } |
Schreeker | 9:38d287593320 | 119 | stWinkelData->i16WinkelX = dGMessX*10000; |
Schreeker | 5:c0d6d490dd5b | 120 | dGMessX = (int)(dGMessX*1000)/1000.0; |
Schreeker | 7:882edb5f9466 | 121 | dGMessX = abs(dGMessX-URefX)/(UDiffX); |
Schreeker | 4:ed779bcb8ce6 | 122 | dGMessX = (int)(dGMessX*1000)/1000.0; |
Schreeker | 4:ed779bcb8ce6 | 123 | if(dGMessX<=1 || dGMessX>=-1){ |
Schreeker | 5:c0d6d490dd5b | 124 | stWinkelData->i16WinkelX = asin(dGMessX)*(180/pi); |
Schreeker | 9:38d287593320 | 125 | } |
Schreeker | 20:094cdb790dcb | 126 | if(bVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX; |
Schreeker | 20:094cdb790dcb | 127 | |
Schreeker | 20:094cdb790dcb | 128 | /* Berechnung des Y-Winkels */ |
Schreeker | 5:c0d6d490dd5b | 129 | dGMessY = (stSensData->wSensY/65535.0)*3.3; |
Schreeker | 20:094cdb790dcb | 130 | |
Schreeker | 9:38d287593320 | 131 | /* Auswertung des Vorzeichens */ |
Schreeker | 9:38d287593320 | 132 | if(dGMessY<URefY){ |
Schreeker | 20:094cdb790dcb | 133 | bVorzeichenY = 1; |
Schreeker | 9:38d287593320 | 134 | } |
Schreeker | 7:882edb5f9466 | 135 | stWinkelData->i16WinkelY = dGMessY*10000; |
NilsKemmer | 6:e57f9887ad02 | 136 | dGMessY = (int)(dGMessY*1000)/1000.0; |
Schreeker | 7:882edb5f9466 | 137 | dGMessY = abs(dGMessY-URefY)/UDiffY; |
NilsKemmer | 6:e57f9887ad02 | 138 | dGMessY = (int)(dGMessY*1000)/1000.0; |
Schreeker | 4:ed779bcb8ce6 | 139 | if(dGMessY<=1 || dGMessY>=-1){ |
Schreeker | 7:882edb5f9466 | 140 | stWinkelData->i16WinkelY = asin(dGMessY)*(180/pi); |
Schreeker | 9:38d287593320 | 141 | } |
Schreeker | 20:094cdb790dcb | 142 | if(bVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY; |
Schreeker | 11:5861bc23022a | 143 | } |
Schreeker | 11:5861bc23022a | 144 | |
Schreeker | 11:5861bc23022a | 145 | /************************************************************************************ |
Schreeker | 20:094cdb790dcb | 146 | * void void Sensor_vDebugData(struct stSensData *stSensData, struct stWinkelData *stWinkelData) |
Schreeker | 11:5861bc23022a | 147 | * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der |
Schreeker | 20:094cdb790dcb | 148 | Nulllage und für Debugzwecke. Speicherung der Spannungen in stWinkelData |
Schreeker | 11:5861bc23022a | 149 | * Parameter: |
Schreeker | 20:094cdb790dcb | 150 | *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern |
Schreeker | 20:094cdb790dcb | 151 | der X-, Y-, und Z-Daten des Sensors. |
Schreeker | 20:094cdb790dcb | 152 | *stWinkelData: Pointer auf eine Struktur vom Typ stWinkelData zum Abspeichern |
Schreeker | 11:5861bc23022a | 153 | der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse. |
Schreeker | 11:5861bc23022a | 154 | * return Parameter: |
Schreeker | 11:5861bc23022a | 155 | keine |
Schreeker | 11:5861bc23022a | 156 | *************************************************************************************/ |
Schreeker | 20:094cdb790dcb | 157 | void Sensor_vDebugData(struct stSensData *stSensData, struct stWinkelData *stWinkelData){ |
Schreeker | 20:094cdb790dcb | 158 | /*Variablen*/ |
Schreeker | 11:5861bc23022a | 159 | double dGMessX; |
Schreeker | 11:5861bc23022a | 160 | double dGMessY; |
Schreeker | 11:5861bc23022a | 161 | double dGMessZ; |
Schreeker | 11:5861bc23022a | 162 | |
Schreeker | 11:5861bc23022a | 163 | /* Berechnung des Z-Winkels */ |
Schreeker | 11:5861bc23022a | 164 | dGMessZ = (stSensData->wSensZ/65535.0)*3.3; |
Schreeker | 16:9b20d24aae18 | 165 | stWinkelData->i16SpannungZ = dGMessZ*10000; |
Schreeker | 11:5861bc23022a | 166 | |
Schreeker | 11:5861bc23022a | 167 | /* Berechnung des X-Winkels */ |
Schreeker | 11:5861bc23022a | 168 | dGMessX = (stSensData->wSensX/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 169 | stWinkelData->i16WinkelX = dGMessX*10000; |
Schreeker | 11:5861bc23022a | 170 | |
Schreeker | 11:5861bc23022a | 171 | /* Berechnung des Y-Winkels */ |
Schreeker | 11:5861bc23022a | 172 | dGMessY = (stSensData->wSensY/65535.0)*3.3; |
Schreeker | 11:5861bc23022a | 173 | stWinkelData->i16WinkelY = dGMessY*10000; |
Schreeker | 11:5861bc23022a | 174 | } |