Subversion Repositories FlightCtrl

Rev

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

Rev 2669 Rev 2672
Line 62... Line 62...
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 BoatNeutralNick = 0,BoatNeutralRoll = 0,BoatNeutralGier = 0;
-
 
67
int LastFlightNeutralNick = 0,LastFlightNeutralRoll = 0,LastFlightNeutralGier = 0;
67
int Mittelwert_AccNick, Mittelwert_AccRoll;
68
int Mittelwert_AccNick, Mittelwert_AccRoll;
68
unsigned int NeutralAccX=0, NeutralAccY=0;
69
unsigned int NeutralAccX=0, NeutralAccY=0;
69
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
70
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
70
int NeutralAccZ = 0;
71
int NeutralAccZ = 0;
71
signed char NeutralAccZfine = 0;
72
signed char NeutralAccZfine = 0;
Line 200... Line 201...
200
#define OPA_OFFSET_STEP 5
201
#define OPA_OFFSET_STEP 5
201
#else
202
#else
202
#define OPA_OFFSET_STEP 10
203
#define OPA_OFFSET_STEP 10
203
#endif
204
#endif
Line -... Line 205...
-
 
205
 
-
 
206
#define MAX_DRIFT_NR                            32
-
 
207
#define MAX_DRIFT_YAW                            8
204
 
208
 
205
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
209
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
206
//  Debugwerte zuordnen
210
//  Debugwerte zuordnen
207
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
211
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
208
void CopyDebugValues(void)
212
void CopyDebugValues(void)
Line 298... Line 302...
298
        BoatNeutralNick = AdNeutralNick;
302
        BoatNeutralNick = AdNeutralNick;
299
        BoatNeutralRoll = AdNeutralRoll;
303
        BoatNeutralRoll = AdNeutralRoll;
300
        BoatNeutralGier = AdNeutralGier;
304
        BoatNeutralGier = AdNeutralGier;
301
        SetParamWord(PID_ACC_NICK, (uint16_t)NeutralAccX);
305
        SetParamWord(PID_ACC_NICK, (uint16_t)NeutralAccX);
302
        SetParamWord(PID_ACC_ROLL, (uint16_t)NeutralAccY);
306
        SetParamWord(PID_ACC_ROLL, (uint16_t)NeutralAccY);
-
 
307
 
303
        SetParamWord(PID_GYRO_NICK,(uint16_t)BoatNeutralNick);
308
        SetParamWord(PID_GYRO_NICK,(uint16_t)BoatNeutralNick);
304
        SetParamWord(PID_GYRO_ROLL,(uint16_t)BoatNeutralRoll);
309
        SetParamWord(PID_GYRO_ROLL,(uint16_t)BoatNeutralRoll);
305
        SetParamWord(PID_GYRO_YAW,(uint16_t)BoatNeutralGier);
310
        SetParamWord(PID_GYRO_YAW,(uint16_t)BoatNeutralGier);
-
 
311
 
-
 
312
        SetParamWord(EE_LAST_GYRO_NICK,(uint16_t)BoatNeutralNick);
-
 
313
        SetParamWord(EE_LAST_GYRO_ROLL,(uint16_t)BoatNeutralRoll);
-
 
314
        SetParamWord(EE_LAST_GYRO_YAW,(uint16_t)BoatNeutralGier);
-
 
315
}
-
 
316
 
-
 
317
void StoreLastDriftcompensation(void)
-
 
318
{
-
 
319
 int last_nick,last_roll,last_yaw;
-
 
320
 
-
 
321
        last_nick = AdNeutralNick;
-
 
322
        last_roll = AdNeutralRoll;
-
 
323
        last_yaw = AdNeutralGier;
-
 
324
 
-
 
325
        if(last_nick > BoatNeutralNick + MAX_DRIFT_NR) last_yaw = BoatNeutralNick + MAX_DRIFT_NR;
-
 
326
        if(last_nick < BoatNeutralNick - MAX_DRIFT_NR) last_yaw = BoatNeutralNick - MAX_DRIFT_NR;
-
 
327
        if(last_roll > BoatNeutralRoll + MAX_DRIFT_NR) last_roll        = BoatNeutralRoll + MAX_DRIFT_NR;
-
 
328
        if(last_roll < BoatNeutralRoll - MAX_DRIFT_NR) last_roll        = BoatNeutralRoll - MAX_DRIFT_NR;
-
 
329
        if(last_yaw     > BoatNeutralGier + MAX_DRIFT_YAW) last_yaw     = BoatNeutralGier + MAX_DRIFT_YAW;
-
 
330
        if(last_yaw     < BoatNeutralGier - MAX_DRIFT_YAW) last_yaw     = BoatNeutralGier - MAX_DRIFT_YAW;
-
 
331
 
-
 
332
        SetParamWord(EE_LAST_GYRO_NICK,(uint16_t)last_nick);
-
 
333
        SetParamWord(EE_LAST_GYRO_ROLL,(uint16_t)last_roll);
-
 
334
        SetParamWord(EE_LAST_GYRO_YAW,(uint16_t)last_yaw);
306
}
335
}
Line -... Line 336...
-
 
336
 
307
 
337
 
308
//############################################################################
338
//############################################################################
309
//  Nullwerte ermitteln
339
//  Nullwerte ermitteln
310
//  Parameter: 0 -> after switch on (ignore ACC-Z fault)
340
//  Parameter: 0 -> after switch on (ignore ACC-Z fault)
311
//  Parameter: 1 -> before Start
341
//  Parameter: 1 -> before Start
Line 360... Line 390...
360
        OCR0B = 255 - OCR0A;
390
        OCR0B = 255 - OCR0A;
361
     AdNeutralNick = (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8);
391
     AdNeutralNick = (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8);
362
         AdNeutralRoll = (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8);
392
         AdNeutralRoll = (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8);
363
         AdNeutralGier = (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER);
393
         AdNeutralGier = (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER);
364
     NeutralAccZ = (acc_z_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER);
394
     NeutralAccZ = (acc_z_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER);
-
 
395
//AdNeutralGier -= 20;
Line 365... Line 396...
365
 
396
 
366
     StartNeutralRoll = AdNeutralRoll;
397
     StartNeutralRoll = AdNeutralRoll;
367
     StartNeutralNick = AdNeutralNick;
398
     StartNeutralNick = AdNeutralNick;
368
         VersionInfo.HardwareError[1] &= ~FC_ERROR1_ACC_NOT_CAL;
399
         VersionInfo.HardwareError[1] &= ~FC_ERROR1_ACC_NOT_CAL;
Line 379... Line 410...
379
                NeutralAccX = (int16_t)GetParamWord(PID_ACC_NICK);
410
                NeutralAccX = (int16_t)GetParamWord(PID_ACC_NICK);
380
                NeutralAccY = (int16_t)GetParamWord(PID_ACC_ROLL);
411
                NeutralAccY = (int16_t)GetParamWord(PID_ACC_ROLL);
381
                // strange settings?
412
                // strange settings?
382
                if(((unsigned int) NeutralAccX > 2048) || ((unsigned int) NeutralAccY > 2048)/* || ((unsigned int) NeutralAccZ > 1024)*/)
413
                if(((unsigned int) NeutralAccX > 2048) || ((unsigned int) NeutralAccY > 2048)/* || ((unsigned int) NeutralAccZ > 1024)*/)
383
                {
414
                {
384
                        printf("\n\rACC not calibrated!\r\n");
415
                        printf("\r\nACC not calibrated!\r\n");
385
                        NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY);
416
                        NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY);
386
                        NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY);
417
                        NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY);
387
                        VersionInfo.HardwareError[1] |= FC_ERROR1_ACC_NOT_CAL;
418
                        VersionInfo.HardwareError[1] |= FC_ERROR1_ACC_NOT_CAL;
388
                        sucess = 0;
419
                        sucess = 0;
389
                }
420
                }
Line 390... Line 421...
390
 
421
 
391
        // restore from eeprom
422
        // restore from eeprom
392
        BoatNeutralNick = (int16_t)GetParamWord(PID_GYRO_NICK);
423
        BoatNeutralNick = (int16_t)GetParamWord(PID_GYRO_NICK);
393
        BoatNeutralRoll = (int16_t)GetParamWord(PID_GYRO_ROLL);
424
        BoatNeutralRoll = (int16_t)GetParamWord(PID_GYRO_ROLL);
-
 
425
        BoatNeutralGier = (int16_t)GetParamWord(PID_GYRO_YAW);
-
 
426
        LastFlightNeutralNick = (int16_t)GetParamWord(EE_LAST_GYRO_NICK);
-
 
427
        LastFlightNeutralRoll = (int16_t)GetParamWord(EE_LAST_GYRO_ROLL);
-
 
428
        LastFlightNeutralGier = (int16_t)GetParamWord(EE_LAST_GYRO_YAW);
-
 
429
//DebugOut.Analog[16] = LastFlightNeutralNick;
-
 
430
//DebugOut.Analog[17] = LastFlightNeutralRoll;
-
 
431
//DebugOut.Analog[18] = LastFlightNeutralGier;
-
 
432
 
-
 
433
        if(abs(BoatNeutralNick - LastFlightNeutralNick) > 200) LastFlightNeutralNick = BoatNeutralNick;
-
 
434
        if(abs(BoatNeutralRoll - LastFlightNeutralRoll) > 200) LastFlightNeutralRoll = BoatNeutralRoll;
Line 394... Line 435...
394
        BoatNeutralGier = (int16_t)GetParamWord(PID_GYRO_YAW);
435
        if(abs(BoatNeutralGier - LastFlightNeutralGier) >  50) LastFlightNeutralGier = BoatNeutralGier;
395
 
436
 
396
     if(FC_StatusFlags3 & FC_STATUS3_BOAT) // Read Gyro Data from eeprom
437
     if(FC_StatusFlags3 & FC_STATUS3_BOAT) // Read Gyro Data from eeprom
397
     {
438
     {
398
                // strange settings?
439
                // strange settings?
399
                if(((unsigned int) BoatNeutralNick > (600 * 16)) || ((unsigned int) BoatNeutralNick < (400 * 16))
440
                if(((unsigned int) BoatNeutralNick > (600 * 16)) || ((unsigned int) BoatNeutralNick < (400 * 16))
400
                   || ((unsigned int) BoatNeutralRoll > (600 * 16)) || ((unsigned int) BoatNeutralRoll < (400 * 16))
441
                   || ((unsigned int) BoatNeutralRoll > (600 * 16)) || ((unsigned int) BoatNeutralRoll < (400 * 16))
401
                   || ((unsigned int) BoatNeutralGier > (600 * 2)) || ((unsigned int) BoatNeutralGier < (400 * 2)))
442
                   || ((unsigned int) BoatNeutralGier > (600 * 2)) || ((unsigned int) BoatNeutralGier < (400 * 2)))
402
                {
443
                {
403
                        printf("\n\rGyro calibration data not valid\r\n");
444
                        printf("\r\nGyro calibration data not valid\r\n");
404
                        sucess = 0;
445
                        sucess = 0;
405
                        FC_StatusFlags3 &= ~FC_STATUS3_BOAT;
446
                        FC_StatusFlags3 &= ~FC_STATUS3_BOAT;
406
                }
447
                }
Line 410... Line 451...
410
                        AdNeutralRoll = BoatNeutralRoll;
451
                        AdNeutralRoll = BoatNeutralRoll;
411
                        AdNeutralGier = BoatNeutralGier;
452
                        AdNeutralGier = BoatNeutralGier;
412
                }
453
                }
413
     }
454
     }
414
    }
455
    }
-
 
456
 
-
 
457
// ist it within the Boat-Values?
-
 
458
if(abs((AdNeutralGier - BoatNeutralGier) > MAX_DRIFT_YAW) || abs((AdNeutralNick - BoatNeutralNick) > MAX_DRIFT_NR) || abs((AdNeutralRoll - BoatNeutralRoll) > MAX_DRIFT_NR))
-
 
459
 {
-
 
460
  sucess = 0;
-
 
461
  if(AdjustmentMode == 1) SpeakHoTT = SPEAK_ERR_CALIBARTION; // calibration before start
-
 
462
  AdNeutralNick = BoatNeutralNick;
-
 
463
  AdNeutralRoll = BoatNeutralRoll;
-
 
464
  AdNeutralGier = BoatNeutralGier;
-
 
465
 }
-
 
466
 
-
 
467
// make average from these three values
-
 
468
AdNeutralGier = (BoatNeutralGier + LastFlightNeutralGier + AdNeutralGier) / 3;
-
 
469
AdNeutralNick = (BoatNeutralNick + LastFlightNeutralNick + AdNeutralNick) / 3;
-
 
470
AdNeutralRoll = (BoatNeutralRoll + LastFlightNeutralRoll + AdNeutralRoll) / 3;
-
 
471
 
415
        EEAR = EE_DUMMY;  // Set the EEPROM Address pointer to an unused space
472
        EEAR = EE_DUMMY;  // Set the EEPROM Address pointer to an unused space
416
        MesswertNick = 0;
473
        MesswertNick = 0;
417
    MesswertRoll = 0;
474
    MesswertRoll = 0;
418
    MesswertGier = 0;
475
    MesswertGier = 0;
419
    Delay_ms_Mess(200);
476
    Delay_ms_Mess(200);
Line 1233... Line 1290...
1233
                                                        }
1290
                                                        }
1234
                                                        if(++delay_ausschalten > 250 || Partner_StatusFlags3 & FC_STATUS3_MOTORS_STOPPED_BY_RC)  // nicht sofort oder wenn der Partner schon aus ist
1291
                                                        if(++delay_ausschalten > 250 || Partner_StatusFlags3 & FC_STATUS3_MOTORS_STOPPED_BY_RC)  // nicht sofort oder wenn der Partner schon aus ist
1235
                                                        {
1292
                                                        {
1236
                                                                FC_StatusFlags3 |= FC_STATUS3_MOTORS_STOPPED_BY_RC; // that informs the slave to disarm the Motors
1293
                                                                FC_StatusFlags3 |= FC_STATUS3_MOTORS_STOPPED_BY_RC; // that informs the slave to disarm the Motors
1237
                                                                Delete_Stoppflag_Timer = 2; // 1-2 seconds
1294
                                                                Delete_Stoppflag_Timer = 2; // 1-2 seconds
-
 
1295
if(!NC_ErrorCode && modell_fliegt > 60 * 500 && MotorenEin) StoreLastDriftcompensation();
1238
                                                                MotorenEin = 0;
1296
                                                                MotorenEin = 0;
1239
                                                                delay_ausschalten = 0;
1297
                                                                delay_ausschalten = 0;
1240
                                                                modell_fliegt = 0;
1298
                                                                modell_fliegt = 0;
1241
                                                                FC_StatusFlags2 &= ~(FC_STATUS2_WAIT_FOR_TAKEOFF | FC_STATUS2_AUTO_STARTING | FC_STATUS2_AUTO_LANDING);
1299
                                                                FC_StatusFlags2 &= ~(FC_STATUS2_WAIT_FOR_TAKEOFF | FC_STATUS2_AUTO_STARTING | FC_STATUS2_AUTO_LANDING);
1242
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
1300
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
Line 1516... Line 1574...
1516
         if(DriftNick <-3000) { DriftNick = 0; AdNeutralNick--;}
1574
         if(DriftNick <-3000) { DriftNick = 0; AdNeutralNick--;}
1517
         if(DriftRoll > 3000) { DriftRoll = 0; AdNeutralRoll++;}
1575
         if(DriftRoll > 3000) { DriftRoll = 0; AdNeutralRoll++;}
1518
         if(DriftRoll <-3000) { DriftRoll = 0; AdNeutralRoll--;}
1576
         if(DriftRoll <-3000) { DriftRoll = 0; AdNeutralRoll--;}
1519
     if(GierGyroFehler > 3500) { GierGyroFehler = 0; AdNeutralGier++; }
1577
     if(GierGyroFehler > 3500) { GierGyroFehler = 0; AdNeutralGier++; }
1520
     if(GierGyroFehler <-3500) { GierGyroFehler = 0; AdNeutralGier--; }
1578
     if(GierGyroFehler <-3500) { GierGyroFehler = 0; AdNeutralGier--; }
-
 
1579
 
-
 
1580
        if(AdNeutralNick > BoatNeutralNick + MAX_DRIFT_NR) AdNeutralRoll        = BoatNeutralNick + MAX_DRIFT_NR;
-
 
1581
        if(AdNeutralNick < BoatNeutralNick - MAX_DRIFT_NR) AdNeutralRoll        = BoatNeutralNick - MAX_DRIFT_NR;
-
 
1582
        if(AdNeutralRoll > BoatNeutralRoll + MAX_DRIFT_NR) AdNeutralRoll        = BoatNeutralRoll + MAX_DRIFT_NR;
-
 
1583
        if(AdNeutralRoll < BoatNeutralRoll - MAX_DRIFT_NR) AdNeutralRoll        = BoatNeutralRoll - MAX_DRIFT_NR;
-
 
1584
        if(AdNeutralGier > BoatNeutralGier + MAX_DRIFT_YAW) AdNeutralGier = BoatNeutralGier + MAX_DRIFT_YAW;
-
 
1585
        if(AdNeutralGier < BoatNeutralGier - MAX_DRIFT_YAW) AdNeutralGier = BoatNeutralGier - MAX_DRIFT_YAW;
1521
  }
1586
  }
1522
  else
1587
  else
1523
  {
1588
  {
1524
   DriftNick = 0;
1589
   DriftNick = 0;
1525
   DriftRoll = 0;
1590
   DriftRoll = 0;