
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
Sensor.cpp
- Committer:
- Schreeker
- Date:
- 2016-07-06
- Revision:
- 17:0b9e7a05b203
- Parent:
- 16:9b20d24aae18
- Child:
- 20:094cdb790dcb
File content as of revision 17:0b9e7a05b203:
/********************************************************************************** * File name: Sensor.h * Zweck: Beinhaltet alle Funktionen zum Auslesen des Beschleunigungssensors bezüglich der X-, Y-, Z-Koordinaten * Author: Simon Rutzen, Nils Kemmer * Changes: keine ***********************************************************************************/ /*Include*/ #include "Sensor.h" #include "mbed.h" #include "math.h" /*define*/ #define pi 3.1412 #define URefX 1.6267 // Kalibrierung. Unsicherheit auf der letzten Stelle #define UDiffX 0.3203 // Kalibrierung. X auf 90° entspricht 1,9470, X auf -90° entspricht 1.2970, 0° entspricht 1,6267 // UDiffX = X auf 90° - Nullage 0° #define URefY 1.6311 // Kalibrierung. Unsicherheit auf der letzten Stelle #define UDiffY 0.3289 // Kalibrierung. Y auf -90° entspricht 1,2978 V, Y auf 90° entspricht 1.9600, 0° entspricht 1,6311 // UDiffY = Y auf 90° - Nullage 0° /* Variabeln */ /*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/ struct SensData stSensData = {.wSensX = 0, .wSensY = 0, .wSensZ = 0}; /*Struktur zum Speichern der umgerechneten Messdaten von SensData*/ struct WinkelData stWinkelData = {.i16WinkelX = 0, .i16WinkelY = 0, .i16SpannungZ = 0}; /*Konfiguriert die angegebenen Pins als analoge Eingaenge*/ AnalogIn oZData(PC_2); AnalogIn oYData(PC_3); AnalogIn oXData(PC_4); /************************************************************************************ * void vgetSensData(struct SensData *stSensData) * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in Strukturen. * Parameter: *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern der X-, Y-, und Z-Daten des Sensors. * return Parameter: keine *************************************************************************************/ void vgetSensData(struct SensData *stSensData){ /* Variabeln */ int i=0; // Laufvariable double XDataRead = 0.0; // Speichervariabel für X Sampels double YDataRead = 0.0; // Speichervariabel für Y Sampels double ZDataRead = 0.0; // Speichervariabel für Z Sampels /*Auslesen der Daten, Mittelung und Speichern in Struktur*/ for(i=0; i<10000; i++){ XDataRead += oXData.read_u16(); YDataRead += oYData.read_u16(); ZDataRead += oZData.read_u16(); } stSensData->wSensX = XDataRead/10000; stSensData->wSensY = YDataRead/10000; stSensData->wSensZ = ZDataRead/10000; /* Rücksetzten der Speichervariabeln*/ XDataRead = 0.0; YDataRead = 0.0; ZDataRead = 0.0; } /************************************************************************************ * void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData) * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für LED-Ansteuerung. * Parameter: *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern der X-, Y-, und Z-Daten des Sensors. *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern der berechneten Winkel für die X-, Y- und Z-Achse. * return Parameter: keine *************************************************************************************/ void vcalcData(struct SensData *stSensData, struct WinkelData *stWinkelData){ /*Variablen*/ double dGMessX; double dGMessY; double dGMessZ; int iVorzeichenX = 0; int iVorzeichenY = 0; /* Berechnung des Z-Winkels */ dGMessZ = (stSensData->wSensZ/65535.0)*3.3; stWinkelData->i16SpannungZ = dGMessZ*10000; /* Berechnung des X-Winkels */ dGMessX = (stSensData->wSensX/65535.0)*3.3; /* Auswertung des Vorzeichens */ if(dGMessX<URefX){ iVorzeichenX = 1; } stWinkelData->i16WinkelX = dGMessX*10000; dGMessX = (int)(dGMessX*1000)/1000.0; dGMessX = abs(dGMessX-URefX)/(UDiffX); dGMessX = (int)(dGMessX*1000)/1000.0; if(dGMessX<=1 || dGMessX>=-1){ stWinkelData->i16WinkelX = asin(dGMessX)*(180/pi); } if(iVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX; /* Berechnung des Y-Winkels */ dGMessY = (stSensData->wSensY/65535.0)*3.3; /* Auswertung des Vorzeichens */ if(dGMessY<URefY){ iVorzeichenY = 1; } stWinkelData->i16WinkelY = dGMessY*10000; dGMessY = (int)(dGMessY*1000)/1000.0; dGMessY = abs(dGMessY-URefY)/UDiffY; dGMessY = (int)(dGMessY*1000)/1000.0; if(dGMessY<=1 || dGMessY>=-1){ stWinkelData->i16WinkelY = asin(dGMessY)*(180/pi); } if(iVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY; } /************************************************************************************ * void void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData) * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der Nulllage und für Debugzwecke. Speicherung der Spannungen in WinkelData * Parameter: *stSensData: Pointer auf eine Struktur vom Type SensData zum Abspeichern der X-, Y-, und Z-Daten des Sensors. *stWinkelData: Pointer auf eine Struktur vom Typ WinkelData zum Abspeichern der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse. * return Parameter: keine *************************************************************************************/ void vDebugData(struct SensData *stSensData, struct WinkelData *stWinkelData){ /*Variablen*/ double dGMessX; double dGMessY; double dGMessZ; /* Berechnung des Z-Winkels */ dGMessZ = (stSensData->wSensZ/65535.0)*3.3; stWinkelData->i16SpannungZ = dGMessZ*10000; /* Berechnung des X-Winkels */ dGMessX = (stSensData->wSensX/65535.0)*3.3; stWinkelData->i16WinkelX = dGMessX*10000; /* Berechnung des Y-Winkels */ dGMessY = (stSensData->wSensY/65535.0)*3.3; stWinkelData->i16WinkelY = dGMessY*10000; }