Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Sensor.cpp
00001 /********************************************************************************** 00002 * File name: Sensor.h 00003 * Zweck: Beinhaltet alle Funktionen zum Auslesen des Beschleunigungssensors 00004 bezüglich der X-, Y-, Z-Koordinaten 00005 * Author: Simon Rutzen, Nils Kemmer 00006 * Changes: 00007 23.05.16 Erstellung des Files, Strukturen und Funktionen vgetSensData, vcalcdata 00008 24.05.16 vcalcData Berechnung des Winkels eingefügt (X-Achse), Defines eingefügt 00009 Referenzmessungswerte X-Y-Z Achse 0° und +-90° eingetragen, vgetSensData 00010 Mittelung des Messwerte eingefügt (alle Achsen), calcData Werte auf 3 00011 Nachkommastellen begrenzt 00012 25.05.16 Y-Achsen Winkelberechnungen analog zu X-Achse eingefügt 00013 27.05.16 Defines Referenzwerte zur Berechnung der Winkel aller Achsen eingefügt 00014 Funktionen Kommentare eingefügt 00015 05.06.16 Unterscheidung negativer oder positiver Winkel eingefügt (Neigung aller 00016 Achsen) 00017 28.06.16 vDebugData zur Ermittlung der Spannungswerte vom a-Sensor erstellt 00018 30.06.16 Neue Kalibrierung, Defines geändert 00019 06.07.16 Endgültige Kalibrierung, Defines angepasst 00020 07.07.16 Überkopflage bei 80° definiert, Defines angepasst 00021 29.07.16 Anpassung an Programmierrichtlinie-Dokument und letzte endgültige 00022 Kontrolle Simon Rutzen 00023 ***********************************************************************************/ 00024 00025 /*Include*/ 00026 #include "Sensor.h" 00027 #include "mbed.h" 00028 #include "math.h" 00029 00030 /*define*/ 00031 #define pi 3.1412 00032 00033 #define URefX 1.6267 // Kalibrierung. Unsicherheit auf der letzten Stelle 00034 #define UDiffX 0.3203 // Kalibrierung. X auf 90° entspricht 1,9470, X auf -90° entspricht 1.2970, 0° entspricht 1,6267 00035 // UDiffX = X auf 90° - Nullage 0° 00036 00037 #define URefY 1.6311 // Kalibrierung. Unsicherheit auf der letzten Stelle 00038 #define UDiffY 0.3289 // Kalibrierung. Y auf -90° entspricht 1,2978 V, Y auf 90° entspricht 1.9600, 0° entspricht 1,6311 00039 // UDiffY = Y auf 90° - Nullage 0° 00040 00041 /* Variabeln */ 00042 00043 /*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/ 00044 struct stSensData stSensData = {.wSensX = 0, .wSensY = 0, .wSensZ = 0}; 00045 00046 /*Struktur zum Speichern der umgerechneten Messdaten von stSensData*/ 00047 struct stWinkelData stWinkelData = {.i16WinkelX = 0, .i16WinkelY = 0, .i16SpannungZ = 0}; 00048 00049 /*Konfiguriert die angegebenen Pins als analoge Eingaenge*/ 00050 AnalogIn oZData(PC_2); 00051 AnalogIn oYData(PC_3); 00052 AnalogIn oXData(PC_4); 00053 00054 /************************************************************************************ 00055 * void Sensor_vgetSensData(struct stSensData *stSensData) 00056 * Zweck: Auslesen der Sensordaten (X-, Y- und Z-Daten) und speichern in 00057 Strukturen. 00058 * Parameter: 00059 *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern 00060 der X-, Y-, und Z-Daten des Sensors. 00061 * return Parameter: 00062 keine 00063 *************************************************************************************/ 00064 void Sensor_vgetSensData(struct stSensData *stSensData){ 00065 /* Variabeln */ 00066 int i=0; // Laufvariable 00067 double XDataRead = 0.0; // Speichervariabel für X Sampels 00068 double YDataRead = 0.0; // Speichervariabel für Y Sampels 00069 double ZDataRead = 0.0; // Speichervariabel für Z Sampels 00070 00071 /*Auslesen der Daten, Mittelung und Speichern in Struktur*/ 00072 for(i=0; i<10000; i++){ 00073 XDataRead += oXData.read_u16(); 00074 YDataRead += oYData.read_u16(); 00075 ZDataRead += oZData.read_u16(); 00076 } 00077 stSensData->wSensX = XDataRead/10000; 00078 stSensData->wSensY = YDataRead/10000; 00079 stSensData->wSensZ = ZDataRead/10000; 00080 00081 /* Rücksetzten der Speichervariabeln*/ 00082 XDataRead = 0.0; 00083 YDataRead = 0.0; 00084 ZDataRead = 0.0; 00085 } 00086 00087 /************************************************************************************ 00088 * void Sensor_vcalcData(struct stSensData *stSensData, struct stWinkelData *stWinkelData) 00089 * Zweck: Umrechnen der Sensorwerte in Winkel, sowie Auswertung der Lage für 00090 LED-Ansteuerung. 00091 * Parameter: 00092 *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern 00093 der X-, Y-, und Z-Daten des Sensors. 00094 *stWinkelData: Pointer auf eine Struktur vom Typ stWinkelData zum Abspeichern 00095 der berechneten Winkel für die X- und Y-Achse, sowie Spannungswert 00096 für die Z-Achse. 00097 * return Parameter: 00098 keine 00099 *************************************************************************************/ 00100 void Sensor_vcalcData(struct stSensData *stSensData, struct stWinkelData *stWinkelData){ 00101 /*Variablen*/ 00102 double dGMessX = 0.0; 00103 double dGMessY = 0.0; 00104 double dGMessZ = 0.0; 00105 00106 byte bVorzeichenX = 0; 00107 byte bVorzeichenY = 0; 00108 00109 /* Berechnung des Z-Winkels */ 00110 dGMessZ = (stSensData->wSensZ/65535.0)*3.3; 00111 stWinkelData->i16SpannungZ = dGMessZ*10000; 00112 00113 /* Berechnung des X-Winkels */ 00114 dGMessX = (stSensData->wSensX/65535.0)*3.3; 00115 /* Auswertung des Vorzeichens */ 00116 if(dGMessX<URefX){ 00117 bVorzeichenX = 1; 00118 } 00119 stWinkelData->i16WinkelX = dGMessX*10000; 00120 dGMessX = (int)(dGMessX*1000)/1000.0; 00121 dGMessX = abs(dGMessX-URefX)/(UDiffX); 00122 dGMessX = (int)(dGMessX*1000)/1000.0; 00123 if(dGMessX<=1 || dGMessX>=-1){ 00124 stWinkelData->i16WinkelX = asin(dGMessX)*(180/pi); 00125 } 00126 if(bVorzeichenX) stWinkelData->i16WinkelX = -stWinkelData->i16WinkelX; 00127 00128 /* Berechnung des Y-Winkels */ 00129 dGMessY = (stSensData->wSensY/65535.0)*3.3; 00130 00131 /* Auswertung des Vorzeichens */ 00132 if(dGMessY<URefY){ 00133 bVorzeichenY = 1; 00134 } 00135 stWinkelData->i16WinkelY = dGMessY*10000; 00136 dGMessY = (int)(dGMessY*1000)/1000.0; 00137 dGMessY = abs(dGMessY-URefY)/UDiffY; 00138 dGMessY = (int)(dGMessY*1000)/1000.0; 00139 if(dGMessY<=1 || dGMessY>=-1){ 00140 stWinkelData->i16WinkelY = asin(dGMessY)*(180/pi); 00141 } 00142 if(bVorzeichenY) stWinkelData->i16WinkelY = -stWinkelData->i16WinkelY; 00143 } 00144 00145 /************************************************************************************ 00146 * void void Sensor_vDebugData(struct stSensData *stSensData, struct stWinkelData *stWinkelData) 00147 * Zweck: Umrechnung der A/D-Wandler Messwerte in Spannungen zum Kalibrieren der 00148 Nulllage und für Debugzwecke. Speicherung der Spannungen in stWinkelData 00149 * Parameter: 00150 *stSensData: Pointer auf eine Struktur vom Type stSensData zum Abspeichern 00151 der X-, Y-, und Z-Daten des Sensors. 00152 *stWinkelData: Pointer auf eine Struktur vom Typ stWinkelData zum Abspeichern 00153 der berechneten Spannungen in diesem Fall(!) für die X-, Y- und Z-Achse. 00154 * return Parameter: 00155 keine 00156 *************************************************************************************/ 00157 void Sensor_vDebugData(struct stSensData *stSensData, struct stWinkelData *stWinkelData){ 00158 /*Variablen*/ 00159 double dGMessX; 00160 double dGMessY; 00161 double dGMessZ; 00162 00163 /* Berechnung des Z-Winkels */ 00164 dGMessZ = (stSensData->wSensZ/65535.0)*3.3; 00165 stWinkelData->i16SpannungZ = dGMessZ*10000; 00166 00167 /* Berechnung des X-Winkels */ 00168 dGMessX = (stSensData->wSensX/65535.0)*3.3; 00169 stWinkelData->i16WinkelX = dGMessX*10000; 00170 00171 /* Berechnung des Y-Winkels */ 00172 dGMessY = (stSensData->wSensY/65535.0)*3.3; 00173 stWinkelData->i16WinkelY = dGMessY*10000; 00174 }
Generated on Mon Jul 18 2022 08:31:20 by
1.7.2