Subversion Repositories FlightCtrl

Rev

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

Rev 1596 Rev 1604
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 101... Line 103...
101
long HoehenWert = 0;
103
long HoehenWert = 0;
102
long SollHoehe = 0;
104
long SollHoehe = 0;
103
int LageKorrekturRoll = 0,LageKorrekturNick = 0;
105
int LageKorrekturRoll = 0,LageKorrekturNick = 0;
104
//float Ki =  FAKTOR_I;
106
//float Ki =  FAKTOR_I;
105
int Ki = 10300 / 33;
107
int Ki = 10300 / 33;
-
 
108
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter
-
 
109
 
106
unsigned char Looping_Nick = 0,Looping_Roll = 0;
110
unsigned char Looping_Nick = 0,Looping_Roll = 0;
107
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
111
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
Line 108... Line 112...
108
 
112
 
109
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
113
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
Line 150... Line 154...
150
unsigned char Parameter_NaviSpeedCompensation;
154
unsigned char Parameter_NaviSpeedCompensation;
151
unsigned char Parameter_ExternalControl;
155
unsigned char Parameter_ExternalControl;
152
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
156
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
153
struct mk_param_struct EE_Parameter;
157
struct mk_param_struct EE_Parameter;
154
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
158
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
155
int MaxStickNick = 0,MaxStickRoll = 0;
159
//int MaxStickNick = 0,MaxStickRoll = 0;MartinR: so war es
-
 
160
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0;  // MartinR: stick_.._neutral hinzugefügt
-
 
161
 
156
unsigned int  modell_fliegt = 0;
162
unsigned int  modell_fliegt = 0;
157
volatile unsigned char FCFlags = 0;
163
volatile unsigned char FCFlags = 0;
158
long GIER_GRAD_FAKTOR = 1291;
164
long GIER_GRAD_FAKTOR = 1291;
159
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
165
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
160
signed int tmp_motorwert[MAX_MOTORS];
166
signed int tmp_motorwert[MAX_MOTORS];
161
char VarioCharacter = ' ';
167
char VarioCharacter = ' ';
162
 
-
 
163
#define LIMIT_MIN(value, min) {if(value <= min) value = min;}
168
#define LIMIT_MIN(value, min) {if(value <= min) value = min;}
164
#define LIMIT_MAX(value, max) {if(value >= max) value = max;}
169
#define LIMIT_MAX(value, max) {if(value >= max) value = max;}
165
#define LIMIT_MIN_MAX(value, min, max) {if(value <= min) value = min; else if(value >= max) value = max;}
170
#define LIMIT_MIN_MAX(value, min, max) {if(value <= min) value = min; else if(value >= max) value = max;}
Line 166... Line 171...
166
 
171
 
167
int MotorSmoothing(int neu, int alt)
172
int MotorSmoothing(int neu, int alt)
168
{
173
{
169
 int motor;
174
 int motor;
170
 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
171
 else   motor = neu - (alt - neu)*1;
178
 
172
//if(Poti2 < 20)  return(neu);
179
//if(Poti2 < 20)  return(neu);
173
 return(motor);
180
 return(motor);
Line 174... Line 181...
174
}
181
}
Line 319... Line 326...
319
        else winkel_nick = Mess_IntegralNick;
326
        else winkel_nick = Mess_IntegralNick;
Line 320... Line 327...
320
 
327
 
321
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
328
// Gier  ++++++++++++++++++++++++++++++++++++++++++++++++
322
   Mess_Integral_Gier += MesswertGier;
329
   Mess_Integral_Gier += MesswertGier;
323
   ErsatzKompass += MesswertGier;
330
   ErsatzKompass += MesswertGier;
-
 
331
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++  
-
 
332
          if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0;  // MartinR: zusätzlich
324
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
333
         
-
 
334
      //if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))  // MartinR : so war es
-
 
335
          if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor"
325
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
336
         
326
         {
337
         {
327
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
338
            tmpl3 = (MesswertRoll * winkel_nick) / 2048L;
328
            tmpl3 *= Parameter_AchsKopplung2; //65
339
            tmpl3 *= Parameter_AchsKopplung2; //65
329
            tmpl3 /= 4096L;
340
            tmpl3 /= 4096L;
Line 389... Line 400...
389
#define D_LIMIT 128
400
#define D_LIMIT 128
Line 390... Line 401...
390
 
401
 
391
   MesswertNick = HiResNick / 8;
402
   MesswertNick = HiResNick / 8;
Line -... Line 403...
-
 
403
   MesswertRoll = HiResRoll / 8;
-
 
404
 
-
 
405
        // MartinR : so war es Anfang  
392
   MesswertRoll = HiResRoll / 8;
406
        /*
393
 
407
       
394
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
408
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
395
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
409
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
396
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
410
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
397
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
411
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
-
 
412
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
-
 
413
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
-
 
414
     
-
 
415
   // MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000
-
 
416
        */
-
 
417
        // MartinR : so war es Ende
-
 
418
       
-
 
419
         // MartinR : Neu Anfang
-
 
420
        if(PlatinenVersion == 10)  
-
 
421
        {
-
 
422
        if(AdWertNick > 1010) MesswertNick = +600;  
-
 
423
        if(AdWertNick > 1017) MesswertNick = +800;
-
 
424
        if(AdWertNick < 15)   MesswertNick = -600;  
-
 
425
        if(AdWertNick <  7)   MesswertNick = -800;
-
 
426
        if(AdWertRoll > 1010) MesswertRoll = +600;  
-
 
427
        if(AdWertRoll > 1017) MesswertRoll = +800;
-
 
428
        if(AdWertRoll < 15)   MesswertRoll = -600;  
-
 
429
        if(AdWertRoll <  7)   MesswertRoll = -800;
-
 
430
        }
-
 
431
        else  
-
 
432
        {  
-
 
433
        if(AdWertNick > 2000) MesswertNick = +1200;  
-
 
434
        if(AdWertNick > 2015) MesswertNick = +1600;
-
 
435
        if(AdWertNick < 15)   MesswertNick = -1200;  
-
 
436
        if(AdWertNick <  7)   MesswertNick = -1600;
-
 
437
        if(AdWertRoll > 2000) MesswertRoll = +1200;  
-
 
438
        if(AdWertRoll > 2015) MesswertRoll = +1600;
-
 
439
        if(AdWertRoll < 15)   MesswertRoll = -1200;  
-
 
440
        if(AdWertRoll <  7)   MesswertRoll = -1600;
Line 398... Line 441...
398
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
441
        }
399
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
442
 // MartinR : Neu Ende
400
 
443
 
401
  if(Parameter_Gyro_D)
444
  if(Parameter_Gyro_D)
Line 541... Line 584...
541
 CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection);
584
 CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection);
542
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
585
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
543
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
586
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
544
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
587
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
545
 Ki = 10300 / (Parameter_I_Faktor + 1);
588
 Ki = 10300 / (Parameter_I_Faktor + 1);
-
 
589
 
-
 
590
 if(Parameter_UserParam1 > 140) KiHH = 10300 / (Parameter_UserParam2 + 1); else  KiHH = Ki; // MartinR : für HH über Schalter
-
 
591
 Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen
-
 
592
 if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode 
-
 
593
  // 0 = free; 100 = AID; 200 = coming home //neu 
-
 
594
 
546
 MAX_GAS = EE_Parameter.Gas_Max;
595
 MAX_GAS = EE_Parameter.Gas_Max;
547
 MIN_GAS = EE_Parameter.Gas_Min;
596
 MIN_GAS = EE_Parameter.Gas_Min;
548
}
597
}
Line 549... Line 598...
549
 
598
 
Line 553... Line 602...
553
//############################################################################
602
//############################################################################
554
{
603
{
555
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
604
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
556
         int GierMischanteil,GasMischanteil;
605
         int GierMischanteil,GasMischanteil;
557
     static long SummeNick=0,SummeRoll=0;
606
     static long SummeNick=0,SummeRoll=0;
-
 
607
         
-
 
608
         static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung
-
 
609
         
558
     static long sollGier = 0,tmp_long,tmp_long2;
610
     static long sollGier = 0,tmp_long,tmp_long2;
559
     static long IntegralFehlerNick = 0;
611
     static long IntegralFehlerNick = 0;
560
     static long IntegralFehlerRoll = 0;
612
     static long IntegralFehlerRoll = 0;
561
         static unsigned int RcLostTimer;
613
         static unsigned int RcLostTimer;
562
         static unsigned char delay_neutral = 0;
614
         static unsigned char delay_neutral = 0;
Line 747... Line 799...
747
 
799
 
748
 if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG))
800
 if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG))
749
  {
801
  {
750
        static int stick_nick,stick_roll;
802
        static int stick_nick,stick_roll;
-
 
803
    ParameterZuordnung();
-
 
804
               
-
 
805
        // MartinR: original:   
751
    ParameterZuordnung();
806
        /*
752
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
807
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
753
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
808
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
Line 754... Line 809...
754
    StickNick = stick_nick - (GPS_Nick + GPS_Nick2);
809
    StickNick = stick_nick - (GPS_Nick + GPS_Nick2);
755
 
810
 
756
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
811
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
812
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
813
    StickRoll = stick_roll - (GPS_Roll + GPS_Roll2);
-
 
814
                */
-
 
815
// MartinR: geändert Anfang
-
 
816
        if(Parameter_UserParam1 > 140)  // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist
-
 
817
                {
-
 
818
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4;
-
 
819
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ;
-
 
820
                //stick_nick = (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral);
-
 
821
                //stick_roll = (PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral);
-
 
822
                }
-
 
823
               
-
 
824
         else
-
 
825
                {
-
 
826
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
-
 
827
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
828
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
829
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
830
                }
-
 
831
       
-
 
832
         if(IntegralFaktor)  
-
 
833
                {
-
 
834
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
835
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
836
                stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
-
 
837
                stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
838
               
-
 
839
                StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
840
                StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
841
                }
-
 
842
        else            // wenn HH , MartinR
-
 
843
                {
-
 
844
                //stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
845
                //stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
846
                StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam
-
 
847
                StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam
-
 
848
                }
Line 757... Line 849...
757
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
849
               
758
    StickRoll = stick_roll - (GPS_Roll + GPS_Roll2);
850
// MartinR: geändert Ende
759
 
851
 
Line 769... Line 861...
769
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
861
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
Line 770... Line 862...
770
 
862
 
771
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
863
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
772
//+ Analoge Steuerung per Seriell
864
//+ Analoge Steuerung per Seriell
-
 
865
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
866
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen??
773
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
867
 
774
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
868
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
775
    {
869
    {
776
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
870
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
777
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
871
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
778
         StickGier += ExternControl.Gier;
872
         StickGier += ExternControl.Gier;
779
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
873
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
780
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
874
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
781
    }
875
    }
Line 782... Line 876...
782
    if(StickGas < 0) StickGas = 0;
876
    if(StickGas < 0) StickGas = 0;
-
 
877
 
-
 
878
        //if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0; // MartinR: so war es
783
 
879
        if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0;  // MartinR geändert
784
    if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
880
       
Line 785... Line 881...
785
    //if(GyroFaktor < 0) GyroFaktor = 0;
881
    //if(GyroFaktor < 0) GyroFaktor = 0;
786
    //if(IntegralFaktor < 0) IntegralFaktor = 0;
882
    //if(IntegralFaktor < 0) IntegralFaktor = 0;
Line 871... Line 967...
871
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
967
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
872
 MittelIntegralRoll  += IntegralRoll;
968
 MittelIntegralRoll  += IntegralRoll;
873
 MittelIntegralNick2 += IntegralNick2;
969
 MittelIntegralNick2 += IntegralNick2;
874
 MittelIntegralRoll2 += IntegralRoll2;
970
 MittelIntegralRoll2 += IntegralRoll2;
Line 875... Line 971...
875
 
971
 
-
 
972
 //if(Looping_Nick || Looping_Roll) // MartinR: so war es
-
 
973
 if(Looping_Nick || Looping_Roll || !IntegralFaktor)  // MartinR: "|| !IntegralFaktor" hinzugefügt
876
 if(Looping_Nick || Looping_Roll)
974
 
877
  {
975
  {
878
    IntegralAccNick = 0;
976
    IntegralAccNick = 0;
879
    IntegralAccRoll = 0;
977
    IntegralAccRoll = 0;
880
    MittelIntegralNick = 0;
978
    MittelIntegralNick = 0;
881
    MittelIntegralRoll = 0;
979
    MittelIntegralRoll = 0;
882
    MittelIntegralNick2 = 0;
980
    MittelIntegralNick2 = 0;
-
 
981
    MittelIntegralRoll2 = 0;
-
 
982
               
-
 
983
        IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
984
    IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 
-
 
985
    Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
986
    Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
987
    Mess_Integral_Gier = 0;     // MartinR: im HH-Modus alle unbenutzten Integratoren = 0       
-
 
988
    Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
883
    MittelIntegralRoll2 = 0;
989
       
884
    Mess_IntegralNick2 = Mess_IntegralNick;
990
    Mess_IntegralNick2 = Mess_IntegralNick;
885
    Mess_IntegralRoll2 = Mess_IntegralRoll;
991
    Mess_IntegralRoll2 = Mess_IntegralRoll;
886
    ZaehlMessungen = 0;
992
    ZaehlMessungen = 0;
887
    LageKorrekturNick = 0;
993
    LageKorrekturNick = 0;
888
    LageKorrekturRoll = 0;
994
    LageKorrekturRoll = 0;
Line 889... Line 995...
889
  }
995
  }
890
 
996
 
-
 
997
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
998
  //if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) // MartinR: so war es
891
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
999
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt 
892
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
1000
 
893
  {
1001
  {
894
   long tmp_long, tmp_long2;
1002
   long tmp_long, tmp_long2;
895
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
1003
   if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/)
Line 945... Line 1053...
945
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1053
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
946
 {
1054
 {
947
  static int cnt = 0;
1055
  static int cnt = 0;
948
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1056
  static char last_n_p,last_n_n,last_r_p,last_r_n;
949
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1057
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
950
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp)
1058
  //if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) // MartinR: so war es
-
 
1059
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt
-
 
1060
       
951
  {
1061
  {
952
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1062
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
953
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1063
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
954
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1064
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
955
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
1065
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
Line 1214... Line 1324...
1214
 
1324
 
1215
#define TRIM_MAX 200
1325
#define TRIM_MAX 200
1216
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
1326
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
Line -... Line 1327...
-
 
1327
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
-
 
1328
 
-
 
1329
    //MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1330
    //MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1331
       
-
 
1332
        if(!IntegralFaktor) // MartinR : hinzugefügt
-
 
1333
        {
-
 
1334
        MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN)  ; // MartinR : hinzugefügt
-
 
1335
        MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ;  // MartinR : hinzugefügt
-
 
1336
        }
1217
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
1337
        else // MartinR so war es
1218
 
1338
        {
-
 
1339
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
-
 
1340
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1219
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
1341
        }
Line 1220... Line 1342...
1220
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1342
       
1221
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1343
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1222
 
1344
 
Line 1304... Line 1426...
1304
                   }
1426
                   }
Line 1305... Line 1427...
1305
 
1427
 
1306
                // if height control is activated by an rc channel
1428
                // if height control is activated by an rc channel
1307
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1429
        if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1308
                {       // check if parameter is less than activation threshold
1430
                {       // check if parameter is less than activation threshold
-
 
1431
                        //if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position // MartinR: so war es
-
 
1432
                        if(Parameter_MaxHoehe < 50  || (Parameter_UserParam1 > 140) )   // MartinR: Schalter aus oder HH über UsererParam1 an
1309
                        if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position
1433
                       
1310
                        {   //height control not active
1434
                        {   //height control not active
1311
                                if(!delay--)
1435
                                if(!delay--)
1312
                                {
1436
                                {
1313
                                        HoehenReglerAktiv = 0; // disable height control
1437
                                        HoehenReglerAktiv = 0; // disable height control
Line 1322... Line 1446...
1322
                        }
1446
                        }
1323
                }
1447
                }
1324
                else // no switchable height control
1448
                else // no switchable height control
1325
                {
1449
                {
1326
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
1450
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung;
-
 
1451
                        // HoehenReglerAktiv = 1; // MartinR : so war es
-
 
1452
                        // MartinR : geändert Anfang
-
 
1453
                                if(Parameter_UserParam1 > 140) // HH über Schalter: Höhenregler abgeschaltet, Nachführen von Parametern 
-
 
1454
                                {
-
 
1455
                                        HoehenReglerAktiv = 0;
-
 
1456
                                }
-
 
1457
                                else  // Höhenregler mit Sollhöhe über Poti aktiv
-
 
1458
                                {
1327
                        HoehenReglerAktiv = 1;
1459
                                        HoehenReglerAktiv = 1;
-
 
1460
                                }
-
 
1461
                        // MartinR : geändert Ende
1328
                }
1462
                }
Line 1329... Line 1463...
1329
 
1463
 
1330
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1464
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1331
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
1465
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
Line 1578... Line 1712...
1578
    if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil));
1712
    if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil));
Line 1579... Line 1713...
1579
 
1713
 
1580
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1714
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1581
// Nick-Achse
1715
// Nick-Achse
1582
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1716
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1717
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen  
-
 
1718
        // MartinR : so war es Anfang
1583
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
1719
        /*
1584
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1720
    if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
1585
    else  SummeNick += DiffNick; // I-Anteil bei HH
1721
    else  SummeNick += DiffNick; // I-Anteil bei HH
1586
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1722
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1587
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1723
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1588
    pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick
1724
    pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick
-
 
1725
    // Motor Vorn
-
 
1726
                */
-
 
1727
        // MartinR : so war es Ende
-
 
1728
       
-
 
1729
        // MartinR : geändert Anfang    
-
 
1730
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1731
         {
-
 
1732
          SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
-
 
1733
          if(SummeNick >  (STICK_GAIN * 8000L)) SummeNick =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1734
      if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1735
          pd_ergebnis_nick = DiffNick + (SummeNick / Ki);
-
 
1736
          SummeNickHH = 0 ;
-
 
1737
         }
-
 
1738
    else // MartinR : HH-Mode
-
 
1739
         {
-
 
1740
          SummeNickHH += DiffNick; // I-Anteil bei HH
-
 
1741
      if(SummeNickHH >  (STICK_GAIN * 8000L)) SummeNickHH =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1742
      if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1743
          pd_ergebnis_nick = DiffNick + SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH
-
 
1744
          SummeNick = 0;
-
 
1745
     } 
-
 
1746
        // MartinR : geändert Ende
1589
    // Motor Vorn
1747
       
1590
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1748
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1591
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
1749
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
Line 1592... Line 1750...
1592
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1750
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
1593
 
1751
 
1594
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1752
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1595
// Roll-Achse
1753
// Roll-Achse
-
 
1754
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1755
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen  
1596
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1756
        // MartinR : so war es Anfang
1597
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1757
        /*
1598
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1758
    if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung
1599
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1759
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1600
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1760
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
-
 
1761
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
-
 
1762
    pd_ergebnis_roll = DiffRoll + SummeRoll / Ki;       // PI-Regler für Roll
-
 
1763
                */
-
 
1764
        // MartinR : so war es Ende
-
 
1765
       
-
 
1766
        // MartinR : geändert Anfang
-
 
1767
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1768
         {
-
 
1769
         SummeRoll += IntegralRollMalFaktor - StickRoll;
-
 
1770
         if(SummeRoll >  (STICK_GAIN * 8000L)) SummeRoll =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1771
     if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1772
         tmp_int = SummeRoll / Ki;
-
 
1773
         pd_ergebnis_roll = DiffRoll + tmp_int;         // MartinR: PI-Regler im ACC-Mode
-
 
1774
         //SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH
-
 
1775
         // MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern!
-
 
1776
         SummeRollHH = 0;
-
 
1777
         }
-
 
1778
    else // MartinR : HH-Mode
-
 
1779
         {               
-
 
1780
          SummeRollHH += DiffRoll;  // I-Anteil bei HH
-
 
1781
      if(SummeRollHH >  (STICK_GAIN * 8000L)) SummeRollHH =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1782
      if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1783
          pd_ergebnis_roll = DiffRoll + SummeRollHH / KiHH;     // MartinR: PI-Regler für Roll bei HH
-
 
1784
          SummeRoll = 0;
-
 
1785
         }
1601
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1786
        // MartinR : geändert Ende
1602
    pd_ergebnis_roll = DiffRoll + SummeRoll / Ki;       // PI-Regler für Roll
1787
       
1603
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1788
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
Line 1604... Line 1789...
1604
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
1789
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;