
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-29
- Revision:
- 20:094cdb790dcb
- Parent:
- 17:0b9e7a05b203
File content as of revision 20:094cdb790dcb:
/********************************************************************************** * 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: 23.05.16 Erstellung des Files, Strukturen und Funktionen vgetSensData, vcalcdata 24.05.16 vcalcData Berechnung des Winkels eingefügt (X-Achse), Defines eingefügt Referenzmessungswerte X-Y-Z Achse 0° und +-90° eingetragen, vgetSensData Mittelung des Messwerte eingefügt (alle Achsen), calcData Werte auf 3 Nachkommastellen begrenzt 25.05.16 Y-Achsen Winkelberechnungen analog zu X-Achse eingefügt 27.05.16 Defines Referenzwerte zur Berechnung der Winkel aller Achsen eingefügt Funktionen Kommentare eingefügt 05.06.16 Unterscheidung negativer oder positiver Winkel eingefügt (Neigung aller Achsen) 28.06.16 vDebugData zur Ermittlung der Spannungswerte vom a-Sensor erstellt 30.06.16 Neue Kalibrierung, Defines geändert 06.07.16 Endgültige Kalibrierung, Defines angepasst 07.07.16 Überkopflage bei 80° definiert, Defines angepasst 29.07.16 Anpassung an Programmierrichtlinie-Dokument und letzte endgültige Kontrolle Simon Rutzen ***********************************************************************************/ /*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 stSensData stSensData = {.wSensX = 0, .wSensY = 0, .wSensZ = 0}; /*Struktur zum Speichern der umgerechneten Messdaten von stSensData*/ struct stWinkelData 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 Sensor_vgetSensData(struct stSensData *stSensData) * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in Strukturen. * Parameter: *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern der X-, Y-, und Z-Daten des Sensors. * return Parameter: keine *************************************************************************************/ void Sensor_vgetSensData(struct stSensData *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 Sensor_vcalcData(struct stSensData *stSensData, struct stWinkelData *stWinkelData) * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für LED-Ansteuerung. * Parameter: *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern der X-, Y-, und Z-Daten des Sensors. *stWinkelData: Pointer auf eine Struktur vom Typ stWinkelData zum Abspeichern der berechneten Winkel für die X- und Y-Achse, sowie Spannungswert für die Z-Achse. * return Parameter: keine *************************************************************************************/ void Sensor_vcalcData(struct stSensData *stSensData, struct stWinkelData *stWinkelData){ /*Variablen*/ double dGMessX = 0.0; double dGMessY = 0.0; double dGMessZ = 0.0; byte bVorzeichenX = 0; byte bVorzeichenY = 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){ bVorzeichenX = 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(bVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX; /* Berechnung des Y-Winkels */ dGMessY = (stSensData->wSensY/65535.0)*3.3; /* Auswertung des Vorzeichens */ if(dGMessY<URefY){ bVorzeichenY = 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(bVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY; } /************************************************************************************ * void void Sensor_vDebugData(struct stSensData *stSensData, struct stWinkelData *stWinkelData) * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der Nulllage und für Debugzwecke. Speicherung der Spannungen in stWinkelData * Parameter: *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern der X-, Y-, und Z-Daten des Sensors. *stWinkelData: Pointer auf eine Struktur vom Typ stWinkelData zum Abspeichern der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse. * return Parameter: keine *************************************************************************************/ void Sensor_vDebugData(struct stSensData *stSensData, struct stWinkelData *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; }