Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.

Dependencies:   TextLCD mbed

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?

UserRevisionLine numberNew 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 }