Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.

Dependencies:   TextLCD mbed

Sensor.cpp

Committer:
Schreeker
Date:
2016-07-03
Revision:
15:462c8c89fe35
Parent:
13:676721490d37
Child:
16:9b20d24aae18

File content as of revision 15:462c8c89fe35:

/********************************************************************************** 
* 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.141

#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 

#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
 
/* Variabeln */

/*Struktur zum Speichern der von den A/D-Wandlern des µC ausgelesenen Messdaten*/
struct SensData stSensData;

/*Struktur zum Speichern der umgerechneten Messdaten von SensData*/
struct WinkelData stWinkelData;

/*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->i16WinkelZ = 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->i16WinkelZ = 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;
        }