Subversion Repositories FlightCtrl

Rev

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

Rev 1722 Rev 1728
Line 99... Line 99...
99
long HoehenWert = 0;
99
long HoehenWert = 0;
100
long SollHoehe = 0;
100
long SollHoehe = 0;
101
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
101
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
102
//float Ki =  FAKTOR_I;
102
//float Ki =  FAKTOR_I;
103
int Ki = 10300 / 33;
103
int Ki = 10300 / 33;
-
 
104
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter
-
 
105
 
104
unsigned char Looping_Nick = 0,Looping_Roll = 0;
106
unsigned char Looping_Nick = 0,Looping_Roll = 0;
105
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
107
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
Line 106... Line 108...
106
 
108
 
107
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
109
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
Line 149... Line 151...
149
unsigned char Parameter_ExternalControl;
151
unsigned char Parameter_ExternalControl;
150
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
152
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
151
unsigned char CareFree = 0;
153
unsigned char CareFree = 0;
Line 152... Line 154...
152
 
154
 
153
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
155
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
-
 
156
//int MaxStickNick = 0,MaxStickRoll = 0; MartinR: so war es
-
 
157
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0;  // MartinR: stick_.._neutral hinzugefügt
154
int MaxStickNick = 0,MaxStickRoll = 0;
158
 
155
unsigned int  modell_fliegt = 0;
159
unsigned int  modell_fliegt = 0;
156
volatile unsigned char FCFlags = 0;
160
volatile unsigned char FCFlags = 0;
157
long GIER_GRAD_FAKTOR = 1291;
161
long GIER_GRAD_FAKTOR = 1291;
158
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
162
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
Line 396... Line 400...
396
 
400
 
397
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
401
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
398
   Mess_Integral_Gier += MesswertGier;
402
   Mess_Integral_Gier += MesswertGier;
399
   ErsatzKompass += MesswertGier;
403
   ErsatzKompass += MesswertGier;
-
 
404
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
-
 
405
          if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0;  // MartinR: zusätzlich
400
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
406
         
-
 
407
      //if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))  // MartinR : so war es
-
 
408
          if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor"
401
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
409
         
402
         {
410
         {
403
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
411
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
404
            tmpl3 *= Parameter_AchsKopplung2; //65
412
            tmpl3 *= Parameter_AchsKopplung2; //65
405
            tmpl3 /= 4096L;
413
            tmpl3 /= 4096L;
Line 463... Line 471...
463
#define D_LIMIT 128
471
#define D_LIMIT 128
Line 464... Line 472...
464
 
472
 
465
   MesswertNick = HiResNick / 8;
473
   MesswertNick = HiResNick / 8;
Line -... Line 474...
-
 
474
   MesswertRoll = HiResRoll / 8;
-
 
475
 
-
 
476
        // MartinR : so war es Anfang  
466
   MesswertRoll = HiResRoll / 8;
477
        /*
467
 
478
       
468
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
479
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
469
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
480
   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; }
481
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
471
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
482
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
-
 
483
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
-
 
484
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
-
 
485
         
-
 
486
   // MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000
-
 
487
        */
-
 
488
        // MartinR : so war es Ende
-
 
489
       
-
 
490
         // MartinR : Neu Anfang
-
 
491
        if(PlatinenVersion == 10)  
-
 
492
        {
-
 
493
        if(AdWertNick > 1010) MesswertNick = +600;  
-
 
494
        if(AdWertNick > 1017) MesswertNick = +800;
-
 
495
        if(AdWertNick < 15)   MesswertNick = -600;  
-
 
496
        if(AdWertNick <  7)   MesswertNick = -800;
-
 
497
        if(AdWertRoll > 1010) MesswertRoll = +600;  
-
 
498
        if(AdWertRoll > 1017) MesswertRoll = +800;
-
 
499
        if(AdWertRoll < 15)   MesswertRoll = -600;  
-
 
500
        if(AdWertRoll <  7)   MesswertRoll = -800;
-
 
501
        }
-
 
502
        else  
-
 
503
        {  
-
 
504
        if(AdWertNick > 2000) MesswertNick = +1200;  
-
 
505
        if(AdWertNick > 2015) MesswertNick = +1600;
-
 
506
        if(AdWertNick < 15)   MesswertNick = -1200;  
-
 
507
        if(AdWertNick <  7)   MesswertNick = -1600;
-
 
508
        if(AdWertRoll > 2000) MesswertRoll = +1200;  
-
 
509
        if(AdWertRoll > 2015) MesswertRoll = +1600;
-
 
510
        if(AdWertRoll < 15)   MesswertRoll = -1200;  
-
 
511
        if(AdWertRoll <  7)   MesswertRoll = -1600;
Line 472... Line 512...
472
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
512
        }
473
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
513
 // MartinR : Neu Ende
474
 
514
 
475
  if(Parameter_Gyro_D)
515
  if(Parameter_Gyro_D)
Line 559... Line 599...
559
 CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255);
599
 CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255);
560
 CHK_POTI(Parameter_Servo3,EE_Parameter.Servo3);
600
 CHK_POTI(Parameter_Servo3,EE_Parameter.Servo3);
561
 CHK_POTI(Parameter_Servo4,EE_Parameter.Servo4);
601
 CHK_POTI(Parameter_Servo4,EE_Parameter.Servo4);
562
 CHK_POTI(Parameter_Servo5,EE_Parameter.Servo5);
602
 CHK_POTI(Parameter_Servo5,EE_Parameter.Servo5);
563
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe);
603
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe);
564
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe);
604
 //CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe); // MartinR: Zeile war doppelt
565
 CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung);
605
 CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung);
566
 CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z);
606
 CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z);
567
 CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung);
607
 CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung);
568
 CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I);
608
 CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I);
569
 CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D);
609
 CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D);
Line 586... Line 626...
586
 CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection);
626
 CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection);
587
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
627
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
588
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
628
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
589
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
629
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
590
 Ki = 10300 / (Parameter_I_Faktor + 1);
630
 Ki = 10300 / (Parameter_I_Faktor + 1);
-
 
631
 
-
 
632
   
-
 
633
 if(Parameter_UserParam1 > 50) KiHH = 10300 / (Parameter_UserParam2 + 1); else  KiHH = Ki; // MartinR : für HH über Schalter
-
 
634
 Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen
-
 
635
 if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode 
-
 
636
  // 0 = free; 100 = AID; 200 = coming home //neu 
-
 
637
 
-
 
638
 
591
 MAX_GAS = EE_Parameter.Gas_Max;
639
 MAX_GAS = EE_Parameter.Gas_Max;
592
 MIN_GAS = EE_Parameter.Gas_Min;
640
 MIN_GAS = EE_Parameter.Gas_Min;
Line 593... Line 641...
593
 
641
 
594
 tmp = EE_Parameter.OrientationModeControl;
642
 tmp = EE_Parameter.OrientationModeControl;
Line 618... Line 666...
618
void MotorRegler(void)
666
void MotorRegler(void)
619
//############################################################################
667
//############################################################################
620
{
668
{
621
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
669
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
622
         int GierMischanteil,GasMischanteil;
670
         int GierMischanteil,GasMischanteil;
-
 
671
         
-
 
672
         static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung Prüfen !!!!!!!!!!!!!
-
 
673
         
623
     static long sollGier = 0,tmp_long,tmp_long2;
674
     static long sollGier = 0,tmp_long,tmp_long2;
624
     static long IntegralFehlerNick = 0;
675
     static long IntegralFehlerNick = 0;
625
     static long IntegralFehlerRoll = 0;
676
     static long IntegralFehlerRoll = 0;
626
         static unsigned int RcLostTimer;
677
         static unsigned int RcLostTimer;
627
         static unsigned char delay_neutral = 0;
678
         static unsigned char delay_neutral = 0;
Line 813... Line 864...
813
 
864
 
814
 if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG))
865
 if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG))
815
  {
866
  {
816
        static int stick_nick,stick_roll;
867
        static int stick_nick,stick_roll;
-
 
868
    ParameterZuordnung();
-
 
869
                // MartinR: original:   
817
    ParameterZuordnung();
870
        /*
818
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
871
    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;
872
    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;
873
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
874
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
875
       
-
 
876
                        */
-
 
877
// MartinR: geändert Anfang
-
 
878
        if(Parameter_UserParam1 > 50)   // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist
-
 
879
                {
-
 
880
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4;
-
 
881
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ;
-
 
882
                //stick_nick = (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral);
-
 
883
                //stick_roll = (PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral);
-
 
884
                }
-
 
885
               
-
 
886
         else
-
 
887
                {
-
 
888
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
-
 
889
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
890
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
891
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
892
                }
-
 
893
       
-
 
894
         if(IntegralFaktor)  
-
 
895
                {
-
 
896
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
897
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
898
                stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
-
 
899
                stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
900
               
-
 
901
                //StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam  wohin verschoben ?? Prüfen !!!!!!!!!!!!!!!!!!!!
-
 
902
                //StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
903
                }
-
 
904
        else            // wenn HH , MartinR
-
 
905
                {
-
 
906
                //stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
907
                //stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
908
                //StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam    wohin verschoben ?? Prüfen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
 
909
                //StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam
-
 
910
                }
-
 
911
               
-
 
912
// MartinR: geändert Ende
Line 821... Line 913...
821
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
913
 
822
 
914
 
823
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
915
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
824
// CareFree und freie Wahl der vorderen Richtung
916
// CareFree und freie Wahl der vorderen Richtung
Line 825... Line 917...
825
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
917
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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};
918
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
 
919
 
828
if(CareFree)
920
if(CareFree)  // MartinR: hier kann vermutlich Code gespart werden
829
 {
921
 {
830
    signed int nick, roll;
922
    signed int nick, roll;
831
        nick = stick_nick / 4;
923
        nick = stick_nick / 4;
832
        roll = stick_roll / 4;
924
        roll = stick_roll / 4;
833
    StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4);
925
    StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4);
834
    StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4);
926
    StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4);
835
 }
927
 }
836
 else
928
 else // verrechnung des OrientationAngle
837
 {
929
 {
838
        FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6];
930
        FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6];
Line 856... Line 948...
856
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
948
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
Line 857... Line 949...
857
 
949
 
858
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
950
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
859
//+ Analoge Steuerung per Seriell
951
//+ Analoge Steuerung per Seriell
-
 
952
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
953
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen??
860
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
954
 
861
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
955
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
862
    {
956
    {
863
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
957
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
864
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
958
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
865
         StickGier += ExternControl.Gier;
959
         StickGier += ExternControl.Gier;
866
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
960
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
867
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
961
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
868
    }
962
    }
Line 869... Line 963...
869
    if(StickGas < 0) StickGas = 0;
963
    if(StickGas < 0) StickGas = 0;
-
 
964
 
-
 
965
        //if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0; // MartinR: so war es
Line 870... Line 966...
870
 
966
        if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0;  // MartinR geändert
871
    if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
967
       
872
 
968
 
873
    if(abs(StickNick/STICK_GAIN) > MaxStickNick)
969
    if(abs(StickNick/STICK_GAIN) > MaxStickNick)
Line 956... Line 1052...
956
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
1052
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
957
 MittelIntegralRoll  += IntegralRoll;
1053
 MittelIntegralRoll  += IntegralRoll;
958
 MittelIntegralNick2 += IntegralNick2;
1054
 MittelIntegralNick2 += IntegralNick2;
959
 MittelIntegralRoll2 += IntegralRoll2;
1055
 MittelIntegralRoll2 += IntegralRoll2;
Line 960... Line 1056...
960
 
1056
 
-
 
1057
  //if(Looping_Nick || Looping_Roll) // MartinR: so war es
-
 
1058
 if(Looping_Nick || Looping_Roll || !IntegralFaktor)  // MartinR: "|| !IntegralFaktor" hinzugefügt
961
 if(Looping_Nick || Looping_Roll)
1059
 
962
  {
1060
  {
963
    IntegralAccNick = 0;
1061
    IntegralAccNick = 0;
964
    IntegralAccRoll = 0;
1062
    IntegralAccRoll = 0;
965
    MittelIntegralNick = 0;
1063
    MittelIntegralNick = 0;
966
    MittelIntegralRoll = 0;
1064
    MittelIntegralRoll = 0;
967
    MittelIntegralNick2 = 0;
1065
    MittelIntegralNick2 = 0;
-
 
1066
    MittelIntegralRoll2 = 0;
-
 
1067
       
-
 
1068
        IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
1069
    IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 
-
 
1070
    Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
1071
    Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
1072
    //Mess_Integral_Gier = 0;   // MartinR: im HH-Modus alle unbenutzten Integratoren = 0       
-
 
1073
    //Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
968
    MittelIntegralRoll2 = 0;
1074
       
969
    Mess_IntegralNick2 = Mess_IntegralNick;
1075
    Mess_IntegralNick2 = Mess_IntegralNick;
970
    Mess_IntegralRoll2 = Mess_IntegralRoll;
1076
    Mess_IntegralRoll2 = Mess_IntegralRoll;
971
    ZaehlMessungen = 0;
1077
    ZaehlMessungen = 0;
972
    LageKorrekturNick = 0;
1078
    LageKorrekturNick = 0;
973
    LageKorrekturRoll = 0;
1079
    LageKorrekturRoll = 0;
Line 974... Line 1080...
974
  }
1080
  }
975
 
1081
 
-
 
1082
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1083
    //if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) // MartinR: so war es
976
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1084
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt 
977
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
1085
 
978
  {
1086
  {
979
   long tmp_long, tmp_long2;
1087
   long tmp_long, tmp_long2;
980
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
1088
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
Line 1029... Line 1137...
1029
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1137
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1030
 {
1138
 {
1031
  static int cnt = 0;
1139
  static int cnt = 0;
1032
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1140
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1033
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1141
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1034
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp)
1142
  //if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) // MartinR: so war es
-
 
1143
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt
-
 
1144
 
1035
  {
1145
  {
1036
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1146
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1037
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1147
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1038
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1148
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1039
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
1149
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
Line 1248... Line 1358...
1248
 
1358
 
1249
#define TRIM_MAX 200
1359
#define TRIM_MAX 200
1250
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
1360
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
Line -... Line 1361...
-
 
1361
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
-
 
1362
 
-
 
1363
        //MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1364
    //MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1365
       
-
 
1366
        if(!IntegralFaktor) // MartinR : hinzugefügt
-
 
1367
        {
-
 
1368
        MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN)  ; // MartinR : hinzugefügt
-
 
1369
        MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ;  // MartinR : hinzugefügt
-
 
1370
        }
1251
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
1371
        else // MartinR so war es
1252
 
1372
        {
-
 
1373
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
-
 
1374
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1253
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
1375
        }
Line 1254... Line 1376...
1254
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1376
       
1255
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1377
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1256
 
1378
 
Line 1341... Line 1463...
1341
                   }
1463
                   }
Line 1342... Line 1464...
1342
 
1464
 
1343
                // if height control is activated by an rc channel
1465
                // if height control is activated by an rc channel
1344
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1466
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1345
                {       // check if parameter is less than activation threshold
1467
                {       // check if parameter is less than activation threshold
-
 
1468
                        // 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
1469
                        if(Parameter_MaxHoehe < 50  || (Parameter_UserParam1 > 140) )   // MartinR: Schalter aus oder HH ohne Höhenregler über UsererParam1 an
1347
                        {   //height control not active
1470
                        {   //height control not active
1348
                                if(!delay--)
1471
                                if(!delay--)
1349
                                {
1472
                                {
1350
                                        HoehenReglerAktiv = 0; // disable height control
1473
                                        HoehenReglerAktiv = 0; // disable height control
Line 1359... Line 1482...
1359
                        }
1482
                        }
1360
                }
1483
                }
1361
                else // no switchable height control
1484
                else // no switchable height control
1362
                {
1485
                {
1363
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
1486
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
-
 
1487
                        // HoehenReglerAktiv = 1; // MartinR : so war es
-
 
1488
                        // MartinR : geändert Anfang
-
 
1489
                                if(Parameter_UserParam1 > 140) // HH über Schalter: HH an + Höhenregler abgeschaltet, Nachführen von Parametern 
-
 
1490
                                {
-
 
1491
                                        HoehenReglerAktiv = 0;
-
 
1492
                                }
-
 
1493
                                else  // Höhenregler mit Sollhöhe über Poti aktiv
-
 
1494
                                {
1364
                        HoehenReglerAktiv = 1;
1495
                                        HoehenReglerAktiv = 1;
-
 
1496
                                }
-
 
1497
                        // MartinR : geändert Ende
1365
                }
1498
                }
Line 1366... Line 1499...
1366
 
1499
 
1367
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1500
                // 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
1501
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
Line 1643... Line 1776...
1643
 
1776
 
1644
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1777
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1645
// Nick-Achse
1778
// Nick-Achse
1646
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1779
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1780
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
-
 
1781
        // MartinR : so war es Anfang
1647
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
1782
        /*
1648
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1783
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1649
    else  SummeNick += DiffNick; // I-Anteil bei HH
1784
    else  SummeNick += DiffNick; // I-Anteil bei HH
1650
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1785
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1651
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1786
    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
1787
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 + SummeNick / Ki; // PI-Regler für Nick
-
 
1788
    // Motor Vorn
-
 
1789
       
-
 
1790
        */
-
 
1791
        // MartinR : so war es Ende
-
 
1792
       
-
 
1793
        // MartinR : geändert Anfang
-
 
1794
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 ; // Zwischenergebnis um Code zu sparen
-
 
1795
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1796
         {
-
 
1797
          SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
-
 
1798
          if(SummeNick >  (STICK_GAIN * 8000L)) SummeNick =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1799
      if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1800
          //pd_ergebnis_nick = DiffNick + (SummeNick / Ki);
-
 
1801
          pd_ergebnis_nick += (SummeNick / Ki); // PI-Regler für Nick
-
 
1802
          SummeNickHH = 0 ;
-
 
1803
         }
-
 
1804
    else // MartinR : HH-Mode
-
 
1805
         {
-
 
1806
          SummeNickHH += DiffNick; // I-Anteil bei HH
-
 
1807
      if(SummeNickHH >  (STICK_GAIN * 8000L)) SummeNickHH =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1808
      if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1809
          pd_ergebnis_nick += SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH
-
 
1810
          SummeNick = 0;
-
 
1811
     } 
-
 
1812
        // MartinR : geändert Ende
-
 
1813
       
1653
    // Motor Vorn
1814
       
1654
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1815
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1655
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
1816
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
Line 1656... Line 1817...
1656
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1817
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1657
 
1818
 
1658
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1819
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1659
// Roll-Achse
1820
// Roll-Achse
-
 
1821
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1822
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1660
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1823
        // MartinR : so war es Anfang
1661
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1824
        /*
1662
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1825
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1663
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1826
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1664
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1827
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
-
 
1828
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
-
 
1829
    pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8 + SummeRoll / Ki;   // PI-Regler für Roll
-
 
1830
        */
-
 
1831
        // MartinR : so war es Ende
-
 
1832
       
-
 
1833
        // MartinR : geändert Anfang
-
 
1834
        pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8;
-
 
1835
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1836
         {
-
 
1837
         SummeRoll += IntegralRollMalFaktor - StickRoll;
-
 
1838
         if(SummeRoll >  (STICK_GAIN * 8000L)) SummeRoll =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1839
     if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1840
         //tmp_int = SummeRoll / Ki;
-
 
1841
         //pd_ergebnis_roll = DiffRoll + tmp_int;       // MartinR: PI-Regler im ACC-Mode
-
 
1842
         pd_ergebnis_roll += SummeRoll / Ki;    // PI-Regler für Roll
-
 
1843
         //SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH
-
 
1844
         // MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern!
-
 
1845
         SummeRollHH = 0;
-
 
1846
         }
-
 
1847
    else // MartinR : HH-Mode
-
 
1848
         {               
-
 
1849
          SummeRollHH += DiffRoll;  // I-Anteil bei HH
-
 
1850
      if(SummeRollHH >  (STICK_GAIN * 8000L)) SummeRollHH =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1851
      if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1852
          pd_ergebnis_roll += SummeRollHH / KiHH;       // MartinR: PI-Regler für Roll bei HH
-
 
1853
          SummeRoll = 0;
-
 
1854
         }
1665
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1855
        // MartinR : geändert Ende
1666
    pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8 + SummeRoll / Ki;   // PI-Regler für Roll
1856
       
1667
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1857
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
Line 1668... Line 1858...
1668
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
1858
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
Line 1690... Line 1880...
1690
                        if(Mixer.Motor[i][3] == 64) tmp_int += GierMischanteil;
1880
                        if(Mixer.Motor[i][3] == 64) tmp_int += GierMischanteil;
1691
                        else if(Mixer.Motor[i][3] == -64) tmp_int -= GierMischanteil;
1881
                        else if(Mixer.Motor[i][3] == -64) tmp_int -= GierMischanteil;
1692
                        else tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L;
1882
                        else tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L;
Line 1693... Line 1883...
1693
 
1883
 
1694
                        if(tmp_int > tmp_motorwert[i]) tmp_int = (tmp_motorwert[i] + tmp_int) / 2;      // MotorSmoothing
1884
                        if(tmp_int > tmp_motorwert[i]) tmp_int = (tmp_motorwert[i] + tmp_int) / 2;      // MotorSmoothing
-
 
1885
                        //else tmp_int = 2 * tmp_int - tmp_motorwert[i];                // MotorSmoothing  // MartinR: so war es
Line 1695... Line 1886...
1695
                        else tmp_int = 2 * tmp_int - tmp_motorwert[i];                                                              // MotorSmoothing
1886
                        //else tmp_int = tmp_int;               // MartinR: Entsprechend Vorschlag von MartinW geändert
1696
 
1887
 
1697
                        LIMIT_MIN_MAX(tmp_int,MIN_GAS * 4,MAX_GAS * 4);
1888
                        LIMIT_MIN_MAX(tmp_int,MIN_GAS * 4,MAX_GAS * 4);
1698
                        Motor[i].SetPoint = tmp_int / 4;
1889
                        Motor[i].SetPoint = tmp_int / 4;