Subversion Repositories FlightCtrl

Rev

Rev 1378 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1378 Rev 1476
Line 65... Line 65...
65
int TrimNick, TrimRoll;
65
int TrimNick, TrimRoll;
66
int AdNeutralGierBias;
66
int AdNeutralGierBias;
67
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
67
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
68
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
68
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
69
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
69
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
70
volatile float NeutralAccZ = 0;
70
//volatile float NeutralAccZ = 0; // MartinR  : so war es
-
 
71
volatile int NeutralAccZ = 0; // MartinR geändert
-
 
72
 
71
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0;
73
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0;
72
long IntegralNick = 0,IntegralNick2 = 0;
74
long IntegralNick = 0,IntegralNick2 = 0;
73
long IntegralRoll = 0,IntegralRoll2 = 0;
75
long IntegralRoll = 0,IntegralRoll2 = 0;
74
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0;
76
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0;
75
long Integral_Gier = 0;
77
long Integral_Gier = 0;
Line 100... Line 102...
100
long HoehenWert = 0;
102
long HoehenWert = 0;
101
long SollHoehe = 0;
103
long SollHoehe = 0;
102
int LageKorrekturRoll = 0,LageKorrekturNick = 0;
104
int LageKorrekturRoll = 0,LageKorrekturNick = 0;
103
//float Ki =  FAKTOR_I;
105
//float Ki =  FAKTOR_I;
104
int Ki = 10300 / 33;
106
int Ki = 10300 / 33;
-
 
107
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter
-
 
108
 
105
unsigned char Looping_Nick = 0,Looping_Roll = 0;
109
unsigned char Looping_Nick = 0,Looping_Roll = 0;
106
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
110
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
Line 107... Line 111...
107
 
111
 
108
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
112
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
Line 148... Line 152...
148
unsigned char Parameter_NaviWindCorrection;
152
unsigned char Parameter_NaviWindCorrection;
149
unsigned char Parameter_NaviSpeedCompensation;
153
unsigned char Parameter_NaviSpeedCompensation;
150
unsigned char Parameter_ExternalControl;
154
unsigned char Parameter_ExternalControl;
151
struct mk_param_struct EE_Parameter;
155
struct mk_param_struct EE_Parameter;
152
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
156
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
153
int MaxStickNick = 0,MaxStickRoll = 0;
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
-
 
159
 
154
unsigned int  modell_fliegt = 0;
160
unsigned int  modell_fliegt = 0;
155
volatile unsigned char MikroKopterFlags = 0;
161
volatile unsigned char MikroKopterFlags = 0;
156
long GIER_GRAD_FAKTOR = 1291;
162
long GIER_GRAD_FAKTOR = 1291;
157
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
163
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
158
unsigned char RequiredMotors = 4;
164
unsigned char RequiredMotors = 4;
Line 165... Line 171...
165
 
171
 
166
int MotorSmoothing(int neu, int alt)
172
int MotorSmoothing(int neu, int alt)
167
{
173
{
168
 int motor;
174
 int motor;
169
 if(neu > alt) motor = (1*(int)alt + neu) / 2;
175
 if(neu > alt) motor = (1*(int)alt + neu) / 2;
-
 
176
  //else   motor = neu - (alt - neu)*1; // MartinR: so war es
-
 
177
 else   motor = neu; // MartinR: Entsprechend Vorschlag von MartinW geändert
170
 else   motor = neu - (alt - neu)*1;
178
 
171
//if(Poti2 < 20)  return(neu);
179
//if(Poti2 < 20)  return(neu);
172
 return(motor);
180
 return(motor);
Line 173... Line 181...
173
}
181
}
Line 318... Line 326...
318
 
326
 
319
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
327
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
320
   Mess_Integral_Gier += MesswertGier;
328
   Mess_Integral_Gier += MesswertGier;
321
   ErsatzKompass += MesswertGier;
329
   ErsatzKompass += MesswertGier;
-
 
330
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
-
 
331
 
-
 
332
         if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0;  // MartinR: zusätzlich
322
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
333
         
-
 
334
      //if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))  // MartinR : so war es
323
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
335
          if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor"
324
         {
336
         {
325
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
337
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
326
            tmpl3 *= Parameter_AchsKopplung2; //65
338
            tmpl3 *= Parameter_AchsKopplung2; //65
327
            tmpl3 /= 4096L;
339
            tmpl3 /= 4096L;
Line 387... Line 399...
387
#define D_LIMIT 128
399
#define D_LIMIT 128
Line 388... Line 400...
388
 
400
 
389
   MesswertNick = HiResNick / 8;
401
   MesswertNick = HiResNick / 8;
Line -... Line 402...
-
 
402
   MesswertRoll = HiResRoll / 8;
-
 
403
 
-
 
404
        // MartinR : so war es Anfang  
390
   MesswertRoll = HiResRoll / 8;
405
        /*
391
 
406
 
392
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
407
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
393
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
408
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
394
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
409
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
395
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
410
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
Line -... Line 411...
-
 
411
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
-
 
412
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
-
 
413
 
-
 
414
   // MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000
-
 
415
        */
-
 
416
        // MartinR : so war es Ende
-
 
417
       
-
 
418
         // MartinR : Neu Anfang
-
 
419
        if(PlatinenVersion == 10)  
-
 
420
        {
-
 
421
        if(AdWertNick > 1010) MesswertNick = +600;  
-
 
422
        if(AdWertNick > 1017) MesswertNick = +800;
-
 
423
        if(AdWertNick < 15)   MesswertNick = -600;  
-
 
424
        if(AdWertNick <  7)   MesswertNick = -800;
-
 
425
        if(AdWertRoll > 1010) MesswertRoll = +600;  
-
 
426
        if(AdWertRoll > 1017) MesswertRoll = +800;
-
 
427
        if(AdWertRoll < 15)   MesswertRoll = -600;  
-
 
428
        if(AdWertRoll <  7)   MesswertRoll = -800;
-
 
429
        }
-
 
430
        else  
-
 
431
        {  
-
 
432
        if(AdWertNick > 2000) MesswertNick = +1200;  
-
 
433
        if(AdWertNick > 2015) MesswertNick = +1600;
-
 
434
        if(AdWertNick < 15)   MesswertNick = -1200;  
-
 
435
        if(AdWertNick <  7)   MesswertNick = -1600;
-
 
436
        if(AdWertRoll > 2000) MesswertRoll = +1200;  
-
 
437
        if(AdWertRoll > 2015) MesswertRoll = +1600;
-
 
438
        if(AdWertRoll < 15)   MesswertRoll = -1200;  
-
 
439
        if(AdWertRoll <  7)   MesswertRoll = -1600;
396
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
440
        }
397
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
441
 // MartinR : Neu Ende
398
 
442
 
399
  if(Parameter_Gyro_D)
443
  if(Parameter_Gyro_D)
400
  {
444
  {
Line 532... Line 576...
532
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255);
576
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255);
533
 CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255);
577
 CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255);
534
 CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255);
578
 CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255);
535
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255);
579
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255);
536
 Ki = 10300 / (Parameter_I_Faktor + 1);
580
 Ki = 10300 / (Parameter_I_Faktor + 1);
-
 
581
 
-
 
582
 if(Parameter_UserParam1 > 140) KiHH = 10300 / (Parameter_UserParam2 + 1); else  KiHH = Ki; // MartinR : für HH über Schalter
-
 
583
 Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen
-
 
584
 if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode 
-
 
585
  // 0 = free; 100 = AID; 200 = coming home //neu 
-
 
586
 
537
 MAX_GAS = EE_Parameter.Gas_Max;
587
 MAX_GAS = EE_Parameter.Gas_Max;
538
 MIN_GAS = EE_Parameter.Gas_Min;
588
 MIN_GAS = EE_Parameter.Gas_Min;
539
}
589
}
Line 545... Line 595...
545
//############################################################################
595
//############################################################################
546
{
596
{
547
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
597
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
548
         int GierMischanteil,GasMischanteil;
598
         int GierMischanteil,GasMischanteil;
549
     static long SummeNick=0,SummeRoll=0;
599
     static long SummeNick=0,SummeRoll=0;
-
 
600
         
-
 
601
         static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung
-
 
602
         
550
     static long sollGier = 0,tmp_long,tmp_long2;
603
     static long sollGier = 0,tmp_long,tmp_long2;
551
     static long IntegralFehlerNick = 0;
604
     static long IntegralFehlerNick = 0;
552
     static long IntegralFehlerRoll = 0;
605
     static long IntegralFehlerRoll = 0;
553
         static unsigned int RcLostTimer;
606
         static unsigned int RcLostTimer;
554
         static unsigned char delay_neutral = 0;
607
         static unsigned char delay_neutral = 0;
Line 733... Line 786...
733
 
786
 
734
 if(!NewPpmData-- || (MikroKopterFlags & FLAG_NOTLANDUNG))
787
 if(!NewPpmData-- || (MikroKopterFlags & FLAG_NOTLANDUNG))
735
  {
788
  {
736
        static int stick_nick,stick_roll;
789
        static int stick_nick,stick_roll;
-
 
790
    ParameterZuordnung();
-
 
791
       
-
 
792
        // MartinR: original:   
737
    ParameterZuordnung();
793
        /*
738
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
794
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
739
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
795
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
Line 740... Line 796...
740
    StickNick = stick_nick - (GPS_Nick + GPS_Nick2);
796
    StickNick = stick_nick - (GPS_Nick + GPS_Nick2);
741
 
797
 
742
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
798
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
799
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
800
    StickRoll = stick_roll - (GPS_Roll + GPS_Roll2);
-
 
801
        */
-
 
802
 
-
 
803
// MartinR: geändert Anfang
-
 
804
        if(Parameter_UserParam1 > 140)  // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist
-
 
805
                {
-
 
806
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4;
-
 
807
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ;
-
 
808
                //stick_nick = (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral);
-
 
809
                //stick_roll = (PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral);
-
 
810
                }
-
 
811
               
-
 
812
         else
-
 
813
                {
-
 
814
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
-
 
815
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
816
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
817
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
818
                }
-
 
819
       
-
 
820
         if(IntegralFaktor)  
-
 
821
                {
-
 
822
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
823
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
824
                stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
-
 
825
                stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
826
               
-
 
827
                StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
828
                StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
829
                }
-
 
830
        else            // wenn HH , MartinR
-
 
831
                {
-
 
832
                //stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
833
                //stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
834
                StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam
-
 
835
                StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam
-
 
836
                }
Line 743... Line 837...
743
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
837
               
744
    StickRoll = stick_roll - (GPS_Roll + GPS_Roll2);
838
// MartinR: geändert Ende
745
 
839
 
Line 755... Line 849...
755
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
849
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
Line 756... Line 850...
756
 
850
 
757
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
851
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
758
//+ Analoge Steuerung per Seriell
852
//+ Analoge Steuerung per Seriell
-
 
853
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
854
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen??
759
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
855
 
760
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
856
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
761
    {
857
    {
762
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
858
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
763
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
859
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
764
         StickGier += ExternControl.Gier;
860
         StickGier += ExternControl.Gier;
765
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
861
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
766
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
862
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
767
    }
863
    }
Line 768... Line 864...
768
    if(StickGas < 0) StickGas = 0;
864
    if(StickGas < 0) StickGas = 0;
-
 
865
 
-
 
866
    //if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0; // MartinR: Original
769
 
867
        if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0;  // MartinR
770
    if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
868
       
Line 771... Line 869...
771
    //if(GyroFaktor < 0) GyroFaktor = 0;
869
    //if(GyroFaktor < 0) GyroFaktor = 0;
772
    //if(IntegralFaktor < 0) IntegralFaktor = 0;
870
    //if(IntegralFaktor < 0) IntegralFaktor = 0;
Line 857... Line 955...
857
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
955
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
858
 MittelIntegralRoll  += IntegralRoll;
956
 MittelIntegralRoll  += IntegralRoll;
859
 MittelIntegralNick2 += IntegralNick2;
957
 MittelIntegralNick2 += IntegralNick2;
860
 MittelIntegralRoll2 += IntegralRoll2;
958
 MittelIntegralRoll2 += IntegralRoll2;
Line 861... Line 959...
861
 
959
 
-
 
960
 //if(Looping_Nick || Looping_Roll) // MartinR: so war es
862
 if(Looping_Nick || Looping_Roll)
961
 if(Looping_Nick || Looping_Roll || !IntegralFaktor)  // MartinR: "|| !IntegralFaktor" hinzugefügt
863
  {
962
  {
864
    IntegralAccNick = 0;
963
    IntegralAccNick = 0;
865
    IntegralAccRoll = 0;
964
    IntegralAccRoll = 0;
866
    MittelIntegralNick = 0;
965
    MittelIntegralNick = 0;
867
    MittelIntegralRoll = 0;
966
    MittelIntegralRoll = 0;
868
    MittelIntegralNick2 = 0;
967
    MittelIntegralNick2 = 0;
-
 
968
    MittelIntegralRoll2 = 0;
-
 
969
       
-
 
970
        IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
971
    IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 
-
 
972
    Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
973
    Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
974
    Mess_Integral_Gier = 0;     // MartinR: im HH-Modus alle unbenutzten Integratoren = 0       
-
 
975
    Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
869
    MittelIntegralRoll2 = 0;
976
       
870
    Mess_IntegralNick2 = Mess_IntegralNick;
977
    Mess_IntegralNick2 = Mess_IntegralNick;
871
    Mess_IntegralRoll2 = Mess_IntegralRoll;
978
    Mess_IntegralRoll2 = Mess_IntegralRoll;
872
    ZaehlMessungen = 0;
979
    ZaehlMessungen = 0;
873
    LageKorrekturNick = 0;
980
    LageKorrekturNick = 0;
874
    LageKorrekturRoll = 0;
981
    LageKorrekturRoll = 0;
Line 875... Line 982...
875
  }
982
  }
876
 
983
 
877
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
984
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
878
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
985
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt 
879
  {
986
  {
880
   long tmp_long, tmp_long2;
987
   long tmp_long, tmp_long2;
881
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
988
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
Line 931... Line 1038...
931
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1038
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
932
 {
1039
 {
933
  static int cnt = 0;
1040
  static int cnt = 0;
934
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1041
  static char last_n_p,last_n_n,last_r_p,last_r_n;
935
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1042
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
936
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp)
1043
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt
937
  {
1044
  {
938
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1045
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
939
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1046
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
940
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1047
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
941
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
1048
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
Line 1198... Line 1305...
1198
 
1305
 
1199
#define TRIM_MAX 200
1306
#define TRIM_MAX 200
1200
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
1307
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
Line -... Line 1308...
-
 
1308
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
-
 
1309
 
-
 
1310
    //MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1311
    //MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1312
       
-
 
1313
       
-
 
1314
        if(!IntegralFaktor) // MartinR : hinzugefügt
-
 
1315
        {
-
 
1316
        MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN)  ; // MartinR : hinzugefügt
-
 
1317
        MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ;  // MartinR : hinzugefügt
-
 
1318
        }
1201
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
1319
        else // MartinR so war es
1202
 
1320
        {
-
 
1321
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
-
 
1322
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
-
 
1323
        }
1203
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
1324
       
Line 1204... Line 1325...
1204
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1325
       
1205
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1326
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1206
 
1327
 
Line 1290... Line 1411...
1290
                   }
1411
                   }
Line 1291... Line 1412...
1291
 
1412
 
1292
                // if height control is activated by an rc channel
1413
                // if height control is activated by an rc channel
1293
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1414
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1294
                {       // check if parameter is less than activation threshold
1415
                {       // check if parameter is less than activation threshold
-
 
1416
                        //if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position // MartinR: so war es
1295
                        if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position
1417
                        if(Parameter_MaxHoehe < 50  || (Parameter_UserParam1 > 140) )   // MartinR: Schalter aus oder HH über UsererParam1 an
1296
                        {   //height control not active
1418
                        {   //height control not active
1297
                                if(!delay--)
1419
                                if(!delay--)
1298
                                {
1420
                                {
1299
                                        HoehenReglerAktiv = 0; // disable height control
1421
                                        HoehenReglerAktiv = 0; // disable height control
Line 1302... Line 1424...
1302
                                }
1424
                                }
1303
                        }
1425
                        }
1304
                        else
1426
                        else
1305
                        {       //height control is activated
1427
                        {       //height control is activated
1306
                                HoehenReglerAktiv = 1; // enable height control
1428
                                HoehenReglerAktiv = 1; // enable height control
1307
                                delay = 200;
1429
                                delay = 200;   
1308
                        }
1430
                        }
1309
                }
1431
                }
1310
                else // no switchable height control
1432
                else // no switchable height control
1311
                {
1433
                {
1312
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
1434
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
-
 
1435
                        // HoehenReglerAktiv = 1; // MartinR : so war es
-
 
1436
                        // MartinR : geändert Anfang
-
 
1437
                                if(Parameter_UserParam1 > 140) // HH über Schalter: Höhenregler abgeschaltet, Nachführen von Parametern 
-
 
1438
                                {
-
 
1439
                                        HoehenReglerAktiv = 0;
-
 
1440
                                }
-
 
1441
                                else  // Höhenregler mit Sollhöhe über Poti aktiv
-
 
1442
                                {
1313
                        HoehenReglerAktiv = 1;
1443
                                        HoehenReglerAktiv = 1;
-
 
1444
                                }
-
 
1445
                        // MartinR : geändert Ende
1314
                }
1446
                }
Line 1315... Line 1447...
1315
 
1447
 
1316
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1448
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1317
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
1449
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
Line 1552... Line 1684...
1552
 
1684
 
1553
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1685
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1554
// Nick-Achse
1686
// Nick-Achse
1555
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1687
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1688
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
-
 
1689
       
-
 
1690
        // MartinR : so war es Anfang
1556
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
1691
        /*
1557
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1692
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1558
    else  SummeNick += DiffNick; // I-Anteil bei HH
1693
    else  SummeNick += DiffNick; // I-Anteil bei HH
1559
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1694
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1560
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1695
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1561
    pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick
1696
    pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick
-
 
1697
        // Motor Vorn
-
 
1698
        */
-
 
1699
        // MartinR : so war es Ende
-
 
1700
       
-
 
1701
        // MartinR : geändert Anfang
-
 
1702
       
-
 
1703
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1704
         {
-
 
1705
          SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
-
 
1706
          if(SummeNick >  (STICK_GAIN * 8000L)) SummeNick =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1707
      if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1708
          pd_ergebnis_nick = DiffNick + (SummeNick / Ki);
-
 
1709
          SummeNickHH = 0 ;
-
 
1710
         }
-
 
1711
    else // MartinR : HH-Mode
-
 
1712
         {
-
 
1713
          SummeNickHH += DiffNick; // I-Anteil bei HH
-
 
1714
      if(SummeNickHH >  (STICK_GAIN * 8000L)) SummeNickHH =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1715
      if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1716
          pd_ergebnis_nick = DiffNick + SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH
-
 
1717
          SummeNick = 0;
-
 
1718
     } 
-
 
1719
       
-
 
1720
        // MartinR : geändert Ende
1562
    // Motor Vorn
1721
       
1563
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1722
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1564
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
1723
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
Line 1565... Line 1724...
1565
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1724
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1566
 
1725
 
1567
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1726
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1568
// Roll-Achse
1727
// Roll-Achse
-
 
1728
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1729
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
-
 
1730
       
1569
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1731
        // MartinR : so war es Anfang
1570
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1732
        /*
1571
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1733
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1572
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1734
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1573
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1735
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
-
 
1736
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
-
 
1737
    pd_ergebnis_roll = DiffRoll + SummeRoll / Ki;       // PI-Regler für Roll
-
 
1738
        */
-
 
1739
        // MartinR : so war es Ende
-
 
1740
       
-
 
1741
        // MartinR : geändert Anfang
-
 
1742
       
-
 
1743
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1744
         {
-
 
1745
         SummeRoll += IntegralRollMalFaktor - StickRoll;
-
 
1746
         if(SummeRoll >  (STICK_GAIN * 8000L)) SummeRoll =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1747
     if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1748
         tmp_int = SummeRoll / Ki;
-
 
1749
         pd_ergebnis_roll = DiffRoll + tmp_int;         // MartinR: PI-Regler im ACC-Mode
-
 
1750
         //SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH
-
 
1751
         // MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern!
-
 
1752
         SummeRollHH = 0;
-
 
1753
         }
-
 
1754
    else // MartinR : HH-Mode
-
 
1755
         {               
-
 
1756
          SummeRollHH += DiffRoll;  // I-Anteil bei HH
-
 
1757
      if(SummeRollHH >  (STICK_GAIN * 8000L)) SummeRollHH =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1758
      if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1759
          pd_ergebnis_roll = DiffRoll + SummeRollHH / KiHH;     // MartinR: PI-Regler für Roll bei HH
-
 
1760
          SummeRoll = 0;
-
 
1761
         }
-
 
1762
       
1574
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1763
        // MartinR : geändert Ende
1575
    pd_ergebnis_roll = DiffRoll + SummeRoll / Ki;       // PI-Regler für Roll
1764
       
1576
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1765
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
Line 1577... Line 1766...
1577
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
1766
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;