Subversion Repositories FlightCtrl

Rev

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

Rev 2497 Rev 2499
Line 61... Line 61...
61
unsigned char h,m,s;
61
unsigned char h,m,s;
62
unsigned int BaroExpandActive = 0;
62
unsigned int BaroExpandActive = 0;
63
int MesswertNick,MesswertRoll,MesswertGier,RohMesswertNick,RohMesswertRoll;
63
int MesswertNick,MesswertRoll,MesswertGier,RohMesswertNick,RohMesswertRoll;
64
int TrimNick, TrimRoll;
64
int TrimNick, TrimRoll;
65
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
65
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
-
 
66
int BoatNeutralNick = 0,BoatNeutralRoll = 0,BoatNeutralGier = 0;
66
int Mittelwert_AccNick, Mittelwert_AccRoll;
67
int Mittelwert_AccNick, Mittelwert_AccRoll;
67
unsigned int NeutralAccX=0, NeutralAccY=0;
68
unsigned int NeutralAccX=0, NeutralAccY=0;
68
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
69
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
69
int NeutralAccZ = 0;
70
int NeutralAccZ = 0;
70
signed char NeutralAccZfine = 0;
71
signed char NeutralAccZfine = 0;
Line 359... Line 360...
359
                        printf("\n\rACC not calibrated!\r\n");
360
                        printf("\n\rACC not calibrated!\r\n");
360
                        NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY);
361
                        NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY);
361
                        NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY);
362
                        NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY);
362
                        sucess = 0;
363
                        sucess = 0;
363
                }
364
                }
-
 
365
 
-
 
366
        // restore from eeprom
-
 
367
        BoatNeutralNick = (int16_t)GetParamWord(PID_GYRO_NICK);
-
 
368
        BoatNeutralRoll = (int16_t)GetParamWord(PID_GYRO_ROLL);
-
 
369
        BoatNeutralGier = (int16_t)GetParamWord(PID_GYRO_YAW);
-
 
370
 
364
     if(FC_StatusFlags3 & FC_STATUS3_BOAT) // Read Gyro Data from eeprom
371
     if(FC_StatusFlags3 & FC_STATUS3_BOAT) // Read Gyro Data from eeprom
365
     {
372
     {
366
            unsigned int nick, roll, gier;
-
 
367
                // restore from eeprom
-
 
368
                nick = (int16_t)GetParamWord(PID_GYRO_NICK);
-
 
369
                roll = (int16_t)GetParamWord(PID_GYRO_ROLL);
-
 
370
                gier = (int16_t)GetParamWord(PID_GYRO_YAW);
-
 
371
                // strange settings?
373
                // strange settings?
372
                if(((unsigned int) nick > (600 * 16)) || ((unsigned int) nick < (400 * 16))
374
                if(((unsigned int) BoatNeutralNick > (600 * 16)) || ((unsigned int) BoatNeutralNick < (400 * 16))
373
                   || ((unsigned int) roll > (600 * 16)) || ((unsigned int) roll < (400 * 16))
375
                   || ((unsigned int) BoatNeutralRoll > (600 * 16)) || ((unsigned int) BoatNeutralRoll < (400 * 16))
374
                   || ((unsigned int) gier > (600 * 2)) || ((unsigned int) gier < (400 * 2)))
376
                   || ((unsigned int) BoatNeutralGier > (600 * 2)) || ((unsigned int) BoatNeutralGier < (400 * 2)))
375
                {
377
                {
376
                        printf("\n\rGyro calibration data not valid\r\n");
378
                        printf("\n\rGyro calibration data not valid\r\n");
377
                        sucess = 0;
379
                        sucess = 0;
378
                        FC_StatusFlags3 &= ~FC_STATUS3_BOAT;
380
                        FC_StatusFlags3 &= ~FC_STATUS3_BOAT;
379
                }
381
                }
380
                else
382
                else
381
                {
383
                {
382
                        AdNeutralNick = nick;
384
                        AdNeutralNick = BoatNeutralNick;
383
                        AdNeutralRoll = roll;
385
                        AdNeutralRoll = BoatNeutralRoll;
384
                        AdNeutralGier = gier;
386
                        AdNeutralGier = BoatNeutralGier;
385
                }
387
                }
386
     }
388
     }
387
    }
389
    }
388
        EEAR = EE_DUMMY;  // Set the EEPROM Address pointer to an unused space
390
        EEAR = EE_DUMMY;  // Set the EEPROM Address pointer to an unused space
389
        MesswertNick = 0;
391
        MesswertNick = 0;
Line 796... Line 798...
796
        }
798
        }
797
  else StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint;
799
  else StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint;
798
  LIMIT_MIN_MAX(StickGasHover, 70, 175); // reserve some range for trim up and down
800
  LIMIT_MIN_MAX(StickGasHover, 70, 175); // reserve some range for trim up and down
799
}
801
}
Line -... Line 802...
-
 
802
 
-
 
803
void ChannelAssingment(void)
-
 
804
{
-
 
805
cli();
-
 
806
        ChannelNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
-
 
807
        ChannelRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
-
 
808
        ChannelYaw = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
-
 
809
        ChannelGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];
-
 
810
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
811
//+ Analoge Steuerung per Seriell
-
 
812
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
813
if((ExternalControl.Config & EC_VALID) && (Parameter_ExternalControl > 128))
-
 
814
    {
-
 
815
                ChannelNick += ExternalControl.Nick;
-
 
816
                ChannelRoll += ExternalControl.Roll;
-
 
817
                ChannelYaw += ExternalControl.Gier;
-
 
818
        if(ExternalControl.Config & EC_GAS_ADD) ChannelGas += ExternalControl.Gas;
-
 
819
                else
-
 
820
                 {
-
 
821
                  if(ExternalControl.Gas < ChannelGas) ChannelGas = ExternalControl.Gas; // the RC-Stick is the MAX value here
-
 
822
             }
-
 
823
        }
-
 
824
sei();
-
 
825
        if(ChannelNick > 127) ChannelNick = 127;        else if(ChannelNick < -127) ChannelNick = -127;
-
 
826
        if(ChannelRoll > 127) ChannelRoll = 127;        else if(ChannelRoll < -127) ChannelRoll = -127;
-
 
827
        if(ChannelYaw  > 127) ChannelYaw = 127;         else if(ChannelYaw < -127) ChannelYaw = -127;
-
 
828
        if(ChannelGas  > 127) ChannelGas = 127;         else if(ChannelGas < -127) ChannelGas = -127;
Line 800... Line 829...
800
 
829
}
801
 
830
 
802
//############################################################################
831
//############################################################################
803
//
832
//
Line 829... Line 858...
829
    } else HooverGasEmergencyPercent = EE_Parameter.NotGas;
858
    } else HooverGasEmergencyPercent = EE_Parameter.NotGas;
830
   }
859
   }
831
   if(GasIsZeroCnt == 30000)  // in that case we have RC-Lost, but the MK is probably landed
860
   if(GasIsZeroCnt == 30000)  // in that case we have RC-Lost, but the MK is probably landed
832
    {
861
    {
833
         StickGas = 0; // Hold Gas down in that case 
862
         StickGas = 0; // Hold Gas down in that case 
834
         ExternalControl.Gas = 0;
863
//       ExternalControl.Gas = 0;
835
         HooverGasEmergencyPercent = MIN_GAS;
864
         HooverGasEmergencyPercent = MIN_GAS;
836
        }
865
        }
837
        GasMischanteil = StickGas;
866
        GasMischanteil = StickGas;
838
    if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10;
867
    if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10;
839
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
868
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Line 1159... Line 1188...
1159
 if(!NewPpmData-- || (FC_StatusFlags & FC_STATUS_EMERGENCY_LANDING))
1188
 if(!NewPpmData-- || (FC_StatusFlags & FC_STATUS_EMERGENCY_LANDING))
1160
  {
1189
  {
1161
        static int stick_nick,stick_roll;
1190
        static int stick_nick,stick_roll;
1162
        unsigned char stick_p;
1191
        unsigned char stick_p;
1163
    ParameterZuordnung();
1192
    ParameterZuordnung();
-
 
1193
        ChannelAssingment();
Line 1164... Line 1194...
1164
 
1194
 
1165
        stick_p = EE_Parameter.Stick_P;
-
 
1166
cli();
-
 
1167
        ChannelNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
-
 
1168
        ChannelRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
-
 
1169
        ChannelYaw = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
-
 
1170
        ChannelGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];
-
 
1171
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1172
//+ Analoge Steuerung per Seriell
-
 
1173
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1174
if((ExternalControl.Config & EC_VALID) && (Parameter_ExternalControl > 128))
-
 
1175
    {
-
 
1176
                ChannelNick += ExternalControl.Nick;
-
 
1177
                ChannelRoll += ExternalControl.Roll;
-
 
1178
                ChannelYaw += ExternalControl.Gier;
-
 
1179
        if(ExternalControl.Config & EC_GAS_ADD) ChannelGas += ExternalControl.Gas;
-
 
1180
                else
-
 
1181
                 {
-
 
1182
                  if(ExternalControl.Gas < ChannelGas) ChannelGas = ExternalControl.Gas; // the RC-Stick is the MAX value here
-
 
1183
             }
-
 
1184
        }
-
 
1185
sei();
-
 
1186
        if(ChannelNick > 127) ChannelNick = 127;        else if(ChannelNick < -127) ChannelNick = -127;
-
 
1187
        if(ChannelRoll > 127) ChannelRoll = 127;        else if(ChannelRoll < -127) ChannelRoll = -127;
-
 
1188
        if(ChannelYaw  > 127) ChannelYaw = 127;         else if(ChannelYaw < -127) ChannelYaw = -127;
-
 
1189
        if(ChannelGas  > 127) ChannelGas = 127;         else if(ChannelGas < -127) ChannelGas = -127;
1195
        stick_p = EE_Parameter.Stick_P;
1190
    stick_nick = (stick_nick * 3 + ChannelNick * stick_p) / 4;
1196
    stick_nick = (stick_nick * 3 + ChannelNick * stick_p) / 4;
1191
    stick_roll = (stick_roll * 3 + ChannelRoll * stick_p) / 4;
1197
    stick_roll = (stick_roll * 3 + ChannelRoll * stick_p) / 4;
1192
cli();
1198
cli();
1193
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
1199
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
Line 1395... Line 1401...
1395
        Mess_IntegralRoll -= tmp_long2;
1401
        Mess_IntegralRoll -= tmp_long2;
1396
        DriftNick += tmp_long;
1402
        DriftNick += tmp_long;
1397
        DriftRoll += tmp_long2;
1403
        DriftRoll += tmp_long2;
1398
  }
1404
  }
1399
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1405
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1400
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1406
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)  //alle 512ms
1401
 {
1407
 {
1402
//  static int cnt = 0;
1408
//  static int cnt = 0;
1403
//  static char last_n_p,last_n_n,last_r_p,last_r_n;
1409
//  static char last_n_p,last_n_n,last_r_p,last_r_n;
1404
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1410
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1405
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1411
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1406
// Gyro-Drift ermitteln
1412
// Gyro-Drift ermitteln
1407
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1413
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1408
  if(EE_Parameter.Driftkomp && abs(Mittelwert_AccNick) < 200*4 && abs(Mittelwert_AccRoll) < 200*4 && !TrichterFlug && abs(MesswertGier) < 32/* && (FC_StatusFlags & FC_STATUS_FLY)*/)
1414
  if(EE_Parameter.Driftkomp && abs(Mittelwert_AccNick) < 200*4 && abs(Mittelwert_AccRoll) < 200*4 && !TrichterFlug && abs(MesswertGier) < 32/* && (FC_StatusFlags & FC_STATUS_FLY)*/)
1409
  {
1415
  {
1410
DebugOut.Analog[16] = EE_Parameter.Driftkomp;
-
 
1411
   DriftNick -= DriftNick / (64 * (unsigned int) EE_Parameter.Driftkomp);
1416
   DriftNick -= DriftNick / (64 * (unsigned int) EE_Parameter.Driftkomp);
1412
   DriftRoll -= DriftRoll / (64 * (unsigned int) EE_Parameter.Driftkomp);
1417
   DriftRoll -= DriftRoll / (64 * (unsigned int) EE_Parameter.Driftkomp);
1413
   GierGyroFehler -= GierGyroFehler / (64 * (unsigned int) EE_Parameter.Driftkomp);
1418
   GierGyroFehler -= GierGyroFehler / (64 * (unsigned int) EE_Parameter.Driftkomp);
1414
   if((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(ChannelYaw) > 25))
1419
   if((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(ChannelYaw) > 25))
1415
    {
1420
    {