Subversion Repositories FlightCtrl

Rev

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

Rev 1984 Rev 2013
Line 108... Line 108...
108
signed char WaypointTrimming = 0;
108
signed char WaypointTrimming = 0;
109
int CompassGierSetpoint = 0;
109
int CompassGierSetpoint = 0;
110
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
110
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0;
111
//float Ki =  FAKTOR_I;
111
//float Ki =  FAKTOR_I;
112
int Ki = 10300 / 33;
112
int Ki = 10300 / 33;
-
 
113
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter
-
 
114
 
113
unsigned char Looping_Nick = 0,Looping_Roll = 0;
115
unsigned char Looping_Nick = 0,Looping_Roll = 0;
114
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
116
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
Line 115... Line 117...
115
 
117
 
116
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
118
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
Line 159... Line 161...
159
unsigned char Parameter_GlobalConfig;
161
unsigned char Parameter_GlobalConfig;
160
unsigned char Parameter_ExtraConfig;
162
unsigned char Parameter_ExtraConfig;
161
unsigned char Parameter_MaximumAltitude;
163
unsigned char Parameter_MaximumAltitude;
162
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
164
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5;
163
unsigned char CareFree = 0;
165
unsigned char CareFree = 0;
164
const 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}; // 15° steps
166
//const 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}; // 15° steps // MartinR: so war es
-
 
167
const signed char sintab[62] = { 0, 2, 4, 6, 8, 10, 11, 13, 14, 15, 15, 16, 16, 16, 15, 14, 13, 11, 10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10, -11, -13, -14, -15, -15, -16, -16, -16, -15, -15, -14, -13, -11, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 11, 13, 14, 15, 15, 16, 16, 16}; // 7,5° steps //MartinR
-
 
168
signed char cosinus, sinus; // MartinR : extern für PAN-Funktion
Line 165... Line 169...
165
 
169
 
166
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
170
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
-
 
171
//int MaxStickNick = 0,MaxStickRoll = 0; MartinR: so war es
-
 
172
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0;  // MartinR: stick_.._neutral hinzugefügt
167
int MaxStickNick = 0,MaxStickRoll = 0;
173
 
168
unsigned int  modell_fliegt = 0;
174
unsigned int  modell_fliegt = 0;
169
volatile unsigned char FC_StatusFlags = 0, FC_StatusFlags2 = 0;
175
volatile unsigned char FC_StatusFlags = 0, FC_StatusFlags2 = 0;
170
long GIER_GRAD_FAKTOR = 1291;
176
long GIER_GRAD_FAKTOR = 1291;
171
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
177
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
Line 195... Line 201...
195
    DebugOut.Analog[11] = ErsatzKompassInGrad;
201
    DebugOut.Analog[11] = ErsatzKompassInGrad;
196
    DebugOut.Analog[12] = Motor[0].SetPoint;
202
    DebugOut.Analog[12] = Motor[0].SetPoint;
197
    DebugOut.Analog[13] = Motor[1].SetPoint;
203
    DebugOut.Analog[13] = Motor[1].SetPoint;
198
    DebugOut.Analog[14] = Motor[2].SetPoint;
204
    DebugOut.Analog[14] = Motor[2].SetPoint;
199
    DebugOut.Analog[15] = Motor[3].SetPoint;
205
    DebugOut.Analog[15] = Motor[3].SetPoint;
-
 
206
       
-
 
207
        DebugOut.Analog[16] = cosinus;  // MartinR: test
-
 
208
        DebugOut.Analog[17] = sinus;  // MartinR: test
-
 
209
        DebugOut.Analog[18] = ServoPanValue;  // MartinR: test
-
 
210
        DebugOut.Analog[19] = ServoRollValue;  // MartinR: test
200
    DebugOut.Analog[20] = ServoNickValue;
211
    DebugOut.Analog[20] = ServoNickValue;
201
    DebugOut.Analog[22] = Capacity.ActualCurrent;
212
    DebugOut.Analog[22] = Capacity.ActualCurrent;
202
    DebugOut.Analog[23] = Capacity.UsedCapacity;
213
    DebugOut.Analog[23] = Capacity.UsedCapacity;
203
        DebugOut.Analog[24] = SollHoehe/5;     
214
        DebugOut.Analog[24] = SollHoehe/5;     
204
//    DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ;
215
//    DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ;
Line 384... Line 395...
384
{
395
{
385
    static signed long tmpl,tmpl2,tmpl3,tmpl4;
396
    static signed long tmpl,tmpl2,tmpl3,tmpl4;
386
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
397
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
387
        signed long winkel_nick, winkel_roll;
398
        signed long winkel_nick, winkel_roll;
388
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
399
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
389
    MesswertNick = (signed int) AdWertNickFilter / 8;
400
    //MesswertNick = (signed int) AdWertNickFilter / 8; // MartinR: so war es
390
    MesswertRoll = (signed int) AdWertRollFilter / 8;
401
    //MesswertRoll = (signed int) AdWertRollFilter / 8; // MartinR: so war es
-
 
402
        MesswertNick = (signed int) AdWertNickFilter  ; // MartinR die Division /8 erfolgt bereits in der analog.c
-
 
403
    MesswertRoll = (signed int) AdWertRollFilter ; // MartinR die Division /8 erfolgt bereits in der analog.c
391
    RohMesswertNick = MesswertNick;
404
    RohMesswertNick = MesswertNick;
392
    RohMesswertRoll = MesswertRoll;
405
    RohMesswertRoll = MesswertRoll;
Line 393... Line 406...
393
 
406
 
394
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
407
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
Line 428... Line 441...
428
            tmpl4 *= Parameter_AchsKopplung2; //65
441
            tmpl4 *= Parameter_AchsKopplung2; //65
429
            tmpl4 /= 4096L;
442
            tmpl4 /= 4096L;
430
            KopplungsteilNickRoll = tmpl3;
443
            KopplungsteilNickRoll = tmpl3;
431
            KopplungsteilRollNick = tmpl4;
444
            KopplungsteilRollNick = tmpl4;
432
            tmpl4 -= tmpl3;
445
            tmpl4 -= tmpl3;
-
 
446
                        if(IntegralFaktor) // MartinR: nur im ACC-Mode
-
 
447
                        {
433
            ErsatzKompass += tmpl4;
448
            ErsatzKompass += tmpl4;
434
            if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen
449
            if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen
435
 
450
                        }
436
            tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L;
451
            tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L;
437
            tmpl *= Parameter_AchsKopplung1;  // 90
452
            tmpl *= Parameter_AchsKopplung1;  // 90
438
            tmpl /= 4096L;
453
            tmpl /= 4096L;
439
            tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L;
454
            tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L;
440
            tmpl2 *= Parameter_AchsKopplung1;
455
            tmpl2 *= Parameter_AchsKopplung1;
Line 479... Line 494...
479
    IntegralNick = Mess_IntegralNick;
494
    IntegralNick = Mess_IntegralNick;
480
    IntegralRoll = Mess_IntegralRoll;
495
    IntegralRoll = Mess_IntegralRoll;
481
    IntegralNick2 = Mess_IntegralNick2;
496
    IntegralNick2 = Mess_IntegralNick2;
482
    IntegralRoll2 = Mess_IntegralRoll2;
497
    IntegralRoll2 = Mess_IntegralRoll2;
Line -... Line 498...
-
 
498
 
483
 
499
//#define D_LIMIT 128 // MartinR: so war es
-
 
500
#define D_LIMIT 16
484
#define D_LIMIT 128
501
// MartinR: Änderung war notwendig, da die Division /8 bereits in der analog.c erfolgt
485
 
502
 
486
   MesswertNick = HiResNick / 8;
503
   //MesswertNick = HiResNick / 8; // MartinR : so war es
-
 
504
  // MesswertRoll = HiResRoll / 8; // MartinR : so war es
-
 
505
   MesswertNick = HiResNick ; // MartinR die Division /8 erfolgt bereits in der analog.c
Line -... Line 506...
-
 
506
   MesswertRoll = HiResRoll ; // MartinR die Division /8 erfolgt bereits in der analog.c
-
 
507
 
-
 
508
        // MartinR : so war es Anfang  
487
   MesswertRoll = HiResRoll / 8;
509
        /*
488
 
510
       
489
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
511
   if(AdWertNick < 15)   MesswertNick = -1000;  if(AdWertNick <  7)   MesswertNick = -2000;
490
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
512
   if(PlatinenVersion == 10)  { if(AdWertNick > 1010) MesswertNick = +1000;  if(AdWertNick > 1017) MesswertNick = +2000; }
491
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
513
   else  {  if(AdWertNick > 2000) MesswertNick = +1000;  if(AdWertNick > 2015) MesswertNick = +2000; }
492
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
514
   if(AdWertRoll < 15)   MesswertRoll = -1000;  if(AdWertRoll <  7)   MesswertRoll = -2000;
-
 
515
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
-
 
516
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
-
 
517
         
-
 
518
   // MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000
-
 
519
        */
-
 
520
        // MartinR : so war es Ende
-
 
521
       
-
 
522
         // MartinR : Neu Anfang
-
 
523
        if(PlatinenVersion == 10)  
-
 
524
        {
-
 
525
        if(AdWertNick > 1010) MesswertNick = +600;  
-
 
526
        if(AdWertNick > 1017) MesswertNick = +800;
-
 
527
        if(AdWertNick < 15)   MesswertNick = -600;  
-
 
528
        if(AdWertNick <  7)   MesswertNick = -800;
-
 
529
        if(AdWertRoll > 1010) MesswertRoll = +600;  
-
 
530
        if(AdWertRoll > 1017) MesswertRoll = +800;
-
 
531
        if(AdWertRoll < 15)   MesswertRoll = -600;  
-
 
532
        if(AdWertRoll <  7)   MesswertRoll = -800;
-
 
533
        }
-
 
534
        else  
-
 
535
        {  
-
 
536
        if(AdWertNick > 2000) MesswertNick = +1200;  
-
 
537
        if(AdWertNick > 2015) MesswertNick = +1600;
-
 
538
        if(AdWertNick < 15)   MesswertNick = -1200;  
-
 
539
        if(AdWertNick <  7)   MesswertNick = -1600;
-
 
540
        if(AdWertRoll > 2000) MesswertRoll = +1200;  
-
 
541
        if(AdWertRoll > 2015) MesswertRoll = +1600;
-
 
542
        if(AdWertRoll < 15)   MesswertRoll = -1200;  
-
 
543
        if(AdWertRoll <  7)   MesswertRoll = -1600;
Line 493... Line 544...
493
   if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000;  if(AdWertRoll > 1017) MesswertRoll = +2000; }
544
        }
-
 
545
 // MartinR : Neu Ende
-
 
546
 
494
   else { if(AdWertRoll > 2000) MesswertRoll = +1000;  if(AdWertRoll > 2015) MesswertRoll = +2000;  }
547
  if(Parameter_Gyro_D)
495
 
548
  // MartinR: hier sind Änderungen erforderlich, da u.a. MesswertNick = HiResNick / 8 von der fc.c in die analog.c verschoben wurde
496
  if(Parameter_Gyro_D)
549
  // Hintergrund: Code einsparen
497
  {
550
  {
498
   d2Nick = HiResNick - oldNick;
551
   d2Nick = HiResNick - oldNick;
Line 499... Line 552...
499
   oldNick = (oldNick + HiResNick)/2;
552
   oldNick = (oldNick + HiResNick)/2;
500
   if(d2Nick > D_LIMIT) d2Nick = D_LIMIT;
553
   if(d2Nick > D_LIMIT) d2Nick = D_LIMIT;
501
   else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT;
554
   else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT;
502
 
555
 
503
   d2Roll = HiResRoll - oldRoll;
556
   d2Roll = HiResRoll - oldRoll;
504
   oldRoll = (oldRoll + HiResRoll)/2;
557
   oldRoll = (oldRoll + HiResRoll)/2;
-
 
558
   if(d2Roll > D_LIMIT) d2Roll = D_LIMIT;
505
   if(d2Roll > D_LIMIT) d2Roll = D_LIMIT;
559
   else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT;
-
 
560
   
506
   else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT;
561
   //MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; // MartinR : so war es 
507
 
562
   MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 2; // MartinR : geändert 
508
   MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16;
563
   //MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; // MartinR : so war es 
Line 509... Line 564...
509
   MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16;
564
   MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 2; // MartinR : geändert 
510
   HiResNick += (d2Nick * (signed int) Parameter_Gyro_D);
565
   HiResNick += (d2Nick * (signed int) Parameter_Gyro_D * 8); // martinR: *8 hinzugefügt
511
   HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D);
566
   HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D * 8); // martinR: *8 hinzugefügt
Line 619... Line 674...
619
 Parameter_ExtraConfig = EE_Parameter.ExtraConfig;
674
 Parameter_ExtraConfig = EE_Parameter.ExtraConfig;
620
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
675
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255);
621
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
676
 CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability);
622
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
677
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl);
623
 Ki = 10300 / (Parameter_I_Faktor + 1);
678
 Ki = 10300 / (Parameter_I_Faktor + 1);
-
 
679
 
-
 
680
   
-
 
681
 if(Parameter_UserParam1 > 50) KiHH = 10300 / (Parameter_UserParam2 + 1); else  KiHH = Ki; // MartinR : für HH über Schalter
-
 
682
 Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen
-
 
683
 if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode 
-
 
684
  // 0 = free; 100 = AID; 200 = coming home //neu 
-
 
685
 
-
 
686
 
624
 MAX_GAS = EE_Parameter.Gas_Max;
687
 MAX_GAS = EE_Parameter.Gas_Max;
625
 MIN_GAS = EE_Parameter.Gas_Min;
688
 MIN_GAS = EE_Parameter.Gas_Min;
Line 626... Line 689...
626
 
689
 
627
 tmp = EE_Parameter.CareFreeModeControl;
690
 tmp = EE_Parameter.CareFreeModeControl;
Line 660... Line 723...
660
void MotorRegler(void)
723
void MotorRegler(void)
661
//############################################################################
724
//############################################################################
662
{
725
{
663
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
726
         int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2;
664
         int GierMischanteil,GasMischanteil;
727
         int GierMischanteil,GasMischanteil;
-
 
728
         
-
 
729
         static long SummeNickHH=0,SummeRollHH=0; // MartinR: hinzugefügt
-
 
730
         
665
     static long sollGier = 0,tmp_long,tmp_long2;
731
     static long sollGier = 0,tmp_long,tmp_long2;
666
     static long IntegralFehlerNick = 0;
732
     static long IntegralFehlerNick = 0;
667
     static long IntegralFehlerRoll = 0;
733
     static long IntegralFehlerRoll = 0;
668
         static unsigned int RcLostTimer;
734
         static unsigned int RcLostTimer;
669
         static unsigned char delay_neutral = 0;
735
         static unsigned char delay_neutral = 0;
Line 768... Line 834...
768
                           SetNeutral(0);
834
                           SetNeutral(0);
769
                           calibration_done = 1;
835
                           calibration_done = 1;
770
                                                   ServoActive = 1;
836
                                                   ServoActive = 1;
771
                                                   DDRD  |=0x80; // enable J7 -> Servo signal
837
                                                   DDRD  |=0x80; // enable J7 -> Servo signal
772
                           Piep(GetActiveParamSet(),120);
838
                           Piep(GetActiveParamSet(),120);
-
 
839
                                                        PPM_in[13] = Parameter_UserParam5 -110; // MartinR: Initialisierungswerte für die seriellen Potis für Jeti+
-
 
840
                                                        PPM_in[14] = Parameter_UserParam6 -110; // MartinR: Initialisierungswerte für die seriellen Potis für Jeti+
773
                         }
841
                         }
774
                        }
842
                        }
775
                    }
843
                    }
776
                 else
844
                 else
777
                if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75)  // ACC Neutralwerte speichern
845
                if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75)  // ACC Neutralwerte speichern
Line 856... Line 924...
856
  {
924
  {
857
        static int stick_nick,stick_roll;
925
        static int stick_nick,stick_roll;
858
        unsigned char stick_p;
926
        unsigned char stick_p;
859
    ParameterZuordnung();
927
    ParameterZuordnung();
860
        stick_p = EE_Parameter.Stick_P;
928
        stick_p = EE_Parameter.Stick_P;
-
 
929
        // MartinR: original:   
-
 
930
        /*
861
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * stick_p) / 4;
931
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * stick_p) / 4;
862
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
932
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
863
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * stick_p) / 4;
933
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * stick_p) / 4;
864
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
934
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
935
                        */
-
 
936
// MartinR: geändert Anfang
-
 
937
        if(Parameter_UserParam1 > 50)   // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist
-
 
938
                {
-
 
939
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4;
-
 
940
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ;
-
 
941
                //stick_nick = (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral);
-
 
942
                //stick_roll = (PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral);
-
 
943
                }
-
 
944
               
-
 
945
         else
-
 
946
                {
-
 
947
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * stick_p) / 4;
-
 
948
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * stick_p) / 4;
-
 
949
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
950
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
951
                }
-
 
952
       
-
 
953
         if(IntegralFaktor)  
-
 
954
                {
-
 
955
                //stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
956
                //stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
957
                stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
-
 
958
                stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
959
               
-
 
960
                //StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam  
-
 
961
                //StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
962
                }
-
 
963
        /*else          // wenn HH , MartinR
-
 
964
                {
-
 
965
                //stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
966
                //stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben
-
 
967
                //StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam
-
 
968
                //StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam
-
 
969
                }
-
 
970
        */
-
 
971
// MartinR: geändert Ende
Line 865... Line 972...
865
 
972
 
866
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
973
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
867
// CareFree und freie Wahl der vorderen Richtung
974
// CareFree und freie Wahl der vorderen Richtung
868
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
975
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
976
        //if(CareFree) // MartinR: so war es
869
        if(CareFree)
977
        if(CareFree && IntegralFaktor) // MartinR: CareFree nur im ACC-Mode
870
        {
978
        {
871
                signed int nick, roll;
979
                signed int nick, roll;
872
                nick = stick_nick / 4;
980
                nick = stick_nick / 4;
873
                roll = stick_roll / 4;
981
                roll = stick_roll / 4;
874
                StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4);
982
                StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4);
875
                StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4);
983
                StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4);
876
        }
984
        }
877
        else
985
        else
878
        {
986
        {
-
 
987
                //FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6]; //MartinR: so war es
879
                FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6];
988
                FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle * 2 + 12]; //MartinR: feinere Auflösung
-
 
989
                //FromNC_Rotate_S = sintab[EE_Parameter.OrientationAngle]; //MartinR: so war es
880
                FromNC_Rotate_S = sintab[EE_Parameter.OrientationAngle];
990
                FromNC_Rotate_S = sintab[EE_Parameter.OrientationAngle * 2]; //MartinR: feinere Auflösung
881
                StickNick = ((FromNC_Rotate_C * stick_nick) + (FromNC_Rotate_S * stick_roll)) / 8;
991
                StickNick = ((FromNC_Rotate_C * stick_nick) + (FromNC_Rotate_S * stick_roll)) / 8;
882
                StickRoll = ((FromNC_Rotate_C * stick_roll) - (FromNC_Rotate_S * stick_nick)) / 8;
992
                StickRoll = ((FromNC_Rotate_C * stick_roll) - (FromNC_Rotate_S * stick_nick)) / 8;
Line 883... Line 993...
883
        }
993
        }
Line 902... Line 1012...
902
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
1012
    IntegralFaktorGier = Parameter_Gyro_Gier_I;
Line 903... Line 1013...
903
 
1013
 
904
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1014
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
905
//+ Analoge Steuerung per Seriell
1015
//+ Analoge Steuerung per Seriell
-
 
1016
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
906
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1017
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen??
907
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
1018
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
908
    {
1019
    {
909
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
1020
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
910
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
1021
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
Line 1013... Line 1124...
1013
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
1124
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
1014
 MittelIntegralRoll  += IntegralRoll;
1125
 MittelIntegralRoll  += IntegralRoll;
1015
 MittelIntegralNick2 += IntegralNick2;
1126
 MittelIntegralNick2 += IntegralNick2;
1016
 MittelIntegralRoll2 += IntegralRoll2;
1127
 MittelIntegralRoll2 += IntegralRoll2;
Line 1017... Line 1128...
1017
 
1128
 
-
 
1129
// if(Looping_Nick || Looping_Roll)  // MartinR: so war es
1018
 if(Looping_Nick || Looping_Roll)
1130
   if(Looping_Nick || Looping_Roll || (!IntegralFaktor & (Parameter_UserParam1 < 50) & !(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD))) // MartinR: erweitert
1019
  {
1131
  {
1020
    IntegralAccNick = 0;
1132
    IntegralAccNick = 0;
1021
    IntegralAccRoll = 0;
1133
    IntegralAccRoll = 0;
1022
    MittelIntegralNick = 0;
1134
    MittelIntegralNick = 0;
Line 1027... Line 1139...
1027
    Mess_IntegralRoll2 = Mess_IntegralRoll;
1139
    Mess_IntegralRoll2 = Mess_IntegralRoll;
1028
    ZaehlMessungen = 0;
1140
    ZaehlMessungen = 0;
1029
    LageKorrekturNick = 0;
1141
    LageKorrekturNick = 0;
1030
    LageKorrekturRoll = 0;
1142
    LageKorrekturRoll = 0;
1031
  }
1143
  }
-
 
1144
 
-
 
1145
  if((!IntegralFaktor && (Parameter_UserParam1 < 50) && !(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD))    ) // MartinR:
-
 
1146
          // nur im Moment des Umschaltens von HH auf ACC erfolgt ein Reset der Integrale, nicht aber bei normalem HH 
-
 
1147
          // um einen im HH-Mode eventuell schwindelig geflogenen ACC_Mode zu resetten!
-
 
1148
          // bis zur Umschaltung werden die Integrale für den Kameraausgleich verwendet 
-
 
1149
        {
-
 
1150
       
-
 
1151
        IntegralNick = 0; // MartinR: Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode
-
 
1152
    IntegralRoll = 0; // MartinR: Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode
-
 
1153
    Mess_IntegralNick = 0; // MartinR: Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode       
-
 
1154
    Mess_IntegralRoll = 0; // MartinR: Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode
-
 
1155
    Mess_Integral_Gier = 0;     // MartinR: Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode  
-
 
1156
        Integral_Gier = 0; // MartinR: Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode
-
 
1157
    //Mess_Integral_Gier2 = 0; // MartinR:  Reset der Integratoren beim Zurückschalten vom HH- in den ACC-Mode
-
 
1158
        }
-
 
1159
 
-
 
1160
        if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0; // MartinR geändert und verschoben
-
 
1161
          else IntegralFaktor = Parameter_Gyro_I; // MartinR: verschoben um Code zu sparen
Line 1032... Line 1162...
1032
 
1162
 
1033
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1163
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1034
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
1164
  if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin))
1035
  {
1165
  {
Line 1086... Line 1216...
1086
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1216
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
1087
 {
1217
 {
1088
  static int cnt = 0;
1218
  static int cnt = 0;
1089
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1219
  static char last_n_p,last_n_n,last_r_p,last_r_n;
1090
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1220
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
1091
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp)
1221
  //if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) // MartinR: so war es
-
 
1222
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt
-
 
1223
 
1092
  {
1224
  {
1093
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1225
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
1094
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1226
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
1095
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1227
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
1096
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
1228
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
Line 1246... Line 1378...
1246
     }
1378
     }
1247
    tmp_int  = (long) EE_Parameter.StickGier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo  y = ax + bx²
1379
    tmp_int  = (long) EE_Parameter.StickGier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo  y = ax + bx²
1248
    tmp_int += (EE_Parameter.StickGier_P * StickGier) / 4;
1380
    tmp_int += (EE_Parameter.StickGier_P * StickGier) / 4;
1249
        tmp_int += CompassGierSetpoint;
1381
        tmp_int += CompassGierSetpoint;
1250
    sollGier = tmp_int;
1382
    sollGier = tmp_int;
1251
    Mess_Integral_Gier -= tmp_int;
1383
    //Mess_Integral_Gier -= tmp_int; // MartinR: so war es
-
 
1384
        Mess_Integral_Gier -= (tmp_int * 10) / 8; // MartinR: Test um Zurückschwingen bei hohen I-Faktoren zu verringern
1252
    if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000;  // begrenzen
1385
    //if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000;  // begrenzen // MartinR: so war es
1253
    if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000;
1386
    //if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; // MartinR: so war es
-
 
1387
        if(Mess_Integral_Gier > 90000) Mess_Integral_Gier = 90000;  // begrenzen // MartinR: Begrenzung verändert
-
 
1388
    if(Mess_Integral_Gier <-90000) Mess_Integral_Gier =-90000; // MartinR: Begrenzung verändert
Line 1254... Line 1389...
1254
 
1389
 
1255
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1390
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1256
//  Kompass
1391
//  Kompass
1257
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1392
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1393
    //if(KompassValue >= 0 && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) // MartinR: so war es
1258
    if(KompassValue >= 0 && (Parameter_GlobalConfig & CFG_KOMPASS_AKTIV))
1394
        if((KompassValue >= 0 && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV))  &&  !(Parameter_UserParam1 > 50))  // MartinR: bei HH über Schalter wird der Kompass abgeschaltet
1259
     {
1395
     {
1260
      if(CalculateCompassTimer-- == 1)
1396
      if(CalculateCompassTimer-- == 1)
1261
          {
1397
          {
1262
       int w,v,r,fehler,korrektur; // wird von der SPI-Routine auf 1 gesetzt
1398
       int w,v,r,fehler,korrektur; // wird von der SPI-Routine auf 1 gesetzt
Line 1310... Line 1446...
1310
 
1446
 
1311
#define TRIM_MAX 200
1447
#define TRIM_MAX 200
1312
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
1448
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
Line -... Line 1449...
-
 
1449
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
-
 
1450
 
-
 
1451
        //MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1452
    //MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);// MartinR so war es
-
 
1453
       
-
 
1454
        if(!IntegralFaktor) // MartinR : HH-Mode hinzugefügt
-
 
1455
        {
-
 
1456
        MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN)  ; // MartinR : hinzugefügt
-
 
1457
        MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ;  // MartinR : hinzugefügt
-
 
1458
        //MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN);
-
 
1459
        //Mess_Integral_Gier = 0;       // MartinR: nur Kompass wird bei HH deaktiviert
-
 
1460
        //Integral_Gier = 0; // MartinR: nur Kompass wird bei HH deaktiviert
-
 
1461
        }
1313
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
1462
        else // MartinR: ACC-Mode  so war es
1314
 
1463
        {
-
 
1464
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
-
 
1465
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1315
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
1466
        }
Line 1316... Line 1467...
1316
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1467
       
1317
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1468
    MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN));
1318
 
1469
 
Line 1401... Line 1552...
1401
                   }
1552
                   }
Line 1402... Line 1553...
1402
 
1553
 
1403
                // if height control is activated by an rc channel
1554
                // if height control is activated by an rc channel
1404
        if(Parameter_GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1555
        if(Parameter_GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1405
                {       // check if parameter is less than activation threshold
1556
                {       // check if parameter is less than activation threshold
-
 
1557
                        // if(Parameter_HoehenSchalter < 50) // for 3 or 2-state switch height control is disabled in lowest position // MartinR :so war es
1406
                        if(Parameter_HoehenSchalter < 50) // for 3 or 2-state switch height control is disabled in lowest position
1558
                        if((Parameter_HoehenSchalter < 50) || (Parameter_UserParam1 > 140) )   // MartinR: Schalter aus oder HH ohne Höhenregler über UsererParam1 an
1407
                        {   //height control not active
1559
                        {   //height control not active
1408
                                if(!delay--)
1560
                                if(!delay--)
1409
                                {
1561
                                {
1410
                                        HoehenReglerAktiv = 0; // disable height control
1562
                                        HoehenReglerAktiv = 0; // disable height control
Line 1419... Line 1571...
1419
                        }
1571
                        }
1420
                }
1572
                }
1421
                else // no switchable height control
1573
                else // no switchable height control
1422
                {
1574
                {
1423
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_HoehenSchalter) * (int)EE_Parameter.Hoehe_Verstaerkung;
1575
                        SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_HoehenSchalter) * (int)EE_Parameter.Hoehe_Verstaerkung;
-
 
1576
                        // HoehenReglerAktiv = 1; // MartinR : so war es
-
 
1577
                        // MartinR : geändert Anfang
-
 
1578
                                if(Parameter_UserParam1 > 140) // HH über Schalter: HH an + Höhenregler abgeschaltet, Nachführen von Parametern 
-
 
1579
                                {
-
 
1580
                                        HoehenReglerAktiv = 0;
-
 
1581
                                }
-
 
1582
                                else  // Höhenregler mit Sollhöhe über Poti aktiv
-
 
1583
                                {
1424
                        HoehenReglerAktiv = 1;
1584
                                        HoehenReglerAktiv = 1;
-
 
1585
                                }
-
 
1586
                        // MartinR : geändert Ende
1425
                }
1587
                }
Line 1426... Line 1588...
1426
 
1588
 
1427
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1589
                // calculate cos of nick and roll angle used for projection of the vertical hoover gas
1428
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
1590
                tmp_int  = (int)(IntegralNick/GIER_GRAD_FAKTOR);  // nick angle in deg
Line 1453... Line 1615...
1453
                  {
1615
                  {
1454
                // alternative height control
1616
                // alternative height control
1455
                // PD-Control with respect to hoover point
1617
                // PD-Control with respect to hoover point
1456
                // the thrust loss out of horizontal attitude is compensated
1618
                // the thrust loss out of horizontal attitude is compensated
1457
                // the setpoint will be fine adjusted with the gas stick position
1619
                // the setpoint will be fine adjusted with the gas stick position
-
 
1620
                HeightDeviation = HoehenWert - SollHoehe; //MartinR: Test
1458
                        if(FC_StatusFlags & FC_STATUS_FLY) // trim setpoint only when flying
1621
                        if(FC_StatusFlags & FC_STATUS_FLY) // trim setpoint only when flying
1459
                        {   // gas stick is above hoover point
1622
                        {   // gas stick is above hoover point
1460
                                if(StickGas > (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtUpperLimit)
1623
                                if(StickGas > (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtUpperLimit)
1461
                                {
1624
                                {
1462
                                        if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_DOWN)
1625
                                        if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_DOWN)
1463
                                        {
1626
                                        {
1464
                                                FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_DOWN;
1627
                                                FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_DOWN;
1465
                                                SollHoehe = HoehenWert; // update setpoint to current heigth
1628
                                                //SollHoehe = HoehenWert; // update setpoint to current heigth // MartinR: so war es
-
 
1629
                                                SollHoehe = HoehenWert - HeightDeviation / 2; // MartinR: um den Sollwertsprung zu verringern
1466
                                        }
1630
                                        }
1467
                                        FC_StatusFlags |= FC_STATUS_VARIO_TRIM_UP;
1631
                                        FC_StatusFlags |= FC_STATUS_VARIO_TRIM_UP;
1468
                                        // Limit the maximum Altitude
1632
                                        // Limit the maximum Altitude
1469
                                        if(Parameter_MaximumAltitude && (SollHoehe/100 > Parameter_MaximumAltitude)) AltitudeSetpointTrimming = 0;
1633
                                        if(Parameter_MaximumAltitude && (SollHoehe/100 > Parameter_MaximumAltitude)) AltitudeSetpointTrimming = 0;
1470
                                        else
1634
                                        else
Line 1479... Line 1643...
1479
                                else if(StickGas < (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtLowerLimit )
1643
                                else if(StickGas < (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtLowerLimit )
1480
                                {
1644
                                {
1481
                                        if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_UP)
1645
                                        if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_UP)
1482
                                        {
1646
                                        {
1483
                                                FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_UP;
1647
                                                FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_UP;
1484
                                                SollHoehe = HoehenWert; // update setpoint to current heigth
1648
                                                //SollHoehe = HoehenWert; // update setpoint to current heigth // MartinR: so war es
-
 
1649
                                                SollHoehe = HoehenWert - HeightDeviation / 2; // MartinR: um den Sollwertsprung zu verringern
1485
                                        }
1650
                                        }
1486
                                        FC_StatusFlags |= FC_STATUS_VARIO_TRIM_DOWN;
1651
                                        FC_StatusFlags |= FC_STATUS_VARIO_TRIM_DOWN;
1487
                                        AltitudeSetpointTrimming = -abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD));
1652
                                        AltitudeSetpointTrimming = -abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD));
1488
//                                      HeightTrimming -= abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD));
1653
//                                      HeightTrimming -= abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD));
1489
                                        VarioCharacter = '-';
1654
                                        VarioCharacter = '-';
Line 1500... Line 1665...
1500
                                                WaypointTrimming = 10;
1665
                                                WaypointTrimming = 10;
1501
                                                VarioCharacter = '^';
1666
                                                VarioCharacter = '^';
1502
                                                if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_DOWN)  // changed from sinking to rising
1667
                                                if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_DOWN)  // changed from sinking to rising
1503
                                                {
1668
                                                {
1504
                                                        FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_DOWN;
1669
                                                        FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_DOWN;
1505
                                                        SollHoehe = HoehenWert; // update setpoint to current heigth
1670
                                                        //SollHoehe = HoehenWert; // update setpoint to current heigth // MartinR: so war es
-
 
1671
                                                        SollHoehe = HoehenWert - HeightDeviation / 2; // MartinR: um den Sollwertsprung zu verringern
1506
                                                }
1672
                                                }
1507
                                         }
1673
                                         }
1508
                                         else
1674
                                         else
1509
                    if(FromNC_AltitudeSpeed && FromNC_AltitudeSetpoint < SollHoehe) // von NC gesteuert -> sinken
1675
                    if(FromNC_AltitudeSpeed && FromNC_AltitudeSetpoint < SollHoehe) // von NC gesteuert -> sinken
1510
                                         {
1676
                                         {
Line 1514... Line 1680...
1514
                                                WaypointTrimming = -10;
1680
                                                WaypointTrimming = -10;
1515
                                                VarioCharacter = 'v';
1681
                                                VarioCharacter = 'v';
1516
                                                if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_UP) // changed from rising to sinking
1682
                                                if(FC_StatusFlags & FC_STATUS_VARIO_TRIM_UP) // changed from rising to sinking
1517
                                                {
1683
                                                {
1518
                                                        FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_UP;
1684
                                                        FC_StatusFlags &= ~FC_STATUS_VARIO_TRIM_UP;
1519
                                                        SollHoehe = HoehenWert; // update setpoint to current heigth
1685
                                                        //SollHoehe = HoehenWert; // update setpoint to current heigth // MartinR: so war es
-
 
1686
                                                        SollHoehe = HoehenWert - HeightDeviation / 2; // MartinR: um den Sollwertsprung zu verringern
1520
                                                }
1687
                                                }
1521
                                         }
1688
                                         }
1522
                                        else
1689
                                        else
1523
                                        if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN))
1690
                                        if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN))
1524
                                        {
1691
                                        {
Line 1583... Line 1750...
1583
                        {
1750
                        {
1584
                                // ------------------------- P-Part ----------------------------
1751
                                // ------------------------- P-Part ----------------------------
1585
                                tmp_long = (HoehenWert - SollHoehe); // positive when too high
1752
                                tmp_long = (HoehenWert - SollHoehe); // positive when too high
1586
                                LIMIT_MIN_MAX(tmp_long, -32767L, 32767L);       // avoid overflov when casting to int16_t
1753
                                LIMIT_MIN_MAX(tmp_long, -32767L, 32767L);       // avoid overflov when casting to int16_t
1587
                                HeightDeviation = (int)(tmp_long); // positive when too high
1754
                                HeightDeviation = (int)(tmp_long); // positive when too high
-
 
1755
                                //tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 32L; // p-part // MartinR: so war es
-
 
1756
                                // MartinR: geändert Anfang
-
 
1757
                                if ((SollHoehe > (HoehenWert+64)) || (SollHoehe < (HoehenWert-64)))
-
 
1758
                                {
-
 
1759
                                tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 24L; // p-part // MartinR P-Part erhoehen
-
 
1760
                                }
-
 
1761
                                else  
-
 
1762
                                {
1588
                                tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 32L; // p-part
1763
                                tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 32L; // p-part
-
 
1764
                                }
-
 
1765
                                // MartinR: geändert Ende
1589
                                LIMIT_MIN_MAX(tmp_long, -127 * STICK_GAIN, 256 * STICK_GAIN); // more than the full range makes no sense
1766
                                //LIMIT_MIN_MAX(tmp_long, -127 * STICK_GAIN, 256 * STICK_GAIN); // more than the full range makes no sense // MartinR: so war es
-
 
1767
                                // MartinR: weshalb unsymmetrisch?
-
 
1768
                                LIMIT_MIN_MAX(tmp_long, -128 * STICK_GAIN, 128 * STICK_GAIN); // more than the full range makes no sense // MartinR: geändert
1590
                                GasReduction = tmp_long;
1769
                                GasReduction = tmp_long;
1591
                                // ------------------------- D-Part 1: Vario Meter ----------------------------
1770
                                // ------------------------- D-Part 1: Vario Meter ----------------------------
1592
                                tmp_int = VarioMeter / 8;
1771
                                //tmp_int = VarioMeter / 8; // MartinR: so war es
-
 
1772
                                // MartinR: geändert Anfang
-
 
1773
                                tmp_int = VarioMeter / 4; // MartinR: geändert // Variometer: steigen ist positiv                       
-
 
1774
                                        {
-
 
1775
                                                if ((SollHoehe > (HoehenWert+512)) || (SollHoehe < (HoehenWert-512)))
-
 
1776
                                                //if ((StickGas > (StickGasHover + 3*HEIGHT_CONTROL_STICKTHRESHOLD)) || (StickGas < (StickGasHover - 3*HEIGHT_CONTROL_STICKTHRESHOLD))) 
-
 
1777
                                                {
-
 
1778
                                                tmp_int = tmp_int + HeightDeviation / 28;
-
 
1779
                                                //tmp_int = tmp_int + Parameter_Hoehe_ACC_Wirkung* HeightDeviation / 64; // reduce d-part while trimming setpoint // MartinR: geändert
-
 
1780
                                                }
-
 
1781
                                                else  
-
 
1782
                                                {
-
 
1783
                                                tmp_int = tmp_int + HeightDeviation / 32;
-
 
1784
                                                //tmp_int = tmp_int + Parameter_Hoehe_ACC_Wirkung* HeightDeviation / 64;
-
 
1785
                                                }
-
 
1786
                                        }
-
 
1787
                                // MartinR: geändert Ende
-
 
1788
                               
1593
                                LIMIT_MIN_MAX(tmp_int, -127, 128);
1789
                                LIMIT_MIN_MAX(tmp_int, -127, 128);
1594
                                tmp_int = (tmp_int * (long)Parameter_Luftdruck_D) / 4L; // scale to d-gain parameter
1790
                                tmp_int = (tmp_int * (long)Parameter_Luftdruck_D) / 4L; // scale to d-gain parameter
1595
                                LIMIT_MIN_MAX(tmp_int,-64 * STICK_GAIN, 64 * STICK_GAIN);
1791
                                LIMIT_MIN_MAX(tmp_int,-64 * STICK_GAIN, 64 * STICK_GAIN);
-
 
1792
                                /* // MartinR: so war es Anfang
1596
                                if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN)) tmp_int /= 4; // reduce d-part while trimming setpoint
1793
                                if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN)) tmp_int /= 4; // reduce d-part while trimming setpoint
1597
                                else
1794
                                else
1598
                                if(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT) tmp_int /= 8; // reduce d-part in "Deckel" mode
1795
                                if(EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT) tmp_int /= 8; // reduce d-part in "Deckel" mode
-
 
1796
                                */ // MartinR: so war es Ende
-
 
1797
                                tmp_int /= 4; // MartinR: geändert: keine veränderung des d-part im "Deckel" mode
-
 
1798
                                //if(FC_StatusFlags & (FC_STATUS_VARIO_TRIM_UP|FC_STATUS_VARIO_TRIM_DOWN)) tmp_int /= 4; // reduce d-part while trimming setpoint // MartinR: geändert
-
 
1799
                               
1599
                                GasReduction += tmp_int;
1800
                                GasReduction += tmp_int;
1600
                        } // EOF no baro range expanding
1801
                        } // EOF no baro range expanding
1601
                        // ------------------------ D-Part 2: ACC-Z Integral  ------------------------
1802
                        // ------------------------ D-Part 2: ACC-Z Integral  ------------------------
-
 
1803
                        /*  // MartinR: deaktiviert Anfang, da statische Ablage bei Schräglage Probleme macht
1602
            if(Parameter_Hoehe_ACC_Wirkung)
1804
            if(Parameter_Hoehe_ACC_Wirkung)
1603
                         {
1805
                         {
1604
                          tmp_long = ((Mess_Integral_Hoch / 128L) * (int32_t) Parameter_Hoehe_ACC_Wirkung) / (128L / STICK_GAIN);
1806
                          tmp_long = ((Mess_Integral_Hoch / 128L) * (int32_t) Parameter_Hoehe_ACC_Wirkung) / (128L / STICK_GAIN);
1605
                          LIMIT_MIN_MAX(tmp_long, -32 * STICK_GAIN, 64 * STICK_GAIN);
1807
                          LIMIT_MIN_MAX(tmp_long, -32 * STICK_GAIN, 64 * STICK_GAIN);
1606
                          GasReduction += tmp_long;
1808
                          GasReduction += tmp_long;
1607
                         }
1809
                         }
-
 
1810
                         */  // MartinR: deaktiviert Ende 
1608
                        // ------------------------ D-Part 3: GpsZ  ----------------------------------
1811
                        // ------------------------ D-Part 3: GpsZ  ----------------------------------
1609
                        tmp_int = (Parameter_Hoehe_GPS_Z * (int)FromNaviCtrl_Value.GpsZ)/128L;
1812
                        tmp_int = (Parameter_Hoehe_GPS_Z * (int)FromNaviCtrl_Value.GpsZ)/128L;
1610
            LIMIT_MIN_MAX(tmp_int, -32 * STICK_GAIN, 64 * STICK_GAIN);
1813
            //LIMIT_MIN_MAX(tmp_int, -32 * STICK_GAIN, 64 * STICK_GAIN); // MartinR: so war es
-
 
1814
                        // MartinR: weshalb unsymmetrisch?
-
 
1815
                        LIMIT_MIN_MAX(tmp_int, -32 * STICK_GAIN, 32 * STICK_GAIN); // MartinR: geändert
1611
                        GasReduction += tmp_int;
1816
                        GasReduction += tmp_int;
1612
            GasReduction = (long)((long)GasReduction * HoverGas) / 512; // scale to the gas value
1817
            GasReduction = (long)((long)GasReduction * HoverGas) / 512; // scale to the gas value
1613
                        // ------------------------                  ----------------------------------
1818
                        // ------------------------                  ----------------------------------
1614
                        HCGas -= GasReduction;
1819
                        HCGas -= GasReduction;
1615
                        // limit deviation from hoover point within the target region
1820
                        // limit deviation from hoover point within the target region
Line 1651... Line 1856...
1651
            if(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT)
1856
            if(Parameter_ExtraConfig & CFG2_HEIGHT_LIMIT)
1652
                        {  // old version
1857
                        {  // old version
1653
                                LIMIT_MAX(FilterHCGas, GasMischanteil); // nicht mehr als Gas
1858
                                LIMIT_MAX(FilterHCGas, GasMischanteil); // nicht mehr als Gas
1654
                                GasMischanteil = FilterHCGas;
1859
                                GasMischanteil = FilterHCGas;
1655
                        }
1860
                        }
1656
                        else GasMischanteil = FilterHCGas + (GasMischanteil - HoverGas) / 4; // only in Vario-Mode
1861
                        //else GasMischanteil = FilterHCGas + (GasMischanteil - HoverGas) / 4; // only in Vario-Mode // MartinR: so war es
-
 
1862
                        else GasMischanteil = FilterHCGas ; // MartinR: geändert, um  Überschwinger bei Höhenänderung zu verringern
1657
                  }
1863
                  }
1658
                }// EOF height control active
1864
                }// EOF height control active
1659
                else // HC not active
1865
                else // HC not active
1660
                {
1866
                {
1661
                        //update hoover gas stick value when HC is not active
1867
                        //update hoover gas stick value when HC is not active
Line 1757... Line 1963...
1757
     if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2);
1963
     if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2);
1758
    }
1964
    }
1759
    tmp_int = MAX_GAS*STICK_GAIN;
1965
    tmp_int = MAX_GAS*STICK_GAIN;
1760
    if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil));
1966
    if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil));
1761
    if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil));
1967
    if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil));
-
 
1968
       
-
 
1969
       
-
 
1970
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1971
// Nick / Roll-Achse  // MartinR: um Code zu sparen wurde Nick und Roll zusammengefasst
-
 
1972
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1973
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
-
 
1974
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
-
 
1975
 
-
 
1976
        // PI-Regler für Nick und Roll
-
 
1977
        if(EE_Parameter.Gyro_Stability <= 8)
-
 
1978
        {
-
 
1979
        pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 ; // Zwischenergebnis um Code zu sparen
-
 
1980
        pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8;
-
 
1981
        }
-
 
1982
        else
-
 
1983
        {
-
 
1984
        pd_ergebnis_nick = ((EE_Parameter.Gyro_Stability / 2) * DiffNick) / 4; // Überlauf verhindern
-
 
1985
        pd_ergebnis_roll = ((EE_Parameter.Gyro_Stability / 2) * DiffRoll) / 4;  // Überlauf verhindern
-
 
1986
        }
-
 
1987
       
-
 
1988
        if(IntegralFaktor) // MartinR : ACC-Mode
-
 
1989
         {
-
 
1990
          SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung
-
 
1991
          if(SummeNick >  (STICK_GAIN * 8000L)) SummeNick =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
1992
      if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
1993
          pd_ergebnis_nick += (SummeNick / Ki); // PI-Regler für Nick
-
 
1994
          SummeNickHH = 0 ;
-
 
1995
         
-
 
1996
          SummeRoll += IntegralRollMalFaktor - StickRoll;
-
 
1997
          if(SummeRoll >  (STICK_GAIN * 8000L)) SummeRoll =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
1998
      if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
1999
          pd_ergebnis_roll += (SummeRoll / Ki); // PI-Regler für Roll
-
 
2000
          SummeRollHH = 0;
-
 
2001
         
-
 
2002
         }
-
 
2003
    else // MartinR : HH-Mode
-
 
2004
         {
-
 
2005
          SummeNickHH += DiffNick; // I-Anteil bei HH
-
 
2006
      if(SummeNickHH >  (STICK_GAIN * 8000L)) SummeNickHH =  (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf
-
 
2007
      if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf
-
 
2008
          pd_ergebnis_nick += SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH
-
 
2009
          SummeNick = 0;
-
 
2010
         
-
 
2011
          SummeRollHH += DiffRoll;  // I-Anteil bei HH
-
 
2012
      if(SummeRollHH >  (STICK_GAIN * 8000L)) SummeRollHH =  (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf
-
 
2013
      if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf
-
 
2014
          pd_ergebnis_roll += SummeRollHH / KiHH;       // MartinR: PI-Regler für Roll bei HH
-
 
2015
          SummeRoll = 0;
-
 
2016
     } 
-
 
2017
        // MartinR : geändert Ende
-
 
2018
       
-
 
2019
       
-
 
2020
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
-
 
2021
    if(pd_ergebnis_nick >  tmp_int) pd_ergebnis_nick =  tmp_int;
-
 
2022
    if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int;
Line -... Line 2023...
-
 
2023
 
-
 
2024
        //tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
-
 
2025
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
-
 
2026
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;       
-
 
2027
       
-
 
2028
       
-
 
2029
// MartinR: alt
1762
 
2030
/*
1763
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2031
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1764
// Nick-Achse
2032
// Nick-Achse
1765
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2033
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1766
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
2034
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
Line 1792... Line 2060...
1792
       
2060
       
1793
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
2061
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1794
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
2062
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
Line -... Line 2063...
-
 
2063
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;
-
 
2064
 
-
 
2065
        */
1795
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;
2066
        // MartinR: alt Ende
1796
 
2067
 
1797
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2068
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1798
// Universal Mixer
2069
// Universal Mixer
1799
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2070
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++