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:
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?

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