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

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