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

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