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:
Wed Jul 06 10:31:53 2016 +0000
Revision:
17:0b9e7a05b203
Parent:
16:9b20d24aae18
Child:
20:094cdb790dcb
Letzte Kalibrierung der Achsen und Anpassen der Ueberkopflage ab +-80 Grad Lage der X oder Y Achse. 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 17:0b9e7a05b203 15 #define pi 3.1412
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 17:0b9e7a05b203 19 // UDiffX = X auf 90° - Nullage 0°
Schreeker 7:882edb5f9466 20
Schreeker 15:462c8c89fe35 21 #define URefY 1.6311 // Kalibrierung. Unsicherheit auf der letzten Stelle
Schreeker 15:462c8c89fe35 22 #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 23 // UDiffY = Y auf 90° - Nullage 0°
Schreeker 15:462c8c89fe35 24
Schreeker 5:c0d6d490dd5b 25 /* Variabeln */
Schreeker 7:882edb5f9466 26
NilsKemmer 2:cf8b98404b66 27 /*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/
Schreeker 17:0b9e7a05b203 28 struct SensData stSensData = {.wSensX = 0, .wSensY = 0, .wSensZ = 0};
Schreeker 7:882edb5f9466 29
NilsKemmer 3:740ab0a19e1d 30 /*Struktur zum Speichern der umgerechneten Messdaten von SensData*/
Schreeker 17:0b9e7a05b203 31 struct WinkelData stWinkelData = {.i16WinkelX = 0, .i16WinkelY = 0, .i16SpannungZ = 0};
Schreeker 7:882edb5f9466 32
NilsKemmer 2:cf8b98404b66 33 /*Konfiguriert die angegebenen Pins als analoge Eingaenge*/
NilsKemmer 2:cf8b98404b66 34 AnalogIn oZData(PC_2);
NilsKemmer 2:cf8b98404b66 35 AnalogIn oYData(PC_3);
NilsKemmer 2:cf8b98404b66 36 AnalogIn oXData(PC_4);
NilsKemmer 2:cf8b98404b66 37
Schreeker 7:882edb5f9466 38 /************************************************************************************
Schreeker 7:882edb5f9466 39 * void vgetSensData(struct SensData *stSensData)
Schreeker 7:882edb5f9466 40 * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in
Schreeker 7:882edb5f9466 41 Strukturen.
Schreeker 7:882edb5f9466 42 * Parameter:
Schreeker 7:882edb5f9466 43 *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern
Schreeker 7:882edb5f9466 44 der X-, Y-, und Z-Daten des Sensors.
Schreeker 7:882edb5f9466 45 * return Parameter:
Schreeker 7:882edb5f9466 46 keine
Schreeker 7:882edb5f9466 47 *************************************************************************************/
Schreeker 5:c0d6d490dd5b 48 void vgetSensData(struct SensData *stSensData){
Schreeker 5:c0d6d490dd5b 49 /* Variabeln */
Schreeker 5:c0d6d490dd5b 50 int i=0; // Laufvariable
Schreeker 5:c0d6d490dd5b 51 double XDataRead = 0.0; // Speichervariabel für X Sampels
Schreeker 5:c0d6d490dd5b 52 double YDataRead = 0.0; // Speichervariabel für Y Sampels
Schreeker 5:c0d6d490dd5b 53 double ZDataRead = 0.0; // Speichervariabel für Z Sampels
Schreeker 5:c0d6d490dd5b 54
Schreeker 5:c0d6d490dd5b 55 /*Auslesen der Daten, Mittelung und Speichern in Struktur*/
Schreeker 5:c0d6d490dd5b 56 for(i=0; i<10000; i++){
Schreeker 5:c0d6d490dd5b 57 XDataRead += oXData.read_u16();
NilsKemmer 6:e57f9887ad02 58 YDataRead += oYData.read_u16();
Schreeker 7:882edb5f9466 59 ZDataRead += oZData.read_u16();
Schreeker 5:c0d6d490dd5b 60 }
Schreeker 5:c0d6d490dd5b 61 stSensData->wSensX = XDataRead/10000;
Schreeker 5:c0d6d490dd5b 62 stSensData->wSensY = YDataRead/10000;
Schreeker 5:c0d6d490dd5b 63 stSensData->wSensZ = ZDataRead/10000;
Schreeker 5:c0d6d490dd5b 64
Schreeker 5:c0d6d490dd5b 65 /* Rücksetzten der Speichervariabeln*/
Schreeker 5:c0d6d490dd5b 66 XDataRead = 0.0;
Schreeker 5:c0d6d490dd5b 67 YDataRead = 0.0;
Schreeker 5:c0d6d490dd5b 68 ZDataRead = 0.0;
NilsKemmer 3:740ab0a19e1d 69 }
Schreeker 7:882edb5f9466 70
Schreeker 7:882edb5f9466 71 /************************************************************************************
Schreeker 7:882edb5f9466 72 * void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData)
Schreeker 7:882edb5f9466 73 * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für
Schreeker 7:882edb5f9466 74 LED-Ansteuerung.
Schreeker 7:882edb5f9466 75 * Parameter:
Schreeker 7:882edb5f9466 76 *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern
Schreeker 7:882edb5f9466 77 der X-, Y-, und Z-Daten des Sensors.
Schreeker 7:882edb5f9466 78 *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern
Schreeker 7:882edb5f9466 79 der berechneten Winkel für die X-, Y- und Z-Achse.
Schreeker 7:882edb5f9466 80 * return Parameter:
Schreeker 7:882edb5f9466 81 keine
Schreeker 7:882edb5f9466 82 *************************************************************************************/
Schreeker 5:c0d6d490dd5b 83 void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData){
NilsKemmer 3:740ab0a19e1d 84 /*Variablen*/
NilsKemmer 3:740ab0a19e1d 85 double dGMessX;
NilsKemmer 3:740ab0a19e1d 86 double dGMessY;
NilsKemmer 3:740ab0a19e1d 87 double dGMessZ;
Schreeker 9:38d287593320 88
Schreeker 9:38d287593320 89 int iVorzeichenX = 0;
Schreeker 9:38d287593320 90 int iVorzeichenY = 0;
Schreeker 9:38d287593320 91
Schreeker 7:882edb5f9466 92 /* Berechnung des Z-Winkels */
Schreeker 7:882edb5f9466 93 dGMessZ = (stSensData->wSensZ/65535.0)*3.3;
Schreeker 16:9b20d24aae18 94 stWinkelData->i16SpannungZ = dGMessZ*10000;
Schreeker 9:38d287593320 95
Schreeker 7:882edb5f9466 96 /* Berechnung des X-Winkels */
Schreeker 7:882edb5f9466 97 dGMessX = (stSensData->wSensX/65535.0)*3.3;
Schreeker 9:38d287593320 98 /* Auswertung des Vorzeichens */
Schreeker 9:38d287593320 99 if(dGMessX<URefX){
Schreeker 9:38d287593320 100 iVorzeichenX = 1;
Schreeker 9:38d287593320 101 }
Schreeker 9:38d287593320 102 stWinkelData->i16WinkelX = dGMessX*10000;
Schreeker 5:c0d6d490dd5b 103 dGMessX = (int)(dGMessX*1000)/1000.0;
Schreeker 7:882edb5f9466 104 dGMessX = abs(dGMessX-URefX)/(UDiffX);
Schreeker 4:ed779bcb8ce6 105 dGMessX = (int)(dGMessX*1000)/1000.0;
Schreeker 4:ed779bcb8ce6 106 if(dGMessX<=1 || dGMessX>=-1){
Schreeker 5:c0d6d490dd5b 107 stWinkelData->i16WinkelX = asin(dGMessX)*(180/pi);
Schreeker 9:38d287593320 108 }
Schreeker 9:38d287593320 109 if(iVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX;
Schreeker 7:882edb5f9466 110 /* Berechnung des Y-Winkels */
Schreeker 5:c0d6d490dd5b 111 dGMessY = (stSensData->wSensY/65535.0)*3.3;
Schreeker 9:38d287593320 112 /* Auswertung des Vorzeichens */
Schreeker 9:38d287593320 113 if(dGMessY<URefY){
Schreeker 9:38d287593320 114 iVorzeichenY = 1;
Schreeker 9:38d287593320 115 }
Schreeker 7:882edb5f9466 116 stWinkelData->i16WinkelY = dGMessY*10000;
NilsKemmer 6:e57f9887ad02 117 dGMessY = (int)(dGMessY*1000)/1000.0;
Schreeker 7:882edb5f9466 118 dGMessY = abs(dGMessY-URefY)/UDiffY;
NilsKemmer 6:e57f9887ad02 119 dGMessY = (int)(dGMessY*1000)/1000.0;
Schreeker 4:ed779bcb8ce6 120 if(dGMessY<=1 || dGMessY>=-1){
Schreeker 7:882edb5f9466 121 stWinkelData->i16WinkelY = asin(dGMessY)*(180/pi);
Schreeker 9:38d287593320 122 }
Schreeker 9:38d287593320 123 if(iVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY;
Schreeker 11:5861bc23022a 124 }
Schreeker 11:5861bc23022a 125
Schreeker 11:5861bc23022a 126 /************************************************************************************
Schreeker 11:5861bc23022a 127 * void void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData)
Schreeker 11:5861bc23022a 128 * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der
Schreeker 11:5861bc23022a 129 Nulllage und für Debugzwecke. Speicherung der Spannungen in WinkelData
Schreeker 11:5861bc23022a 130 * Parameter:
Schreeker 11:5861bc23022a 131 *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern
Schreeker 11:5861bc23022a 132 der X-, Y-, und Z-Daten des Sensors.
Schreeker 11:5861bc23022a 133 *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern
Schreeker 11:5861bc23022a 134 der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse.
Schreeker 11:5861bc23022a 135 * return Parameter:
Schreeker 11:5861bc23022a 136 keine
Schreeker 11:5861bc23022a 137 *************************************************************************************/
Schreeker 11:5861bc23022a 138 void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData){
Schreeker 11:5861bc23022a 139 /*Variablen*/
Schreeker 11:5861bc23022a 140 double dGMessX;
Schreeker 11:5861bc23022a 141 double dGMessY;
Schreeker 11:5861bc23022a 142 double dGMessZ;
Schreeker 11:5861bc23022a 143
Schreeker 11:5861bc23022a 144 /* Berechnung des Z-Winkels */
Schreeker 11:5861bc23022a 145 dGMessZ = (stSensData->wSensZ/65535.0)*3.3;
Schreeker 16:9b20d24aae18 146 stWinkelData->i16SpannungZ = dGMessZ*10000;
Schreeker 11:5861bc23022a 147
Schreeker 11:5861bc23022a 148 /* Berechnung des X-Winkels */
Schreeker 11:5861bc23022a 149 dGMessX = (stSensData->wSensX/65535.0)*3.3;
Schreeker 11:5861bc23022a 150 stWinkelData->i16WinkelX = dGMessX*10000;
Schreeker 11:5861bc23022a 151
Schreeker 11:5861bc23022a 152 /* Berechnung des Y-Winkels */
Schreeker 11:5861bc23022a 153 dGMessY = (stSensData->wSensY/65535.0)*3.3;
Schreeker 11:5861bc23022a 154 stWinkelData->i16WinkelY = dGMessY*10000;
Schreeker 11:5861bc23022a 155 }