Subversion Repositories FlightCtrl

Rev

Rev 1102 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1102 Rev 1103
Line 94... Line 94...
94
//Salvo 12.10.2007
94
//Salvo 12.10.2007
95
uint8_t magkompass_ok=0;
95
uint8_t magkompass_ok=0;
96
uint8_t gps_cmd = GPS_CMD_STOP;
96
uint8_t gps_cmd = GPS_CMD_STOP;
97
static int       ubat_cnt =0;
97
static int       ubat_cnt =0;
98
static int gas_actual,gas_mittel; //Parameter fuer Gasreduzierung bei unterspannung
98
static int gas_actual,gas_mittel; //Parameter fuer Gasreduzierung bei unterspannung
99
int w,v;
99
int w,v,w1,v1;
100
//Salvo End
100
//Salvo End
Line 101... Line 101...
101
 
101
 
102
 //Salvo 15.12.2007 Ersatzkompass und Giergyrokompensation
102
 //Salvo 15.12.2007 Ersatzkompass und Giergyrokompensation
103
long GyroKomp_Int;
103
long GyroKomp_Int;
Line 165... Line 165...
165
struct mk_param_struct EE_Parameter;
165
struct mk_param_struct EE_Parameter;
166
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
166
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
167
int MaxStickNick = 0,MaxStickRoll = 0;
167
int MaxStickNick = 0,MaxStickRoll = 0;
168
unsigned int  modell_fliegt = 0;
168
unsigned int  modell_fliegt = 0;
169
unsigned char MikroKopterFlags = 0;
169
unsigned char MikroKopterFlags = 0;
-
 
170
//Salvo 31.12.2008
-
 
171
long waagrecht; // Mass fuer Annaeherung an Waagrecht fuer Kompasskompensation
-
 
172
// Salvo End
Line 170... Line 173...
170
 
173
 
171
//Salvo 2.1.2008 Allgemeine Debugvariablen
174
//Salvo 2.1.2008 Allgemeine Debugvariablen
172
int debug_gp_0,debug_gp_1,debug_gp_2,debug_gp_3,debug_gp_4,debug_gp_5,debug_gp_6,debug_gp_7;
175
int debug_gp_0,debug_gp_1,debug_gp_2,debug_gp_3,debug_gp_4,debug_gp_5,debug_gp_6,debug_gp_7;
Line 1103... Line 1106...
1103
if ((Kompass_Neuer_Wert > 0) && (Kompass_present>0)) //nur wenn Kompass einen neuen Wert geliefert hat
1106
if ((Kompass_Neuer_Wert > 0) && (Kompass_present>0)) //nur wenn Kompass einen neuen Wert geliefert hat
1104
{
1107
{
1105
   Kompass_Neuer_Wert = 0;
1108
   Kompass_Neuer_Wert = 0;
1106
   w = (abs(Mittelwert_AccNick));
1109
   w = (abs(Mittelwert_AccNick));
1107
   v = (abs(Mittelwert_AccRoll));
1110
   v = (abs(Mittelwert_AccRoll));
-
 
1111
   w1 = abs((int)(IntegralNick / EE_Parameter.GyroAccFaktor)); //Abfrage auch gegen Gyro  beiu Kurvenflug sonst evtl. vorgetäuschte waagrechte Lage
-
 
1112
   v1 = abs((int)(IntegralRoll / EE_Parameter.GyroAccFaktor));
-
 
1113
 
1108
   if  ((w  < ACC_WAAGRECHT_LIMIT) && (v < ACC_WAAGRECHT_LIMIT)) //Ersatzkompass und Giergyro nur mit Magnetkompass aktualisieren wenn alles ok
1114
   if  ((w1<ACC_WAAGRECHT_LIMIT)&&(w<ACC_WAAGRECHT_LIMIT)&&(v<ACC_WAAGRECHT_LIMIT)&&(v1<ACC_WAAGRECHT_LIMIT)) //Ersatzkompass und Giergyro nur mit Magnetkompass aktualisieren wenn alles ok
1109
   {
1115
   {
-
 
1116
   waagrecht = ((long)(ACC_WAAGRECHT_LIMIT-(long)w) * ((long)ACC_WAAGRECHT_LIMIT-(long)w)) *(((long)ACC_WAAGRECHT_LIMIT-(long)v)* ((long)ACC_WAAGRECHT_LIMIT-(long)v));
-
 
1117
   waagrecht =  (waagrecht * 100) /((long)ACC_WAAGRECHT_LIMIT * (long)ACC_WAAGRECHT_LIMIT * (long)ACC_WAAGRECHT_LIMIT*(long)ACC_WAAGRECHT_LIMIT) ; //bei Waagrecht  Wert = 100 
1110
        if  ((abs(KompassValue - Kompass_Value_Old)) <= 5) // Aufeinanderfolgende Werte duerfen nur minimal abweichen
1118
        if  ((abs(KompassValue - Kompass_Value_Old)) <= 5) // Aufeinanderfolgende Werte duerfen nur minimal abweichen
1111
        {
1119
        {
1112
          if ((abs(StickGier) < 20)) //Giergyroabgleich mit Kompass
1120
          if ((abs(StickGier) < 20)) //Giergyroabgleich mit Kompass
1113
          {
1121
          {
1114
                        if (cnt_stickgier_zero < 255) cnt_stickgier_zero += 1;
1122
                        if (cnt_stickgier_zero < 255) cnt_stickgier_zero += 1;
1115
                        if (cnt_stickgier_zero > 1) //nur Abgleichen wenn keine Stickbewegung da
1123
                        if (cnt_stickgier_zero > 1) //nur Abgleichen wenn keine Stickbewegung da
1116
                        {
1124
                        {
1117
                                w = (int) (GyroGier_Comp/(long)GIER_GRAD_FAKTOR);
1125
                                w = (int) (GyroGier_Comp/((long)GIER_GRAD_FAKTOR));
1118
                                v = KompassValue - gyrogier_kompass; //realen Drehwinkel seit letztem Ruecksetzen von GyroGier_Comp bestimmen
1126
                                v = (KompassValue) - gyrogier_kompass; //realen Drehwinkel seit letztem Ruecksetzen von GyroGier_Comp bestimmen
1119
                                if (v <-180) v +=360; // Uberlaufkorrektur
1127
                                if (v <-180) v +=360; // Uberlaufkorrektur
1120
                                if (v > 180) v -=360; // Uberlaufkorrektur
1128
                                if (v > 180) v -=360; // Uberlaufkorrektur
Line 1121... Line 1129...
1121
 
1129
 
-
 
1130
                                v = w-v;  //Differenz Gyro zu Kompass ist der Driftfehler
Line 1122... Line 1131...
1122
                                v = w-v;  //Differenz Gyro zu Kompass ist der Driftfehler
1131
                                v = (v * (int) waagrecht)/100; //mit Neigung bewerten
1123
 
1132
 
1124
                                if (v > GIER_COMP_MAX)  v= GIER_COMP_MAX;
1133
                                if (v > GIER_COMP_MAX)  v= GIER_COMP_MAX;
1125
                                if (v < -GIER_COMP_MAX) v= - GIER_COMP_MAX;
1134
                                if (v < -GIER_COMP_MAX) v= - GIER_COMP_MAX;
1126
                                if (abs(w) > 1)
1135
                                if (abs(v) > 0)
1127
                                {      
1136
                                {      
1128
                                        GyroGier_Comp           = 0;
1137
                                        GyroGier_Comp           = 0;
1129
                                        gyrogier_kompass        = KompassValue; // Kompasswert merken
1138
                                        gyrogier_kompass        = KompassValue; // Kompasswert merken
Line 1137... Line 1146...
1137
                cnt_stickgier_zero      = 0;
1146
                cnt_stickgier_zero      = 0;
1138
                GyroGier_Comp = 0;
1147
                GyroGier_Comp = 0;
1139
          }
1148
          }
Line 1140... Line 1149...
1140
 
1149
 
1141
          magkompass_ok = 1; // Flag dass Magnetkompass stabil arbeitet 
1150
          magkompass_ok = 1; // Flag dass Magnetkompass stabil arbeitet 
Line 1142... Line 1151...
1142
          GyroKomp_Int = (GyroKomp_Int )/(long)GIER_GRAD_FAKTOR;
1151
//        GyroKomp_Int = (GyroKomp_Int )/((long)GIER_GRAD_FAKTOR);
1143
 
1152
 
1144
          w = KompassValue - GyroKomp_Int;
-
 
1145
          if ((w > 0) && (w < 180))
1153
          w = KompassValue - (int)(GyroKomp_Int/(long)GIER_GRAD_FAKTOR);
-
 
1154
          w = w%360;
-
 
1155
          #define GYRO_KOMP_DELTA_MAX 10
1146
          {
1156
          if (w > GYRO_KOMP_DELTA_MAX)  w = GYRO_KOMP_DELTA_MAX; //Begrenzung
1147
           ++GyroKomp_Int;
1157
          if (w <-GYRO_KOMP_DELTA_MAX)  w =-GYRO_KOMP_DELTA_MAX; //Begrenzung
1148
          }
1158
 
1149
          else if ((w > 0) && (w >= 180))
1159
          if (((w > 0) && (w < 180)) || ((w < 0) && (w < -180)))
1150
          {
1160
          {
1151
           --GyroKomp_Int;
1161
           GyroKomp_Int = GyroKomp_Int + (((labs((long)w) * waagrecht)/100)*(long)GIER_GRAD_FAKTOR); // je waagrechter desto groesser die Korrektur
1152
          }
1162
          }
1153
          else if ((w < 0) && (w >= -180))
1163
          else if (((w > 0) && (w >= 180)) || ((w < 0) && (w >= -180)))
1154
          {
1164
          {
1155
           --GyroKomp_Int;
1165
           GyroKomp_Int = GyroKomp_Int - (((labs((long)w) * waagrecht)/100)*(long)GIER_GRAD_FAKTOR);
1156
          }
-
 
1157
          else if ((w < 0) && (w < -180))
-
 
1158
          {
-
 
1159
           ++GyroKomp_Int;
1166
          }
1160
          }
1167
          if (GyroKomp_Int < 0)  GyroKomp_Int = GyroKomp_Int + 360L * (long)GIER_GRAD_FAKTOR; //Ueberlauf korrigieren
1161
          if (GyroKomp_Int < 0)  GyroKomp_Int = GyroKomp_Int + 360L;
1168
          if (GyroKomp_Int > 360L * (long)GIER_GRAD_FAKTOR)  GyroKomp_Int = GyroKomp_Int - 360L * (long)GIER_GRAD_FAKTOR;
1162
          GyroKomp_Int = (GyroKomp_Int%360L) * (long)GIER_GRAD_FAKTOR; // An Magnetkompasswert annaehern
1169
//        GyroKomp_Int = (GyroKomp_Int%360L) * (long)GIER_GRAD_FAKTOR; // An Magnetkompasswert annaehern
1163
        }
1170
        }
1164
   }
1171
   }
1165
   else //Kompass wegen zu grosser Neigung ungueltig
1172
   else //Kompass wegen zu grosser Neigung ungueltig
Line 1296... Line 1303...
1296
 
1303
 
1297
    DebugOut.Analog[30] = GPS_Nick;
1304
    DebugOut.Analog[30] = GPS_Nick;
1298
    DebugOut.Analog[31] = GPS_Roll;
1305
    DebugOut.Analog[31] = GPS_Roll;
1299
//    DebugOut.Analog[30] = KompassStartwert;
1306
//    DebugOut.Analog[30] = KompassStartwert;
-
 
1307
//    DebugOut.Analog[31] = KompassRichtung;
-
 
1308
//    DebugOut.Analog[31] = (int) waagrecht;
Line 1300... Line 1309...
1300
//    DebugOut.Analog[31] = KompassRichtung;
1309
 
1301
 
1310
 
1302
 
1311