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-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;
        }