Subversion Repositories FlightCtrl

Rev

Rev 1839 | Rev 1855 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1839 Rev 1840
Line 75... Line 75...
75
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0;
75
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0;
76
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0;
76
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0;
77
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2;
77
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2;
78
long SummeNick=0,SummeRoll=0;
78
long SummeNick=0,SummeRoll=0;
79
volatile long Mess_Integral_Hoch = 0;
79
volatile long Mess_Integral_Hoch = 0;
80
int  KompassValue = 0;
80
int  KompassValue = -1;
81
int  KompassSollWert = 0;
81
int  KompassSollWert = 0;
82
int  KompassRichtung = 0;
82
int  KompassRichtung = 0;
83
char CalculateCompassTimer = 100;
83
char CalculateCompassTimer = 100;
84
unsigned char KompassFusion = 32;
84
unsigned char KompassFusion = 32;
85
unsigned int  KompassSignalSchlecht = 50;
85
unsigned int  KompassSignalSchlecht = 50;
Line 98... Line 98...
98
volatile unsigned char SenderOkay = 0;
98
volatile unsigned char SenderOkay = 0;
99
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
99
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
100
char MotorenEin = 0,StartTrigger = 0;
100
char MotorenEin = 0,StartTrigger = 0;
101
long HoehenWert = 0;
101
long HoehenWert = 0;
102
long SollHoehe = 0;
102
long SollHoehe = 0;
-
 
103
int CompassGierSetpoint = 0;
103
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
104
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
104
//float Ki =  FAKTOR_I;
105
//float Ki =  FAKTOR_I;
105
int Ki = 10300 / 33;
106
int Ki = 10300 / 33;
106
unsigned char Looping_Nick = 0,Looping_Roll = 0;
107
unsigned char Looping_Nick = 0,Looping_Roll = 0;
107
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
108
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
Line 370... Line 371...
370
//############################################################################
371
//############################################################################
371
{
372
{
372
    static signed long tmpl,tmpl2,tmpl3,tmpl4;
373
    static signed long tmpl,tmpl2,tmpl3,tmpl4;
373
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
374
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
374
        signed long winkel_nick, winkel_roll;
375
        signed long winkel_nick, winkel_roll;
375
    unsigned char i;
-
 
376
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
376
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
377
    MesswertNick = (signed int) AdWertNickFilter / 8;
377
    MesswertNick = (signed int) AdWertNickFilter / 8;
378
    MesswertRoll = (signed int) AdWertRollFilter / 8;
378
    MesswertRoll = (signed int) AdWertRollFilter / 8;
379
    RohMesswertNick = MesswertNick;
379
    RohMesswertNick = MesswertNick;
380
    RohMesswertRoll = MesswertRoll;
380
    RohMesswertRoll = MesswertRoll;
Line 704... Line 704...
704
                {
704
                {
705
                SummeNick = 0;
705
                SummeNick = 0;
706
                SummeRoll = 0;
706
                SummeRoll = 0;
707
                sollGier = 0;
707
                sollGier = 0;
708
                Mess_Integral_Gier = 0;
708
                Mess_Integral_Gier = 0;
709
                NeueKompassRichtungMerken = 250;
-
 
710
                } else FC_StatusFlags |= FC_STATUS_FLY;
709
                } else FC_StatusFlags |= FC_STATUS_FLY;
Line 711... Line 710...
711
 
710
 
712
            if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0)
711
            if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0)
713
                {
712
                {
Line 801... Line 800...
801
                                                                        Mess_IntegralRoll2 = IntegralRoll;
800
                                                                        Mess_IntegralRoll2 = IntegralRoll;
802
                                                                        SummeNick = 0;
801
                                                                        SummeNick = 0;
803
                                                                        SummeRoll = 0;
802
                                                                        SummeRoll = 0;
804
                                                                        FC_StatusFlags |= FC_STATUS_START;
803
                                                                        FC_StatusFlags |= FC_STATUS_START;
805
                                                                        ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2;
804
                                                                        ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2;
-
 
805
                                                                        NeueKompassRichtungMerken = 100; // 2 sekunden
806
                                                                }
806
                                                                }
807
                                                                else
807
                                                                else
808
                                                                {
808
                                                                {
809
                                                                        beeptime = 1500; // indicate missing calibration
809
                                                                        beeptime = 1500; // indicate missing calibration
810
                                                                }
810
                                                                }
Line 861... Line 861...
861
    StickNick = ((FromNC_Rotate_C * stick_nick) + (FromNC_Rotate_S * stick_roll)) / 8;
861
    StickNick = ((FromNC_Rotate_C * stick_nick) + (FromNC_Rotate_S * stick_roll)) / 8;
862
    StickRoll = ((FromNC_Rotate_C * stick_roll) - (FromNC_Rotate_S * stick_nick)) / 8;
862
    StickRoll = ((FromNC_Rotate_C * stick_roll) - (FromNC_Rotate_S * stick_nick)) / 8;
863
 }
863
 }
Line 864... Line 864...
864
 
864
 
865
    StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
865
    StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
866
        if(StickGier > 2) StickGier -= 2;       else
866
        if(StickGier > 4) StickGier -= 4;       else
Line 867... Line 867...
867
        if(StickGier < -2) StickGier += 2; else StickGier = 0;
867
        if(StickGier < -4) StickGier += 4; else StickGier = 0;
868
 
868
 
869
    StickNick -= (GPS_Nick + GPS_Nick2);
869
    StickNick -= (GPS_Nick + GPS_Nick2);
Line 1198... Line 1198...
1198
 } //  ZaehlMessungen >= ABGLEICH_ANZAHL
1198
 } //  ZaehlMessungen >= ABGLEICH_ANZAHL
Line 1199... Line 1199...
1199
 
1199
 
1200
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1200
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1201
//  Gieren
1201
//  Gieren
1202
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1202
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1203
    if(abs(StickGier) > 15) // war 35
1203
    if(abs(StickGier) > 3) // war 15
1204
     {
1204
     {
1205
//      KompassSignalSchlecht = 1000;
1205
//      KompassSignalSchlecht = 1000;
1206
      if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX))
1206
      if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX))
1207
       {
1207
       {
1208
         NeueKompassRichtungMerken = 250;
1208
         NeueKompassRichtungMerken = 50; // eine Sekunde zum Einloggen
1209
        };
1209
        };
1210
     }
1210
     }
1211
    tmp_int  = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo  y = ax + bx²
1211
    tmp_int  = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo  y = ax + bx²
-
 
1212
    tmp_int += (EE_Parameter.Gier_P * StickGier) / 4;
1212
    tmp_int += (EE_Parameter.Gier_P * StickGier) / 4;
1213
        tmp_int += CompassGierSetpoint;
1213
    sollGier = tmp_int;
1214
    sollGier = tmp_int;
1214
    Mess_Integral_Gier -= tmp_int;
1215
    Mess_Integral_Gier -= tmp_int;
1215
    if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000;  // begrenzen
1216
    if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000;  // begrenzen
Line 1216... Line 1217...
1216
    if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000;
1217
    if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000;
1217
 
1218
 
1218
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1219
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1219
//  Kompass
1220
//  Kompass
1220
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1221
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1221
    if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV))
1222
    if(KompassValue >= 0 && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV))
1222
     {
1223
     {
1223
      if(CalculateCompassTimer-- == 1)
1224
      if(CalculateCompassTimer-- == 1)
1224
          {
1225
          {
1225
       int w,v,r,fehler,korrektur; // wird von der SPI-Routine auf 1 gesetzt
-
 
1226
       CalculateCompassTimer = 13; // falls keine Navi-Daten
1226
       int w,v,r,fehler,korrektur; // wird von der SPI-Routine auf 1 gesetzt
1227
 
1227
       CalculateCompassTimer = 13; // falls keine Navi-Daten
1228
// max. Korrekturwert schätzen
1228
           // max. Korrekturwert schätzen
1229
       w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln
1229
       w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln
1230
       v = abs(IntegralRoll /512);
1230
       v = abs(IntegralRoll /512);
1231
       if(v > w) w = v; // grösste Neigung ermitteln
1231
       if(v > w) w = v; // grösste Neigung ermitteln
1232
       korrektur = w / 4 + 1;
1232
       korrektur = w / 4 + 1;
1233
// Kompassfehlerwert bestimmen   
1233
           // Kompassfehlerwert bestimmen   
1234
       fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180;
1234
           fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180;
1235
// GIER_GRAD_FAKTOR ist ca. 1200
1235
           // GIER_GRAD_FAKTOR ist ca. 1200
1236
 
1236
 
-
 
1237
           // Kompasswert einloggen
-
 
1238
       if(KompassSignalSchlecht) KompassSignalSchlecht--;
1237
// Kompasswert einloggen
1239
           else
1238
       if(!KompassSignalSchlecht && w < 25)
1240
       if(w < 25)
1239
        {
1241
        {
1240
        GierGyroFehler += fehler;
1242
        GierGyroFehler += fehler;
1241
        if(NeueKompassRichtungMerken)
1243
        if(NeueKompassRichtungMerken)
Line 1245... Line 1247...
1245
                    ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR;
1247
                    ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR;
1246
            KompassSollWert = (ErsatzKompass/GIER_GRAD_FAKTOR);
1248
            KompassSollWert = (ErsatzKompass/GIER_GRAD_FAKTOR);
1247
                   }   
1249
                   }   
1248
         }
1250
         }
1249
        }
1251
        }
1250
// Kompass fusionieren
1252
       // Kompass fusionieren
1251
       if(!KompassSignalSchlecht) ErsatzKompass += (fehler * KompassFusion) / korrektur;
1253
       if(!KompassSignalSchlecht) ErsatzKompass += (fehler * KompassFusion) / korrektur;
Line 1252... Line -...
1252
 
-
 
1253
DebugOut.Analog[16] = fehler;
-
 
1254
DebugOut.Analog[17] = korrektur;
-
 
1255
DebugOut.Analog[18] = KompassFusion;
-
 
1256
DebugOut.Analog[19] = KompassSignalSchlecht;
-
 
1257
DebugOut.Analog[24] = FromNaviCtrl_Value.Kalman_K;
-
 
1258
 
1254
 
1259
// MK drehen
-
 
1260
    if(KompassSignalSchlecht) KompassSignalSchlecht--;
-
 
1261
    else
1255
     // MK Gieren
1262
        if(!NeueKompassRichtungMerken)
1256
        if(!NeueKompassRichtungMerken)
1263
       {
1257
       {
-
 
1258
           r = ((540 + (KompassSollWert - ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180;
1264
           r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassSollWert) % 360) - 180;
1259
DebugOut.Analog[19] = r;
-
 
1260
           v = r * (Parameter_KompassWirkung/2);  // nach Kompass ausrichten
-
 
1261
//           if(abs(r) > 20) v *= 2; // über 20° -> doppelt so schnell
-
 
1262
                   CompassGierSetpoint = v / 16;
1265
           v = r * (Parameter_KompassWirkung/2);  // nach Kompass ausrichten
1263
       }
-
 
1264
     else CompassGierSetpoint = 0;
-
 
1265
 
1266
                   Mess_Integral_Gier += v;
1266
/*
1267
DebugOut.Analog[25] = v;
1267
DebugOut.Analog[16] = fehler;
1268
//DebugOut.Analog[26] = r;
1268
DebugOut.Analog[17] = korrektur;
-
 
1269
*/
-
 
1270
DebugOut.Analog[25] = CompassGierSetpoint;
Line 1269... Line 1271...
1269
       }           
1271
DebugOut.Analog[18] = KompassFusion;
1270
 
1272
 
1271
/*
1273
/*
1272
       w = (w * Parameter_KompassWirkung) / 32;           // auf die Wirkung normieren
1274
       w = (w * Parameter_KompassWirkung) / 32;           // auf die Wirkung normieren
Line 1289... Line 1291...
1289
        }
1291
        }
1290
        else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek
1292
        else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek
1291
*/
1293
*/
1292
      } // CalculateCompassTimer
1294
      } // CalculateCompassTimer
1293
     }
1295
     }
-
 
1296
         else CompassGierSetpoint = 0;
1294
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1297
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1295
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
1298
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
1296
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1299
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1297
  if(TrichterFlug)  { SummeRoll = 0; SummeNick = 0;};
1300
  if(TrichterFlug)  { SummeRoll = 0; SummeNick = 0;};