Subversion Repositories FlightCtrl

Rev

Rev 130 | Blame | Compare with Previous | Last modification | View Log | RSS feed

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 10.2007 by Christopher Hartmann / Daniel Schmitz
// +
// + Bitte die read_me Datei beachten! Es handelt sich hierbei um eine BETAVersion!
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "main.h"
#include "math.h"

// GPS feste Variablen++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
volatile int  alpha = 0;

long zwn = 0, zwe = 0, zwn1 = 0, zwe1 = 0, zwn2 = 0, zwe2 = 0, entf_x = 0, entf_y = 0;

int x=0;
int hoehedurchlauf=0;

float gps_sin=0;
float gps_cos=0;

signed int GPS_Nick = 0;
signed int GPS_Roll = 0;

long alpha2 = 900;
long GPS_Nick2 = 0;
long GPS_Roll2 = 0;
 
void gps_main(void)
{
if (StickNick>-15 && StickNick<15 && StickRoll>-15 && StickRoll<15){
stick_time++;
 if (stick_time==2){
 sticks_centered=1;}
 else if (stick_time>35){
 stick_time=0;
 }}
 else
{stick_time=0; sticks_centered=0;}


if (actualPos.state != 0 && gps_new==1 && Poti1>0){                             //Beginn GPS-Position-Hold



if (gps_getpos != 0 && (Poti2 == 0||gps_gethome==5) && sticks_centered==1){                                                             //PH aktivieren
target_x = actualPos.northing;
target_y = actualPos.easting;
if (gps_gethome!=5){beeptime = 50;}
gps_getpos = 0;}


if (Poti2>0 && gps_gethome==1){                   // Home anfliegen

target_x = gps_home_x;
target_y = gps_home_y;

if ((actualPos.northing < target_x+200 && actualPos.northing > target_x-200) && (actualPos.easting < target_y+200 && actualPos.easting > target_y-200) && homing_state !=1)
{beeptime = 100; homing_state=1; gps_getpos = 0;}else {beeptime = 50;}

//Höhenreglung für Home-Anflug
if (SollHoehe > home_height && hoehedurchlauf==2){SollHoehe=SollHoehe-1;
hoehedurchlauf=0;}
if (SollHoehe < home_height && hoehedurchlauf==2){SollHoehe=SollHoehe+1;
hoehedurchlauf=0;}
else if ((SollHoehe > home_height || SollHoehe < home_height) && hoehedurchlauf<2) {hoehedurchlauf++;}}


if (sticks_centered==1){
//Regler ##########################################################################################################################
//P-Regler

zwn = (target_x-actualPos.northing)*(gps_p);
zwe = (target_y-actualPos.easting)*(gps_p);

//D-Regler
zwn2 = (actualPos.velNorth)*(-gps_d);
zwe2 = (actualPos.velEast)*(-gps_d);

//Rotationsmatrix + Kompass########################################################################################################

if (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV){
alpha = komp_dreh+KompassStartwert;                    
if (alpha>359) {alpha=alpha-360;}

if (alpha != alpha2){
gps_sin =floor(sin(alpha*M_PI/180)*100)/100;
gps_cos =floor(cos(alpha*M_PI/180)*100)/100;
alpha2 = alpha;
}

GPS_Nick2 = (zwn+zwn2)/skal;
GPS_Roll2 = (zwe+zwe2)/skal;

GPS_Nick= (gps_sin*GPS_Roll2)+(gps_cos*GPS_Nick2);
GPS_Roll= (gps_cos*GPS_Roll2)-(gps_sin*GPS_Nick2);

}else{
GPS_Nick = (zwn+zwn2)/skal;
GPS_Roll = (zwe+zwe2)/skal;
}

GPS_Nick=GPS_Nick*-1;

//GPS-Min-Max Prüfung###############################################################################################################
if (GPS_Nick>gpsmax){GPS_Nick=gpsmax;} else if (GPS_Nick<(-1*gpsmax)){GPS_Nick=(-1*gpsmax);}
if (GPS_Roll>gpsmax){GPS_Roll=gpsmax;} else if (GPS_Roll<(-1*gpsmax)){GPS_Roll=(-1*gpsmax);}

gps_new=0;
}else{
gps_getpos=5;
GPS_Nick=0;
GPS_Roll=0;}}
}