Subversion Repositories FlightCtrl

Rev

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

Rev 1837 Rev 1839
Line 78... Line 78...
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 = 0;
81
int  KompassSollWert = 0;
81
int  KompassSollWert = 0;
82
int  KompassRichtung = 0;
82
int  KompassRichtung = 0;
-
 
83
char CalculateCompassTimer = 100;
-
 
84
unsigned char KompassFusion = 32;
83
unsigned int  KompassSignalSchlecht = 500;
85
unsigned int  KompassSignalSchlecht = 50;
84
unsigned char  MAX_GAS,MIN_GAS;
86
unsigned char  MAX_GAS,MIN_GAS;
85
unsigned char HoehenReglerAktiv = 0;
87
unsigned char HoehenReglerAktiv = 0;
86
unsigned char TrichterFlug = 0;
88
unsigned char TrichterFlug = 0;
87
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L;
89
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L;
88
long  ErsatzKompass;
90
long  ErsatzKompass;
Line 188... Line 190...
188
    DebugOut.Analog[20] = ServoNickValue;
190
    DebugOut.Analog[20] = ServoNickValue;
189
    DebugOut.Analog[22] = Capacity.ActualCurrent;
191
    DebugOut.Analog[22] = Capacity.ActualCurrent;
190
    DebugOut.Analog[23] = Capacity.UsedCapacity;
192
    DebugOut.Analog[23] = Capacity.UsedCapacity;
191
//    DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ;
193
//    DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ;
192
//    DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay;
194
//    DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay;
-
 
195
    DebugOut.Analog[27] = KompassSollWert;
193
        DebugOut.Analog[29] = Capacity.MinOfMaxPWM;
196
        DebugOut.Analog[29] = Capacity.MinOfMaxPWM;
194
    DebugOut.Analog[30] = GPS_Nick;
197
    DebugOut.Analog[30] = GPS_Nick;
195
    DebugOut.Analog[31] = GPS_Roll;
198
    DebugOut.Analog[31] = GPS_Roll;
196
    if(VersionInfo.HardwareError[0] || VersionInfo.HardwareError[1]) DebugOut.Status[1] |= 1; else DebugOut.Status[1] &= 0xfe;
199
    if(VersionInfo.HardwareError[0] || VersionInfo.HardwareError[1]) DebugOut.Status[1] |= 1; else DebugOut.Status[1] &= 0xfe;
Line 324... Line 327...
324
    Mess_Integral_Gier = 0;
327
    Mess_Integral_Gier = 0;
325
    StartLuftdruck = Luftdruck;
328
    StartLuftdruck = Luftdruck;
326
    VarioMeter = 0;
329
    VarioMeter = 0;
327
    Mess_Integral_Hoch = 0;
330
    Mess_Integral_Hoch = 0;
328
    KompassSollWert = KompassValue;
331
    KompassSollWert = KompassValue;
-
 
332
        KompassSignalSchlecht = 100;
329
    GPS_Neutral();
333
    GPS_Neutral();
330
    beeptime = 50;
334
    beeptime = 50;
331
        Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L;
335
        Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L;
332
        Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L;
336
        Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L;
333
    ExternHoehenValue = 0;
337
    ExternHoehenValue = 0;
Line 549... Line 553...
549
// Trägt ggf. das Poti als Parameter ein
553
// Trägt ggf. das Poti als Parameter ein
550
void ParameterZuordnung(void)
554
void ParameterZuordnung(void)
551
//############################################################################
555
//############################################################################
552
{
556
{
553
 unsigned char tmp,i;
557
 unsigned char tmp,i;
-
 
558
 static unsigned char carefree_old = 2;
554
 #define CHK_POTI(b,a) {if(a < 248) b = a; else b = Poti[255 - a];}
559
 #define CHK_POTI(b,a) {if(a < 248) b = a; else b = Poti[255 - a];}
555
 #define CHK_POTI_MM(b,a,min,max) {CHK_POTI(b,a); LIMIT_MIN_MAX(b, min, max);}
560
 #define CHK_POTI_MM(b,a,min,max) {CHK_POTI(b,a); LIMIT_MIN_MAX(b, min, max);}
556
  for(i=0;i<8;i++)
561
  for(i=0;i<8;i++)
557
    {
562
    {
558
     int tmp2;
563
     int tmp2;
Line 606... Line 611...
606
 
611
 
607
 tmp = EE_Parameter.OrientationModeControl;
612
 tmp = EE_Parameter.OrientationModeControl;
608
 if(tmp > 50)
613
 if(tmp > 50)
609
   {
614
   {
610
#ifdef SWITCH_LEARNS_CAREFREE
615
#ifdef SWITCH_LEARNS_CAREFREE
611
    if(!CareFree) ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2;
616
    if(!CareFree)  ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2;
612
#endif
617
#endif
613
        CareFree = 1;
618
        CareFree = 1;
-
 
619
    if(tmp >= 248 && Poti[255 - tmp] < 50) CareFree = 0;
-
 
620
    if(carefree_old == 0 && CareFree)  beeptime = 1000;
-
 
621
    if(carefree_old == 1 && !CareFree) beeptime = 200;
614
    if(tmp >= 248 && Poti[255 - tmp] < 50) CareFree = 0;
622
    carefree_old = CareFree;
615
    if(FromNaviCtrl.CompassValue < 0 && CareFree) VersionInfo.HardwareError[0] |= FC_ERROR0_CAREFREE; else VersionInfo.HardwareError[0] &= ~FC_ERROR0_CAREFREE;
623
        if(FromNaviCtrl.CompassValue < 0 && CareFree) VersionInfo.HardwareError[0] |= FC_ERROR0_CAREFREE; else VersionInfo.HardwareError[0] &= ~FC_ERROR0_CAREFREE;
-
 
624
   }
-
 
625
   else
616
   }
626
   {
-
 
627
    CareFree = 0;
-
 
628
        carefree_old = 0;
Line 617... Line 629...
617
   else CareFree = 0;
629
   }   
618
 
630
 
619
 if(FromNaviCtrl.CompassValue < 0 && MotorenEin && CareFree && BeepMuster == 0xffff) // ungültiger Kompasswert
631
 if(FromNaviCtrl.CompassValue < 0 && MotorenEin && CareFree && BeepMuster == 0xffff) // ungültiger Kompasswert
620
        {
632
        {
Line 692... Line 704...
692
                {
704
                {
693
                SummeNick = 0;
705
                SummeNick = 0;
694
                SummeRoll = 0;
706
                SummeRoll = 0;
695
                sollGier = 0;
707
                sollGier = 0;
696
                Mess_Integral_Gier = 0;
708
                Mess_Integral_Gier = 0;
697
                if(modell_fliegt == 250)
-
 
698
                 {
-
 
699
                  NeueKompassRichtungMerken = 1;
709
                NeueKompassRichtungMerken = 250;
700
                 }
-
 
701
                } else FC_StatusFlags |= FC_STATUS_FLY;
710
                } else FC_StatusFlags |= FC_STATUS_FLY;
Line 702... Line 711...
702
 
711
 
703
            if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0)
712
            if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0)
704
                {
713
                {
Line 986... Line 995...
986
 
995
 
987
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
996
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
988
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
997
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
989
  {
998
  {
990
   long tmp_long, tmp_long2;
999
   long tmp_long, tmp_long2;
991
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
1000
   if(FromNaviCtrl_Value.Kalman_K > 0 /*&& !TrichterFlug*/)
992
     {
1001
     {
993
      tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
1002
      tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
994
      tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll);
1003
      tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll);
995
      tmp_long  = (tmp_long  * FromNaviCtrl_Value.Kalman_K) / (32 * 16);
1004
      tmp_long  = (tmp_long  * FromNaviCtrl_Value.Kalman_K) / (32 * 16);
-
 
1005
      tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16);
996
      tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16);
1006
          KompassFusion = FromNaviCtrl_Value.Kalman_K;
997
     if((MaxStickNick > 64) || (MaxStickRoll > 64))
1007
     if((MaxStickNick > 64) || (MaxStickRoll > 64))
998
      {
1008
      {
999
      tmp_long  /= 2;
1009
      tmp_long  /= 2;
1000
      tmp_long2 /= 2;
1010
      tmp_long2 /= 2;
Line 1023... Line 1033...
1023
     if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)
1033
     if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)
1024
      {
1034
      {
1025
      tmp_long  /= 3;
1035
      tmp_long  /= 3;
1026
      tmp_long2 /= 3;
1036
      tmp_long2 /= 3;
1027
      }
1037
      }
1028
 
-
 
-
 
1038
      KompassFusion = 25;
1029
#define AUSGLEICH  32
1039
#define AUSGLEICH  32
1030
      if(tmp_long >  AUSGLEICH)  tmp_long  = AUSGLEICH;
1040
      if(tmp_long >  AUSGLEICH)  tmp_long  = AUSGLEICH;
1031
      if(tmp_long < -AUSGLEICH)  tmp_long  =-AUSGLEICH;
1041
      if(tmp_long < -AUSGLEICH)  tmp_long  =-AUSGLEICH;
1032
      if(tmp_long2 > AUSGLEICH)  tmp_long2 = AUSGLEICH;
1042
      if(tmp_long2 > AUSGLEICH)  tmp_long2 = AUSGLEICH;
1033
      if(tmp_long2 <-AUSGLEICH)  tmp_long2 =-AUSGLEICH;
1043
      if(tmp_long2 <-AUSGLEICH)  tmp_long2 =-AUSGLEICH;
Line 1119... Line 1129...
1119
         } else  last_n_n = 0;
1129
         } else  last_n_n = 0;
1120
        }
1130
        }
1121
        else
1131
        else
1122
        {
1132
        {
1123
         cnt = 0;
1133
         cnt = 0;
1124
         KompassSignalSchlecht = 1000;
1134
         KompassSignalSchlecht = 100;
1125
        }
1135
        }
1126
        if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp;
1136
        if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp;
1127
                if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift;
1137
                if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift;
1128
        if(IntegralFehlerNick >  FEHLER_LIMIT)   AdNeutralNick += cnt;
1138
        if(IntegralFehlerNick >  FEHLER_LIMIT)   AdNeutralNick += cnt;
1129
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
1139
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
Line 1156... Line 1166...
1156
           else last_r_n = 1;
1166
           else last_r_n = 1;
1157
         } else  last_r_n = 0;
1167
         } else  last_r_n = 0;
1158
        } else
1168
        } else
1159
        {
1169
        {
1160
         cnt = 0;
1170
         cnt = 0;
1161
         KompassSignalSchlecht = 1000;
1171
         KompassSignalSchlecht = 100;
1162
        }
1172
        }
1163
        if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp;
1173
        if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp;
1164
                if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift;
1174
                if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift;
1165
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
1175
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
1166
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
1176
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
Line 1190... Line 1200...
1190
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1200
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1191
//  Gieren
1201
//  Gieren
1192
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1202
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1193
    if(abs(StickGier) > 15) // war 35
1203
    if(abs(StickGier) > 15) // war 35
1194
     {
1204
     {
1195
      KompassSignalSchlecht = 1000;
1205
//      KompassSignalSchlecht = 1000;
1196
      if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX))
1206
      if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX))
1197
       {
1207
       {
1198
         NeueKompassRichtungMerken = 1;
1208
         NeueKompassRichtungMerken = 250;
1199
        };
1209
        };
1200
     }
1210
     }
1201
    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²
1202
    tmp_int += (EE_Parameter.Gier_P * StickGier) / 4;
1212
    tmp_int += (EE_Parameter.Gier_P * StickGier) / 4;
1203
    sollGier = tmp_int;
1213
    sollGier = tmp_int;
Line 1208... Line 1218...
1208
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1218
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1209
//  Kompass
1219
//  Kompass
1210
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1220
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1211
    if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV))
1221
    if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV))
1212
     {
1222
     {
-
 
1223
      if(CalculateCompassTimer-- == 1)
-
 
1224
          {
1213
       int w,v,r,fehler,korrektur;
1225
       int w,v,r,fehler,korrektur; // wird von der SPI-Routine auf 1 gesetzt
-
 
1226
       CalculateCompassTimer = 13; // falls keine Navi-Daten
-
 
1227
 
-
 
1228
// max. Korrekturwert schätzen
1214
       w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln
1229
       w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln
1215
       v = abs(IntegralRoll /512);
1230
       v = abs(IntegralRoll /512);
1216
       if(v > w) w = v; // grösste Neigung ermitteln
1231
       if(v > w) w = v; // grösste Neigung ermitteln
1217
       korrektur = w / 8 + 2;
1232
       korrektur = w / 4 + 1;
-
 
1233
// Kompassfehlerwert bestimmen   
1218
       fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180;
1234
       fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180;
1219
           //fehler += MesswertGier / 12;
1235
// GIER_GRAD_FAKTOR ist ca. 1200
Line -... Line 1236...
-
 
1236
 
1220
 
1237
// Kompasswert einloggen
1221
       if(!KompassSignalSchlecht && w < 25)
1238
       if(!KompassSignalSchlecht && w < 25)
1222
        {
1239
        {
1223
        GierGyroFehler += fehler;
1240
        GierGyroFehler += fehler;
1224
        if(NeueKompassRichtungMerken)
1241
        if(NeueKompassRichtungMerken)
-
 
1242
         {
-
 
1243
          if(--NeueKompassRichtungMerken == 0)
1225
         {
1244
                   {
1226
                  ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR;
1245
                    ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR;
1227
          KompassSollWert = (ErsatzKompass/GIER_GRAD_FAKTOR);
1246
            KompassSollWert = (ErsatzKompass/GIER_GRAD_FAKTOR);
1228
          NeueKompassRichtungMerken = 0;
1247
                   }   
1229
         }
1248
         }
-
 
1249
        }
1230
        }
1250
// Kompass fusionieren
-
 
1251
       if(!KompassSignalSchlecht) ErsatzKompass += (fehler * KompassFusion) / korrektur;
-
 
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
 
-
 
1259
// MK drehen
-
 
1260
    if(KompassSignalSchlecht) KompassSignalSchlecht--;
-
 
1261
    else
-
 
1262
        if(!NeueKompassRichtungMerken)
-
 
1263
       {
-
 
1264
           r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassSollWert) % 360) - 180;
-
 
1265
           v = r * (Parameter_KompassWirkung/2);  // nach Kompass ausrichten
-
 
1266
                   Mess_Integral_Gier += v;
-
 
1267
DebugOut.Analog[25] = v;
-
 
1268
//DebugOut.Analog[26] = r;
-
 
1269
       }           
-
 
1270
 
1231
       ErsatzKompass += (fehler * 16) / korrektur;
1271
/*
1232
       w = (w * Parameter_KompassWirkung) / 32;           // auf die Wirkung normieren
1272
       w = (w * Parameter_KompassWirkung) / 32;           // auf die Wirkung normieren
1233
       w = Parameter_KompassWirkung - w;                  // Wirkung ggf drosseln
1273
       w = Parameter_KompassWirkung - w;                  // Wirkung ggf drosseln
1234
       if(w >= 0)
1274
       if(w >= 0)
1235
        {
1275
        {
1236
          if(!KompassSignalSchlecht)
1276
          if(!KompassSignalSchlecht)
1237
          {
1277
          {
-
 
1278
           v = 64 + ((MaxStickNick + MaxStickRoll)) / 8;
1238
           v = 64 + ((MaxStickNick + MaxStickRoll)) / 8;
1279
DebugOut.Analog[16] = korrektur;
1239
           r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassSollWert) % 360) - 180;
1280
           r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassSollWert) % 360) - 180;
1240
           v = (r * w) / v;  // nach Kompass ausrichten
1281
           v = (r * w) / v;  // nach Kompass ausrichten
1241
           w = 3 * Parameter_KompassWirkung;
1282
           w = 3 * Parameter_KompassWirkung;
1242
           if(v > w) v = w; // Begrenzen
1283
           if(v > w) v = w; // Begrenzen
1243
           else
1284
           else
1244
           if(v < -w) v = -w;
1285
           if(v < -w) v = -w;
1245
           Mess_Integral_Gier += v;
1286
//           Mess_Integral_Gier += v;
1246
          }
1287
          }
1247
          if(KompassSignalSchlecht) KompassSignalSchlecht--;
1288
          if(KompassSignalSchlecht) KompassSignalSchlecht--;
1248
        }
1289
        }
-
 
1290
        else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek
-
 
1291
*/
1249
        else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek
1292
      } // CalculateCompassTimer
1250
     }
-
 
1251
 
1293
     }
1252
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1294
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1253
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
1295
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
1254
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1296
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++