Subversion Repositories FlightCtrl

Rev

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

Rev 1731 Rev 1738
Line 71... Line 71...
71
long IntegralRoll = 0,IntegralRoll2 = 0;
71
long IntegralRoll = 0,IntegralRoll2 = 0;
72
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0;
72
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0;
73
long Integral_Gier = 0;
73
long Integral_Gier = 0;
74
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0;
74
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0;
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; //MartinR so war es
-
 
77
long Mess_Integral_Gier = 0; //MartinR: Mess_Integral_Gier2 unbenutzt
77
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2;
78
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2;
78
long SummeNick=0,SummeRoll=0;
79
long SummeNick=0,SummeRoll=0;
79
volatile long Mess_Integral_Hoch = 0;
80
volatile long Mess_Integral_Hoch = 0;
80
int  KompassValue = 0;
81
int  KompassValue = 0;
81
int  KompassStartwert = 0;
82
int  KompassStartwert = 0;
Line 98... Line 99...
98
char MotorenEin = 0,StartTrigger = 0;
99
char MotorenEin = 0,StartTrigger = 0;
99
long HoehenWert = 0;
100
long HoehenWert = 0;
100
long SollHoehe = 0;
101
long SollHoehe = 0;
101
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
102
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
102
//float Ki =  FAKTOR_I;
103
//float Ki =  FAKTOR_I;
103
int Ki = 10300 / 33;
104
int Ki = 10300 / 33;
-
 
105
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter
-
 
106
 
104
unsigned char Looping_Nick = 0,Looping_Roll = 0;
107
unsigned char Looping_Nick = 0,Looping_Roll = 0;
105
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 106... Line 109...
106
 
109
 
107
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
110
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
Line 149... Line 152...
149
unsigned char Parameter_ExternalControl;
152
unsigned char Parameter_ExternalControl;
150
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
153
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
151
unsigned char CareFree = 0;
154
unsigned char CareFree = 0;
Line 152... Line 155...
152
 
155
 
153
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
156
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
-
 
157
//int MaxStickNick = 0,MaxStickRoll = 0; MartinR: so war es
-
 
158
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0;  // MartinR: stick_.._neutral hinzugefügt
154
int MaxStickNick = 0,MaxStickRoll = 0;
159
 
155
unsigned int  modell_fliegt = 0;
160
unsigned int  modell_fliegt = 0;
156
volatile unsigned char FCFlags = 0;
161
volatile unsigned char FCFlags = 0;
157
long GIER_GRAD_FAKTOR = 1291;
162
long GIER_GRAD_FAKTOR = 1291;
158
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
163
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
Line 182... Line 187...
182
    DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR;
187
    DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR;
183
    DebugOut.Analog[12] = Motor[0].SetPoint;
188
    DebugOut.Analog[12] = Motor[0].SetPoint;
184
    DebugOut.Analog[13] = Motor[1].SetPoint;
189
    DebugOut.Analog[13] = Motor[1].SetPoint;
185
    DebugOut.Analog[14] = Motor[2].SetPoint;
190
    DebugOut.Analog[14] = Motor[2].SetPoint;
186
    DebugOut.Analog[15] = Motor[3].SetPoint;
191
    DebugOut.Analog[15] = Motor[3].SetPoint;
-
 
192
        //DebugOut.Analog[16] = DiffNick;  // MartinR: test
-
 
193
        //DebugOut.Analog[17] = DiffRoll;  // MartinR: test
-
 
194
        //DebugOut.Analog[18] = MesswertNick;  // MartinR: test
-
 
195
        //DebugOut.Analog[19] = MesswertRoll;  // MartinR: test
187
    DebugOut.Analog[20] = ServoNickValue;
196
    DebugOut.Analog[20] = ServoNickValue;
188
    DebugOut.Analog[22] = Capacity.ActualCurrent;
197
    DebugOut.Analog[22] = Capacity.ActualCurrent;
189
    DebugOut.Analog[23] = Capacity.UsedCapacity;
198
    //DebugOut.Analog[23] = Capacity.UsedCapacity;
190
//    DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ;
199
//    DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ;
191
//    DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay;
200
//    DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay;
192
        DebugOut.Analog[29] = Capacity.MinOfMaxPWM;
201
        DebugOut.Analog[29] = Capacity.MinOfMaxPWM;
193
    DebugOut.Analog[30] = GPS_Nick;
202
    DebugOut.Analog[30] = GPS_Nick;
194
    DebugOut.Analog[31] = GPS_Roll;
203
    DebugOut.Analog[31] = GPS_Roll;
Line 363... Line 372...
363
    static signed long tmpl,tmpl2,tmpl3,tmpl4;
372
    static signed long tmpl,tmpl2,tmpl3,tmpl4;
364
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
373
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
365
        signed long winkel_nick, winkel_roll;
374
        signed long winkel_nick, winkel_roll;
366
    unsigned char i;
375
    unsigned char i;
367
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
376
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
368
    MesswertNick = (signed int) AdWertNickFilter / 8;
377
    //MesswertNick = (signed int) AdWertNickFilter / 8; // MartinR: so war es
369
    MesswertRoll = (signed int) AdWertRollFilter / 8;
378
    //MesswertRoll = (signed int) AdWertRollFilter / 8; // MartinR: so war es
-
 
379
        MesswertNick = (signed int) AdWertNickFilter  ; // MartinR die Division /8 erfolgt bereits in der analog.c
-
 
380
    MesswertRoll = (signed int) AdWertRollFilter ; // MartinR die Division /8 erfolgt bereits in der analog.c
370
    RohMesswertNick = MesswertNick;
381
    RohMesswertNick = MesswertNick;
371
    RohMesswertRoll = MesswertRoll;
382
    RohMesswertRoll = MesswertRoll;
Line 372... Line 383...
372
 
383
 
373
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
384
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
Line 396... Line 407...
396
 
407
 
397
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
408
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
398
   Mess_Integral_Gier += MesswertGier;
409
   Mess_Integral_Gier += MesswertGier;
399
   ErsatzKompass += MesswertGier;
410
   ErsatzKompass += MesswertGier;
-
 
411
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
-
 
412
         
-
 
413
         
-
 
414
          // if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0;  // MartinR: zusätzlich
400
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
415
         
-
 
416
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))  // MartinR : so war es
-
 
417
          //if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor"
-
 
418
          // MartinR: Test Kamera-Ausgleich im HH
401
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
419
         
402
         {
420
         {
403
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
421
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
404
            tmpl3 *= Parameter_AchsKopplung2; //65
422
            tmpl3 *= Parameter_AchsKopplung2; //65
405
            tmpl3 /= 4096L;
423
            tmpl3 /= 4096L;
Line 458... Line 476...
458
    IntegralNick = Mess_IntegralNick;
476
    IntegralNick = Mess_IntegralNick;
459
    IntegralRoll = Mess_IntegralRoll;
477
    IntegralRoll = Mess_IntegralRoll;
460
    IntegralNick2 = Mess_IntegralNick2;
478
    IntegralNick2 = Mess_IntegralNick2;
461
    IntegralRoll2 = Mess_IntegralRoll2;
479
    IntegralRoll2 = Mess_IntegralRoll2;
Line -... Line 480...
-
 
480
 
462
 
481
//#define D_LIMIT 128 // MartinR: so war es
-
 
482
#define D_LIMIT 16
463
#define D_LIMIT 128
483
// MartinR: Änderung war notwendig, da die Division /8 bereits in der analog.c erfolgt
464
 
484
 
465
   MesswertNick = HiResNick / 8;
485
   //MesswertNick = HiResNick / 8; // MartinR : so war es
-
 
486
  // MesswertRoll = HiResRoll / 8; // MartinR : so war es
-
 
487
   MesswertNick = HiResNick ; // MartinR die Division /8 erfolgt bereits in der analog.c
-
 
488
   MesswertRoll = HiResRoll ; // MartinR die Division /8 erfolgt bereits in der analog.c
-
 
489
 
-
 
490
        // MartinR : so war es Anfang  
466
   MesswertRoll = HiResRoll / 8;
491
        /*
467
 
492
       
468
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
493
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
469
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
494
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
470
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
495
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
471
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
496
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
472
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
497
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
-
 
498
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
-
 
499
         
-
 
500
   // MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000
-
 
501
        */
-
 
502
        // MartinR : so war es Ende
-
 
503
       
-
 
504
         // MartinR : Neu Anfang
-
 
505
        if(PlatinenVersion == 10)  
-
 
506
        {
-
 
507
        if(AdWertNick > 1010) MesswertNick = +600;  
-
 
508
        if(AdWertNick > 1017) MesswertNick = +800;
-
 
509
        if(AdWertNick < 15)   MesswertNick = -600;  
-
 
510
        if(AdWertNick <  7)   MesswertNick = -800;
-
 
511
        if(AdWertRoll > 1010) MesswertRoll = +600;  
-
 
512
        if(AdWertRoll > 1017) MesswertRoll = +800;
-
 
513
        if(AdWertRoll < 15)   MesswertRoll = -600;  
-
 
514
        if(AdWertRoll <  7)   MesswertRoll = -800;
-
 
515
        }
-
 
516
        else  
-
 
517
        {  
-
 
518
        if(AdWertNick > 2000) MesswertNick = +1200;  
-
 
519
        if(AdWertNick > 2015) MesswertNick = +1600;
-
 
520
        if(AdWertNick < 15)   MesswertNick = -1200;  
-
 
521
        if(AdWertNick <  7)   MesswertNick = -1600;
-
 
522
        if(AdWertRoll > 2000) MesswertRoll = +1200;  
-
 
523
        if(AdWertRoll > 2015) MesswertRoll = +1600;
-
 
524
        if(AdWertRoll < 15)   MesswertRoll = -1200;  
-
 
525
        if(AdWertRoll <  7)   MesswertRoll = -1600;
-
 
526
        }
Line 473... Line 527...
473
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
527
 // MartinR : Neu Ende
-
 
528
 
-
 
529
  if(Parameter_Gyro_D)  
474
 
530
  // MartinR: hier sind Änderungen erforderlich, da u.a. MesswertNick = HiResNick / 8 von der fc.c in die analog.c verschoben wurde
475
  if(Parameter_Gyro_D)
531
  // Hintergrund: Code einsparen
476
  {
532
  {
477
   d2Nick = HiResNick - oldNick;
533
   d2Nick = HiResNick - oldNick;
478
   oldNick = (oldNick + HiResNick)/2;
534
   oldNick = (oldNick + HiResNick)/2;
479
   if(d2Nick > D_LIMIT) d2Nick = D_LIMIT;
535
   if(d2Nick > D_LIMIT) d2Nick = D_LIMIT;
-
 
536
   else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT;
480
   else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT;
537
   //MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; // MartinR : so war es 
481
   MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16;
538
   MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 2; // MartinR : geändert 
482
   d2Roll = HiResRoll - oldRoll;
539
   d2Roll = HiResRoll - oldRoll;
483
   oldRoll = (oldRoll + HiResRoll)/2;
540
   oldRoll = (oldRoll + HiResRoll)/2;
484
   if(d2Roll > D_LIMIT) d2Roll = D_LIMIT;
541
   if(d2Roll > D_LIMIT) d2Roll = D_LIMIT;
-
 
542
   else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT;
485
   else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT;
543
   //MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; // MartinR : so war es 
486
   MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16;
544
   MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 2; // MartinR : geändert 
487
   HiResNick += (d2Nick * (signed int) Parameter_Gyro_D);
545
   HiResNick += (d2Nick * (signed int) Parameter_Gyro_D * 8); // martinR: *8 hinzugefügt
Line 488... Line 546...
488
   HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D);
546
   HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D * 8); // martinR: *8 hinzugefügt
489
  }
547
  }
490
 
548
 
Line 559... Line 617...
559
 CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255);
617
 CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255);
560
 CHK_POTI(Parameter_Servo3,EE_Parameter.Servo3);
618
 CHK_POTI(Parameter_Servo3,EE_Parameter.Servo3);
561
 CHK_POTI(Parameter_Servo4,EE_Parameter.Servo4);
619
 CHK_POTI(Parameter_Servo4,EE_Parameter.Servo4);
562
 CHK_POTI(Parameter_Servo5,EE_Parameter.Servo5);
620
 CHK_POTI(Parameter_Servo5,EE_Parameter.Servo5);
563
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe);
621
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe);
564
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe);
622
 //CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe); // MartinR: Zeile war doppelt
565
 CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung);
623
 CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung);
566
 CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z);
624
 CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z);
567
 CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung);
625
 CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung);
568
 CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I);
626
 CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I);
569
 CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D);
627
 CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D);
Line 586... Line 644...
586
 CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection);
644
 CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection);
587
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
645
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
588
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
646
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
589
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
647
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
590
 Ki = 10300 / (Parameter_I_Faktor + 1);
648
 Ki = 10300 / (Parameter_I_Faktor + 1);
-
 
649
 
-
 
650
   
-
 
651
 if(Parameter_UserParam1 > 50) KiHH = 10300 / (Parameter_UserParam2 + 1); else  KiHH = Ki; // MartinR : für HH über Schalter
-
 
652
 Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen
-
 
653
 if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode 
-
 
654
  // 0 = free; 100 = AID; 200 = coming home //neu 
-
 
655
 
-
 
656
 
591
 MAX_GAS = EE_Parameter.Gas_Max;
657
 MAX_GAS = EE_Parameter.Gas_Max;
592
 MIN_GAS = EE_Parameter.Gas_Min;
658
 MIN_GAS = EE_Parameter.Gas_Min;
Line 593... Line 659...
593
 
659
 
594
 tmp = EE_Parameter.OrientationModeControl;
660
 tmp = EE_Parameter.OrientationModeControl;
Line 618... Line 684...
618
void MotorRegler(void)
684
void MotorRegler(void)
619
//############################################################################
685
//############################################################################
620
{
686
{
621
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
687
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
622
         int GierMischanteil,GasMischanteil;
688
         int GierMischanteil,GasMischanteil;
-
 
689
         
-
 
690
         static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung Prüfen !!!!!!!!!!!!!
-
 
691
         
623
     static long sollGier = 0,tmp_long,tmp_long2;
692
     static long sollGier = 0,tmp_long,tmp_long2;
624
     static long IntegralFehlerNick = 0;
693
     static long IntegralFehlerNick = 0;
625
     static long IntegralFehlerRoll = 0;
694
     static long IntegralFehlerRoll = 0;
626
         static unsigned int RcLostTimer;
695
         static unsigned int RcLostTimer;
627
         static unsigned char delay_neutral = 0;
696
         static unsigned char delay_neutral = 0;
Line 769... Line 838...
769
                                                                {
838
                                                                {
770
                                                                        modell_fliegt = 1;
839
                                                                        modell_fliegt = 1;
771
                                                                        MotorenEin = 1;
840
                                                                        MotorenEin = 1;
772
                                                                        sollGier = 0;
841
                                                                        sollGier = 0;
773
                                                                        Mess_Integral_Gier = 0;
842
                                                                        Mess_Integral_Gier = 0;
774
                                                                        Mess_Integral_Gier2 = 0;
843
                                                                        //Mess_Integral_Gier2 = 0; //MartinR: Mess_Integral_Gier2 unbenutzt
775
                                                                        Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick;
844
                                                                        Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick;
776
                                                                        Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll;
845
                                                                        Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll;
777
                                                                        Mess_IntegralNick2 = IntegralNick;
846
                                                                        Mess_IntegralNick2 = IntegralNick;
778
                                                                        Mess_IntegralRoll2 = IntegralRoll;
847
                                                                        Mess_IntegralRoll2 = IntegralRoll;
779
                                                                        SummeNick = 0;
848
                                                                        SummeNick = 0;
Line 813... Line 882...
813
 
882
 
814
 if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG))
883
 if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG))
815
  {
884
  {
816
        static int stick_nick,stick_roll;
885
        static int stick_nick,stick_roll;
-
 
886
    ParameterZuordnung();
-
 
887
                // MartinR: original:   
817
    ParameterZuordnung();
888
        /*
818
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
889
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
819
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
890
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
820
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
891
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
892
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
893
       
-
 
894
                        */
-
 
895
// MartinR: geändert Anfang
-
 
896
        if(Parameter_UserParam1 > 50)   // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist
-
 
897
                {
-
 
898
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4;
-
 
899
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ;
-
 
900
                //stick_nick = (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral);
-
 
901
                //stick_roll = (PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral);
-
 
902
                }
-
 
903
               
-
 
904
         else
-
 
905
                {
-
 
906
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
-
 
907
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
908
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
909
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
910
                }
-
 
911
       
-
 
912
         if(IntegralFaktor)  
-
 
913
                {
-
 
914
                //stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
915
                //stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
916
                stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
-
 
917
                stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
918
               
-
 
919
                //StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam  wohin verschoben ?? Prüfen !!!!!!!!!!!!!!!!!!!!
-
 
920
                //StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
921
                }
-
 
922
        /*else          // wenn HH , MartinR
-
 
923
                {
-
 
924
                //stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
925
                //stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
926
                //StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam    wohin verschoben ?? Prüfen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
 
927
                //StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam
-
 
928
                }
-
 
929
        */
-
 
930
// MartinR: geändert Ende
Line 821... Line 931...
821
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
931
 
822
 
932
 
823
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
933
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
824
// CareFree und freie Wahl der vorderen Richtung
934
// CareFree und freie Wahl der vorderen Richtung
Line 825... Line 935...
825
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
935
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
826
signed char sintab[31] = { 0, 2, 4, 6, 7, 8, 8, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -8, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 8};
936
signed char sintab[31] = { 0, 2, 4, 6, 7, 8, 8, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -8, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 8};
827
 
937
 
828
if(CareFree)
938
if(CareFree)
829
 {
939
 {
830
    signed int nick, roll;
940
    signed int nick, roll;
831
        nick = stick_nick / 4;
941
        nick = stick_nick / 4;
832
        roll = stick_roll / 4;
942
        roll = stick_roll / 4;
833
    StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4);
943
    StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4);
834
    StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4);
944
    StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4);
835
 }
945
 }
836
 else
946
 else // verrechnung des OrientationAngle
837
 {
947
 {
838
        FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6];
948
        FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6];
Line 849... Line 959...
849
    StickNick -= (GPS_Nick + GPS_Nick2);
959
    StickNick -= (GPS_Nick + GPS_Nick2);
850
    StickRoll -= (GPS_Roll + GPS_Roll2);
960
    StickRoll -= (GPS_Roll + GPS_Roll2);
851
        StickGas  = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120;
961
        StickGas  = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120;
Line 852... Line 962...
852
 
962
 
853
    GyroFaktor     = (Parameter_Gyro_P + 10.0);
963
    GyroFaktor     = (Parameter_Gyro_P + 10.0);
854
    IntegralFaktor = Parameter_Gyro_I;
964
    // IntegralFaktor = Parameter_Gyro_I; // MartinR: verschoben um Code zu sparen
855
    GyroFaktorGier     = (Parameter_Gyro_Gier_P + 10.0);
965
    GyroFaktorGier     = (Parameter_Gyro_Gier_P + 10.0);
-
 
966
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
856
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
967
       
-
 
968
       
857
 
969
       
858
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
970
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
859
//+ Analoge Steuerung per Seriell
971
//+ Analoge Steuerung per Seriell
-
 
972
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
973
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen??
860
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
974
 
861
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
975
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
862
    {
976
    {
863
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
977
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
864
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
978
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
865
         StickGier += ExternControl.Gier;
979
         StickGier += ExternControl.Gier;
866
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
980
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
867
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
981
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
868
    }
982
    }
Line 869... Line 983...
869
    if(StickGas < 0) StickGas = 0;
983
    if(StickGas < 0) StickGas = 0;
Line 870... Line 984...
870
 
984
 
871
    if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
985
        //if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0; // MartinR: so war es, verschoben 
872
 
986
 
873
    if(abs(StickNick/STICK_GAIN) > MaxStickNick)
987
    if(abs(StickNick/STICK_GAIN) > MaxStickNick)
Line 922... Line 1036...
922
 
1036
 
923
   if(Looping_Links || Looping_Rechts)   Looping_Roll = 1; else Looping_Roll = 0;
1037
   if(Looping_Links || Looping_Rechts)   Looping_Roll = 1; else Looping_Roll = 0;
924
   if(Looping_Oben  || Looping_Unten) {  Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0;
1038
   if(Looping_Oben  || Looping_Unten) {  Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0;
Line -... Line 1039...
-
 
1039
  } // Ende neue Funken-Werte
925
  } // Ende neue Funken-Werte
1040
 
926
 
1041
 
927
  if(Looping_Roll || Looping_Nick)
1042
  if(Looping_Roll || Looping_Nick)
928
   {
1043
   {
929
    if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit;
1044
    if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit;
Line 930... Line -...
930
        TrichterFlug = 1;
-
 
931
   }
1045
        TrichterFlug = 1;
932
 
1046
   }
933
 
1047
 
934
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1048
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
935
// Bei Empfangsausfall im Flug
1049
// Bei Empfangsausfall im Flug
Line 956... Line 1070...
956
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
1070
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
957
 MittelIntegralRoll  += IntegralRoll;
1071
 MittelIntegralRoll  += IntegralRoll;
958
 MittelIntegralNick2 += IntegralNick2;
1072
 MittelIntegralNick2 += IntegralNick2;
959
 MittelIntegralRoll2 += IntegralRoll2;
1073
 MittelIntegralRoll2 += IntegralRoll2;
Line 960... Line 1074...
960
 
1074
 
-
 
1075
        // if(Looping_Nick || Looping_Roll)  // MartinR: so war es
961
 if(Looping_Nick || Looping_Roll)
1076
  if(Looping_Nick || Looping_Roll || (!IntegralFaktor & (Parameter_UserParam1 < 50) & !(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD))) // MartinR: erweitert
962
  {
1077
  {
963
    IntegralAccNick = 0;
1078
    IntegralAccNick = 0;
964
    IntegralAccRoll = 0;
1079
    IntegralAccRoll = 0;
965
    MittelIntegralNick = 0;
1080
    MittelIntegralNick = 0;
Line 970... Line 1085...
970
    Mess_IntegralRoll2 = Mess_IntegralRoll;
1085
    Mess_IntegralRoll2 = Mess_IntegralRoll;
971
    ZaehlMessungen = 0;
1086
    ZaehlMessungen = 0;
972
    LageKorrekturNick = 0;
1087
    LageKorrekturNick = 0;
973
    LageKorrekturRoll = 0;
1088
    LageKorrekturRoll = 0;
974
  }
1089
  }
-
 
1090
 
-
 
1091
  if(!IntegralFaktor & (Parameter_UserParam1 < 50) & !(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD)) // MartinR: 
-
 
1092
          // nur im Moment des Umschaltens von HH auf ACC erfolgt ein Reset der Integrale, nicht aber bei normalem HH 
-
 
1093
          // um einen im HH-Mode eventuell schwindelig geflogenen ACC_Mode zu resetten!
-
 
1094
          // bis zur Umschaltung werden die Integrale für den Kameraausgleich verwendet 
-
 
1095
        {
-
 
1096
       
-
 
1097
        IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
1098
    IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 
-
 
1099
    Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
1100
    Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
1101
    //Mess_Integral_Gier = 0;   // MartinR: im HH-Modus alle unbenutzten Integratoren = 0       
-
 
1102
        //Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
1103
    //Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
1104
        }
-
 
1105
 
-
 
1106
        if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0; // MartinR geändert und verschoben
-
 
1107
          else IntegralFaktor = Parameter_Gyro_I; // MartinR: verschoben um Code zu sparen
Line 975... Line 1108...
975
 
1108
 
976
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1109
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1110
    if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) // MartinR: so war es, für Test wieder aktiviert
-
 
1111
  //if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt 
977
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
1112
 
978
  {
1113
  {
979
   long tmp_long, tmp_long2;
1114
   long tmp_long, tmp_long2;
980
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
1115
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
981
     {
1116
     {
Line 1029... Line 1164...
1029
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1164
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1030
 {
1165
 {
1031
  static int cnt = 0;
1166
  static int cnt = 0;
1032
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1167
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1033
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1168
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1034
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp)
1169
  //if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) // MartinR: so war es
-
 
1170
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt
-
 
1171
 
1035
  {
1172
  {
1036
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1173
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1037
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1174
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1038
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1175
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1039
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
1176
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
Line 1248... Line 1385...
1248
 
1385
 
1249
#define TRIM_MAX 200
1386
#define TRIM_MAX 200
1250
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
1387
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
Line -... Line 1388...
-
 
1388
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
-
 
1389
 
-
 
1390
        //MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1391
    //MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1392
       
-
 
1393
        if(!IntegralFaktor) // MartinR : HH-Mode hinzugefügt
-
 
1394
        {
-
 
1395
        MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN)  ; // MartinR : hinzugefügt
-
 
1396
        MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ;  // MartinR : hinzugefügt
-
 
1397
        MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN);
-
 
1398
        Mess_Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0       
-
 
1399
        Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
1400
        }
1251
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
1401
        else // MartinR: ACC-Mode  so war es
1252
 
1402
        {
1253
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
1403
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
-
 
1404
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
-
 
1405
        MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
-
 
1406
        }
Line 1254... Line 1407...
1254
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1407
       
1255
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1408
    //MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); // MartinR so war es
1256
 
1409
 
1257
    // Maximalwerte abfangen
1410
    // Maximalwerte abfangen
Line 1341... Line 1494...
1341
                   }
1494
                   }
Line 1342... Line 1495...
1342
 
1495
 
1343
                // if height control is activated by an rc channel
1496
                // if height control is activated by an rc channel
1344
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1497
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1345
                {       // check if parameter is less than activation threshold
1498
                {       // check if parameter is less than activation threshold
-
 
1499
                        // if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position  // MartinR :so war es
1346
                        if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position
1500
                        if(Parameter_MaxHoehe < 50  || (Parameter_UserParam1 > 140) )   // MartinR: Schalter aus oder HH ohne Höhenregler über UsererParam1 an
1347
                        {   //height control not active
1501
                        {   //height control not active
1348
                                if(!delay--)
1502
                                if(!delay--)
1349
                                {
1503
                                {
1350
                                        HoehenReglerAktiv = 0; // disable height control
1504
                                        HoehenReglerAktiv = 0; // disable height control
Line 1359... Line 1513...
1359
                        }
1513
                        }
1360
                }
1514
                }
1361
                else // no switchable height control
1515
                else // no switchable height control
1362
                {
1516
                {
1363
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
1517
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
-
 
1518
                        // HoehenReglerAktiv = 1; // MartinR : so war es
-
 
1519
                        // MartinR : geändert Anfang
-
 
1520
                                if(Parameter_UserParam1 > 140) // HH über Schalter: HH an + Höhenregler abgeschaltet, Nachführen von Parametern 
-
 
1521
                                {
-
 
1522
                                        HoehenReglerAktiv = 0;
-
 
1523
                                }
-
 
1524
                                else  // Höhenregler mit Sollhöhe über Poti aktiv
-
 
1525
                                {
1364
                        HoehenReglerAktiv = 1;
1526
                                        HoehenReglerAktiv = 1;
-
 
1527
                                }
-
 
1528
                        // MartinR : geändert Ende
1365
                }
1529
                }
Line 1366... Line 1530...
1366
 
1530
 
1367
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1531
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1368
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
1532
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
Line 1638... Line 1802...
1638
     if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2);
1802
     if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2);
1639
    }
1803
    }
1640
    tmp_int = MAX_GAS*STICK_GAIN;
1804
    tmp_int = MAX_GAS*STICK_GAIN;
1641
    if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil));
1805
    if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil));
1642
    if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil));
1806
    if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil));
-
 
1807
       
-
 
1808
       
-
 
1809
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1810
// Nick / Roll-Achse  // MartinR: um Code zu sparen wurde Nick und Roll zusammengefasst
-
 
1811
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1812
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
-
 
1813
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
Line -... Line 1814...
-
 
1814
 
-
 
1815
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 ; // Zwischenergebnis um Code zu sparen
-
 
1816
        pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8;
-
 
1817
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1818
         {
-
 
1819
          SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
-
 
1820
          if(SummeNick >  (STICK_GAIN * 8000L)) SummeNick =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1821
      if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1822
          pd_ergebnis_nick += (SummeNick / Ki); // PI-Regler für Nick
-
 
1823
          SummeNickHH = 0 ;
-
 
1824
         
-
 
1825
          SummeRoll += IntegralRollMalFaktor - StickRoll;
-
 
1826
          if(SummeRoll >  (STICK_GAIN * 8000L)) SummeRoll =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1827
      if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1828
          pd_ergebnis_roll += (SummeRoll / Ki); // PI-Regler für Roll
-
 
1829
          SummeRollHH = 0;
-
 
1830
         
-
 
1831
         }
-
 
1832
    else // MartinR : HH-Mode
-
 
1833
         {
-
 
1834
          SummeNickHH += DiffNick; // I-Anteil bei HH
-
 
1835
      if(SummeNickHH >  (STICK_GAIN * 8000L)) SummeNickHH =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1836
      if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1837
          pd_ergebnis_nick += SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH
-
 
1838
          SummeNick = 0;
-
 
1839
         
-
 
1840
          SummeRollHH += DiffRoll;  // I-Anteil bei HH
-
 
1841
      if(SummeRollHH >  (STICK_GAIN * 8000L)) SummeRollHH =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1842
      if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1843
          pd_ergebnis_roll += SummeRollHH / KiHH;       // MartinR: PI-Regler für Roll bei HH
-
 
1844
          SummeRoll = 0;
-
 
1845
     } 
-
 
1846
        // MartinR : geändert Ende
-
 
1847
       
-
 
1848
       
-
 
1849
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
-
 
1850
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
-
 
1851
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
-
 
1852
 
-
 
1853
        //tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
-
 
1854
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
-
 
1855
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;       
-
 
1856
       
-
 
1857
       
-
 
1858
// MartinR: alt
1643
 
1859
/*
1644
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1860
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1645
// Nick-Achse
1861
// Nick-Achse
1646
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1862
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1863
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
-
 
1864
        // MartinR : so war es Anfang
1647
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
1865
        /+
1648
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1866
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1649
    else  SummeNick += DiffNick; // I-Anteil bei HH
1867
    else  SummeNick += DiffNick; // I-Anteil bei HH
1650
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1868
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1651
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1869
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1652
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 + SummeNick / Ki; // PI-Regler für Nick
1870
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 + SummeNick / Ki; // PI-Regler für Nick
-
 
1871
    // Motor Vorn
-
 
1872
       
-
 
1873
        +/
-
 
1874
        // MartinR : so war es Ende
-
 
1875
       
-
 
1876
        // MartinR : geändert Anfang
-
 
1877
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 ; // Zwischenergebnis um Code zu sparen
-
 
1878
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1879
         {
-
 
1880
          SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
-
 
1881
          if(SummeNick >  (STICK_GAIN * 8000L)) SummeNick =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1882
      if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1883
          //pd_ergebnis_nick = DiffNick + (SummeNick / Ki);
-
 
1884
          pd_ergebnis_nick += (SummeNick / Ki); // PI-Regler für Nick
-
 
1885
          SummeNickHH = 0 ;
-
 
1886
         }
-
 
1887
    else // MartinR : HH-Mode
-
 
1888
         {
-
 
1889
          SummeNickHH += DiffNick; // I-Anteil bei HH
-
 
1890
      if(SummeNickHH >  (STICK_GAIN * 8000L)) SummeNickHH =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1891
      if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1892
          pd_ergebnis_nick += SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH
-
 
1893
          SummeNick = 0;
-
 
1894
     } 
-
 
1895
        // MartinR : geändert Ende
-
 
1896
       
1653
    // Motor Vorn
1897
       
1654
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1898
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1655
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
1899
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
Line 1656... Line 1900...
1656
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1900
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1657
 
1901
 
1658
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1902
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1659
// Roll-Achse
1903
// Roll-Achse
-
 
1904
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1905
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1660
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1906
        // MartinR : so war es Anfang
1661
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1907
        /+
1662
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1908
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1663
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1909
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1664
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1910
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
-
 
1911
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
-
 
1912
    pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8 + SummeRoll / Ki;   // PI-Regler für Roll
-
 
1913
        +/
-
 
1914
        // MartinR : so war es Ende
-
 
1915
       
-
 
1916
        // MartinR : geändert Anfang
-
 
1917
        pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8;
-
 
1918
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1919
         {
-
 
1920
         SummeRoll += IntegralRollMalFaktor - StickRoll;
-
 
1921
         if(SummeRoll >  (STICK_GAIN * 8000L)) SummeRoll =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1922
     if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1923
         //tmp_int = SummeRoll / Ki;
-
 
1924
         //pd_ergebnis_roll = DiffRoll + tmp_int;       // MartinR: PI-Regler im ACC-Mode
-
 
1925
         pd_ergebnis_roll += SummeRoll / Ki;    // PI-Regler für Roll
-
 
1926
         //SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH
-
 
1927
         // MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern!
-
 
1928
         SummeRollHH = 0;
-
 
1929
         }
-
 
1930
    else // MartinR : HH-Mode
-
 
1931
         {               
-
 
1932
          SummeRollHH += DiffRoll;  // I-Anteil bei HH
-
 
1933
      if(SummeRollHH >  (STICK_GAIN * 8000L)) SummeRollHH =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1934
      if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1935
          pd_ergebnis_roll += SummeRollHH / KiHH;       // MartinR: PI-Regler für Roll bei HH
-
 
1936
          SummeRoll = 0;
-
 
1937
         }
1665
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1938
        // MartinR : geändert Ende
1666
    pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8 + SummeRoll / Ki;   // PI-Regler für Roll
1939
       
1667
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1940
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
-
 
1941
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
-
 
1942
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;
Line 1668... Line 1943...
1668
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
1943
       
1669
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;
1944
        */
1670
 
1945
 
1671
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1946
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Line 1690... Line 1965...
1690
                        if(Mixer.Motor[i][3] == 64) tmp_int += GierMischanteil;
1965
                        if(Mixer.Motor[i][3] == 64) tmp_int += GierMischanteil;
1691
                        else if(Mixer.Motor[i][3] == -64) tmp_int -= GierMischanteil;
1966
                        else if(Mixer.Motor[i][3] == -64) tmp_int -= GierMischanteil;
1692
                        else tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L;
1967
                        else tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L;
Line 1693... Line 1968...
1693
 
1968
 
1694
                        if(tmp_int > tmp_motorwert[i]) tmp_int = (tmp_motorwert[i] + tmp_int) / 2;      // MotorSmoothing
1969
                        if(tmp_int > tmp_motorwert[i]) tmp_int = (tmp_motorwert[i] + tmp_int) / 2;      // MotorSmoothing
-
 
1970
                        //else tmp_int = 2 * tmp_int - tmp_motorwert[i];                // MotorSmoothing  // MartinR: so war es
Line 1695... Line 1971...
1695
                        else tmp_int = 2 * tmp_int - tmp_motorwert[i];                                                              // MotorSmoothing
1971
                        //else tmp_int = tmp_int;               // MartinR: Entsprechend Vorschlag von MartinW geändert
1696
 
1972
 
1697
                        LIMIT_MIN_MAX(tmp_int,MIN_GAS * 4,MAX_GAS * 4);
1973
                        LIMIT_MIN_MAX(tmp_int,MIN_GAS * 4,MAX_GAS * 4);
1698
                        Motor[i].SetPoint = tmp_int / 4;
1974
                        Motor[i].SetPoint = tmp_int / 4;