EMSY-Projekt / Mbed 2 deprecated EMSY-Projekt_Lagesensor

Dependencies:   TextLCD mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Sensor.cpp Source File

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         }