Subversion Repositories FlightCtrl

Rev

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

Rev 930 Rev 964
Line 85... Line 85...
85
long  ErsatzKompass;
85
long  ErsatzKompass;
86
int   ErsatzKompassInGrad; // Kompasswert in Grad
86
int   ErsatzKompassInGrad; // Kompasswert in Grad
87
int   GierGyroFehler = 0;
87
int   GierGyroFehler = 0;
88
float GyroFaktor;
88
float GyroFaktor;
89
float IntegralFaktor;
89
float IntegralFaktor;
-
 
90
// float IntegralFaktor_Gier; // MartinR
90
volatile int  DiffNick,DiffRoll;
91
volatile int  DiffNick,DiffRoll;
91
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
92
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
92
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
93
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
93
volatile unsigned char SenderOkay = 0;
94
volatile unsigned char SenderOkay = 0;
94
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
95
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
Line 133... Line 134...
133
unsigned char Parameter_NaviGpsD;        
134
unsigned char Parameter_NaviGpsD;        
134
unsigned char Parameter_NaviGpsACC;        
135
unsigned char Parameter_NaviGpsACC;        
135
unsigned char Parameter_ExternalControl;
136
unsigned char Parameter_ExternalControl;
136
struct mk_param_struct EE_Parameter;
137
struct mk_param_struct EE_Parameter;
137
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
138
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20;
138
int MaxStickNick = 0,MaxStickRoll = 0;
139
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0;  // MartinR: stick_.._neutral hinzugefügt
139
unsigned int  modell_fliegt = 0;
140
unsigned int  modell_fliegt = 0;
140
unsigned char MikroKopterFlags = 0;
141
unsigned char MikroKopterFlags = 0;
Line 141... Line 142...
141
 
142
 
142
void Piep(unsigned char Anzahl)
143
void Piep(unsigned char Anzahl)
Line 224... Line 225...
224
    MesswertGier = (signed int) AdNeutralGier - AdWertGier;
225
    MesswertGier = (signed int) AdNeutralGier - AdWertGier;
225
    MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier;
226
    MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier;
226
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
227
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
227
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
228
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
Line 228... Line 229...
228
 
229
 
229
//DebugOut.Analog[26] = MesswertNick;
230
// DebugOut.Analog[26] = MesswertNick;
Line 230... Line 231...
230
DebugOut.Analog[28] = MesswertRoll;
231
// DebugOut.Analog[28] = MesswertRoll;
231
 
232
 
232
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
233
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
233
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
234
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
Line 244... Line 245...
244
            Mess_Integral_Gier +=  MesswertGier;
245
            Mess_Integral_Gier +=  MesswertGier;
245
//            Mess_Integral_Gier2 += MesswertGier;
246
//            Mess_Integral_Gier2 += MesswertGier;
246
                    if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR;  // 360° Umschlag
247
                    if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR;  // 360° Umschlag
247
                    if(ErsatzKompass < 0)                          ErsatzKompass += 360L * GIER_GRAD_FAKTOR;
248
                    if(ErsatzKompass < 0)                          ErsatzKompass += 360L * GIER_GRAD_FAKTOR;
248
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
249
// Kopplungsanteil  +++++++++++++++++++++++++++++++++++++
-
 
250
                if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0;  // Doppelt ?? MartinR 
-
 
251
 
249
      if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
252
      if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))
250
         {
253
         {
251
            tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L;
254
            tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L;
252
            tmpl *= Parameter_AchsKopplung1;  //125
255
            tmpl *= Parameter_AchsKopplung1;  //125
253
            tmpl /= 4096L;
256
            tmpl /= 4096L;
254
            tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L;
257
            tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L;
Line 346... Line 349...
346
//############################################################################
349
//############################################################################
347
{                
350
{                
348
    if(PlatinenVersion >= 13) SucheGyroOffset();
351
    if(PlatinenVersion >= 13) SucheGyroOffset();
349
    // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern
352
    // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern
350
        ANALOG_OFF;
353
        ANALOG_OFF;
351
        MesswertNick = AdWertNick;
354
        // MesswertNick = AdWertNick; // original
-
 
355
        //MesswertNick = (signed int) AdWertNick - AdNeutralNick; // MartinR: weshhalb nicht so??
352
        MesswertRoll = AdWertRoll;
356
        //MesswertRoll = AdWertRoll; // original
-
 
357
        //MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; // MartinR: weshhalb nicht so??
353
        MesswertGier = AdWertGier;
358
        //MesswertGier = AdWertGier; // original
-
 
359
        //MesswertGier = (signed int) AdNeutralGier - AdWertGier; // MartinR: weshhalb nicht so??
-
 
360
       
354
        Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick;
361
        Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick;
355
        Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll;
362
        Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll;
356
        Mittelwert_AccHoch = (long)AdWertAccHoch;
363
        Mittelwert_AccHoch = (long)AdWertAccHoch;
357
   // ADC einschalten
364
   // ADC einschalten
358
    ANALOG_ON; 
365
    ANALOG_ON; 
Line 437... Line 444...
437
 CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255);
444
 CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255);
438
 CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255);
445
 CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255);
439
 CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255);
446
 CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255);
440
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255);
447
 CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255);
Line 441... Line 448...
441
 
448
 
-
 
449
        Ki = (float) Parameter_I_Faktor * 0.0001;
-
 
450
       
-
 
451
        if(!IntegralFaktor) Parameter_NaviGpsModeControl= 100; // MartinR: wenn HH dann GPS auf free- Mode
442
 Ki = (float) Parameter_I_Faktor * 0.0001;
452
       
443
 MAX_GAS = EE_Parameter.Gas_Max;
453
 MAX_GAS = EE_Parameter.Gas_Max;
444
 MIN_GAS = EE_Parameter.Gas_Min;
454
 MIN_GAS = EE_Parameter.Gas_Min;
Line 644... Line 654...
644
// neue Werte von der Funke
654
// neue Werte von der Funke
645
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
655
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
646
 if(!NewPpmData-- || Notlandung)  
656
 if(!NewPpmData-- || Notlandung)  
647
  {
657
  {
648
    int tmp_int;
658
    int tmp_int;
649
        static int stick_nick,stick_roll;
659
        static int stick_nick,stick_roll; // .._neutral hinzugefügt aber Deklaration siehe oben MartinR
650
    ParameterZuordnung();
660
    ParameterZuordnung();
-
 
661
       
-
 
662
       
-
 
663
        if(Parameter_UserParam1 > 50)   // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist
-
 
664
                {
-
 
665
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam2 - stick_nick_neutral) / 4;
-
 
666
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam2 - stick_roll_neutral) / 4 ;
-
 
667
                }
-
 
668
               
-
 
669
        else
-
 
670
                {
651
    stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
671
                stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
-
 
672
                stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
-
 
673
                }
-
 
674
       
-
 
675
         if(IntegralFaktor)  
-
 
676
                {
-
 
677
                stick_nick_neutral = stick_nick; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
678
                stick_roll_neutral = stick_roll; //  beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR
-
 
679
                //  stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: deaktiviert
-
 
680
                //      stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: deaktiviert
-
 
681
               
-
 
682
                StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
683
                StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam
-
 
684
                }
-
 
685
        else            // wenn HH , MartinR
-
 
686
                {
-
 
687
                //  stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: deaktiviert
-
 
688
                //      stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: deaktiviert
-
 
689
                StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam
-
 
690
                StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam
-
 
691
                }
-
 
692
               
652
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
693
    stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
653
    StickNick = stick_nick - (GPS_Nick + GPS_Nick2);
-
 
654
//    StickNick  = (StickNick  * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; 
-
 
Line 655... Line 694...
655
 
694
 
-
 
695
//    StickNick  = (StickNick  * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; 
656
    stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
696
       
657
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
-
 
Line 658... Line 697...
658
    StickRoll = stick_roll - (GPS_Roll + GPS_Roll2);
697
    stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
Line 659... Line 698...
659
 
698
 
660
//    StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
699
//    StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
Line 665... Line 704...
665
/*   if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick)
704
/*   if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick)
666
     MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--;
705
     MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--;
667
   if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll)
706
   if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll)
668
     MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--;
707
     MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--;
669
*/
708
*/
670
    GyroFaktor     = ((float)Parameter_Gyro_P + 10.0) / (256.0/STICK_GAIN);
-
 
671
    IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN);
-
 
-
 
709
 
Line 672... Line 710...
672
 
710
 
673
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
711
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
674
//+ Digitale Steuerung per DubWise
712
//+ Digitale Steuerung per DubWise
-
 
713
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
714
 
-
 
715
// To Do: Umschaltung auf HH deaktivieren //MartinR
675
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
716
 
676
#define KEY_VALUE (Parameter_ExternalControl * 4)  //(Poti3 * 8)
717
#define KEY_VALUE (Parameter_ExternalControl * 4)  //(Poti3 * 8)
677
if(DubWiseKeys[1]) beeptime = 10;
718
if(DubWiseKeys[1]) beeptime = 10;
678
    if(DubWiseKeys[1] & DUB_KEY_UP)    tmp_int = KEY_VALUE;   else
719
    if(DubWiseKeys[1] & DUB_KEY_UP)    tmp_int = KEY_VALUE;   else
679
    if(DubWiseKeys[1] & DUB_KEY_DOWN)  tmp_int = -KEY_VALUE;  else   tmp_int = 0;
720
    if(DubWiseKeys[1] & DUB_KEY_DOWN)  tmp_int = -KEY_VALUE;  else   tmp_int = 0;
Line 691... Line 732...
691
    StickRoll += (STICK_GAIN * ExternStickRoll) / 8;
732
    StickRoll += (STICK_GAIN * ExternStickRoll) / 8;
692
    StickGier += STICK_GAIN * ExternStickGier;
733
    StickGier += STICK_GAIN * ExternStickGier;
693
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
734
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
694
//+ Analoge Steuerung per Seriell
735
//+ Analoge Steuerung per Seriell
695
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
736
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
737
 
-
 
738
// To Do: Umschaltung auf HH deaktivieren //MartinR
-
 
739
 
696
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
740
   if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128)
697
    {
741
    {
698
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
742
         StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P;
699
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
743
         StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P;
700
         StickGier += ExternControl.Gier;
744
         StickGier += ExternControl.Gier;
701
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
745
     ExternHoehenValue =  (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung;
702
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
746
     if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas;
703
    }
747
    }
704
    if(StickGas < 0) StickGas = 0;
748
        if(StickGas < 0) StickGas = 0;
-
 
749
       
-
 
750
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
751
//+ Reglermodus // MartinR
-
 
752
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     
-
 
753
       
-
 
754
        GyroFaktor     = ((float)Parameter_Gyro_P + 10.0) / (256.0/STICK_GAIN);
-
 
755
    IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN);
-
 
756
        //IntegralFaktor_Gier = ((float) Parameter_UserParam3) / (44000 / STICK_GAIN); // MartinR
-
 
757
       
-
 
758
 //   if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
-
 
759
        if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0;  // Doppelt!? Doppel wieder aktiviert, da Impuls beim Umschalten. MartinR
Line 705... Line -...
705
 
-
 
706
    if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
760
 
707
    if(GyroFaktor < 0) GyroFaktor = 0;
761
    if(GyroFaktor < 0) GyroFaktor = 0;
Line 708... Line 762...
708
    if(IntegralFaktor < 0) IntegralFaktor = 0;
762
    if(IntegralFaktor < 0) IntegralFaktor = 0;
709
 
763
 
Line 775... Line 829...
775
     StickGier = 0;
829
     StickGier = 0;
776
     StickNick = 0;
830
     StickNick = 0;
777
     StickRoll = 0;
831
     StickRoll = 0;
778
     GyroFaktor     = (float) 100 / (256.0 / STICK_GAIN);
832
     GyroFaktor     = (float) 100 / (256.0 / STICK_GAIN);
779
     IntegralFaktor = (float) 120 / (44000 / STICK_GAIN);
833
     IntegralFaktor = (float) 120 / (44000 / STICK_GAIN);
-
 
834
         // IntegralFaktor_Gier= (float) 120 / (44000 / STICK_GAIN);// MartinR
780
     Looping_Roll = 0;
835
     Looping_Roll = 0;
781
     Looping_Nick = 0;
836
     Looping_Nick = 0;
782
    }  
837
    }  
Line 790... Line 845...
790
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
845
 MittelIntegralNick  += IntegralNick;    // Für die Mittelwertbildung aufsummieren
791
 MittelIntegralRoll  += IntegralRoll;
846
 MittelIntegralRoll  += IntegralRoll;
792
 MittelIntegralNick2 += IntegralNick2;
847
 MittelIntegralNick2 += IntegralNick2;
793
 MittelIntegralRoll2 += IntegralRoll2;
848
 MittelIntegralRoll2 += IntegralRoll2;
Line -... Line 849...
-
 
849
 
794
 
850
 
795
 if(Looping_Nick || Looping_Roll)
851
 if(Looping_Nick || Looping_Roll || !IntegralFaktor)
796
  {
852
  {
797
    IntegralAccNick = 0;
853
    IntegralAccNick = 0;
798
    IntegralAccRoll = 0;
854
    IntegralAccRoll = 0;
799
    MittelIntegralNick = 0;
855
    MittelIntegralNick = 0;
800
    MittelIntegralRoll = 0;
856
    MittelIntegralRoll = 0;
801
    MittelIntegralNick2 = 0;
857
    MittelIntegralNick2 = 0;
-
 
858
    MittelIntegralRoll2 = 0;
-
 
859
       
-
 
860
       
-
 
861
    IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0
-
 
862
    IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 
-
 
863
    Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
864
    Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0    
-
 
865
    Mess_Integral_Gier = 0;     // MartinR: im HH-Modus alle unbenutzten Integratoren = 0       
-
 
866
    Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0  
-
 
867
       
802
    MittelIntegralRoll2 = 0;
868
       
803
    Mess_IntegralNick2 = Mess_IntegralNick;
869
    Mess_IntegralNick2 = Mess_IntegralNick;
804
    Mess_IntegralRoll2 = Mess_IntegralRoll;
870
    Mess_IntegralRoll2 = Mess_IntegralRoll;
805
    ZaehlMessungen = 0;
871
    ZaehlMessungen = 0;
806
    LageKorrekturNick = 0;
872
    LageKorrekturNick = 0;
807
    LageKorrekturRoll = 0;
873
    LageKorrekturRoll = 0;
Line 808... Line 874...
808
  }
874
  }
809
 
875
 
810
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
876
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
811
  if(!Looping_Nick && !Looping_Roll)
877
  if(!Looping_Nick && !Looping_Roll && IntegralFaktor)
812
  {
878
  {
813
   long tmp_long, tmp_long2;
879
   long tmp_long, tmp_long2;
814
    tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
880
    tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
Line 835... Line 901...
835
    Mess_IntegralNick -= tmp_long;
901
    Mess_IntegralNick -= tmp_long;
836
    Mess_IntegralRoll -= tmp_long2;
902
    Mess_IntegralRoll -= tmp_long2;
837
  }
903
  }
838
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
904
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
Line 839... Line 905...
839
 
905
 
840
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
906
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)  // AbgleichAnzahl: fest definierter Wert
841
 {
907
 {
842
  static int cnt = 0;
908
  static int cnt = 0;
843
  static char last_n_p,last_n_n,last_r_p,last_r_n;
909
  static char last_n_p,last_n_n,last_r_p,last_r_n;
844
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
910
  static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt;
845
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug)
911
  if(!Looping_Nick && !Looping_Roll && !TrichterFlug && IntegralFaktor)
846
  {
912
  {
847
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
913
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
848
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
914
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
849
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
915
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
Line 903... Line 969...
903
DebugOut.Analog[30] = LageKorrekturRoll * 10;
969
DebugOut.Analog[30] = LageKorrekturRoll * 10;
904
*/
970
*/
Line 905... Line 971...
905
 
971
 
906
#define FEHLER_LIMIT  (ABGLEICH_ANZAHL * 4)
972
#define FEHLER_LIMIT  (ABGLEICH_ANZAHL * 4)
907
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16)
973
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16)
908
#define BEWEGUNGS_LIMIT 20000
974
#define BEWEGUNGS_LIMIT 20000  
909
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++
975
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++
910
        cnt = 1;// + labs(IntegralFehlerNick) / 4096;
976
        cnt = 1;// + labs(IntegralFehlerNick) / 4096;
911
        if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT)
977
        if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT)
912
        {
978
        {
Line 1092... Line 1158...
1092
//    DebugOut.Analog[17] = FromNaviCtrl_Value.Distance;
1158
//    DebugOut.Analog[17] = FromNaviCtrl_Value.Distance;
1093
//    DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar;
1159
//    DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar;
1094
    DebugOut.Analog[19] = WinkelOut.CalcState;
1160
    DebugOut.Analog[19] = WinkelOut.CalcState;
1095
    DebugOut.Analog[20] = ServoValue;
1161
    DebugOut.Analog[20] = ServoValue;
Line -... Line 1162...
-
 
1162
 
-
 
1163
 
-
 
1164
//      DebugOut.Analog[26] = MesswertNick;
-
 
1165
//      DebugOut.Analog[28] = MesswertRoll;
1096
 
1166
 
1097
    DebugOut.Analog[30] = GPS_Nick;
1167
    DebugOut.Analog[30] = GPS_Nick;
Line 1098... Line 1168...
1098
    DebugOut.Analog[31] = GPS_Roll;
1168
    DebugOut.Analog[31] = GPS_Roll;
Line 1127... Line 1197...
1127
 
1197
 
1128
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1198
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1129
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
1199
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
Line 1130... Line 1200...
1130
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1200
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1131
 
1201
 
1132
    if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor;
1202
    if(Looping_Nick || !IntegralFaktor) MesswertNick = MesswertNick * GyroFaktor;   // erweitert um !Integralfaktor,  MartinR
1133
    else             MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor;
1203
    else             MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor;
-
 
1204
    if(Looping_Roll || !IntegralFaktor) MesswertRoll = MesswertRoll * GyroFaktor;
1134
    if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor;
1205
    else             MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor;
-
 
1206
       
Line 1135... Line 1207...
1135
    else             MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor;
1207
    MesswertGier =   MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2;
1136
    MesswertGier =   MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2;
1208
        // MesswertGier =   MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor_Gier / 2; // Eigener IntegralFaktor für Gier, MartinR
Line 1137... Line 1209...
1137
 
1209
 
Line 1153... Line 1225...
1153
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1225
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1154
//OCR0B = 180 - (Poti1 + 120) / 4;
1226
//OCR0B = 180 - (Poti1 + 120) / 4;
1155
//DruckOffsetSetting = OCR0B;
1227
//DruckOffsetSetting = OCR0B;
1156
  GasMischanteil *= STICK_GAIN;
1228
  GasMischanteil *= STICK_GAIN;
Line -... Line 1229...
-
 
1229
 
1157
 
1230
 
1158
 if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // Höhenregelung
1231
 if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && !(Parameter_UserParam1 > 50))  // Höhenregelung // MartinR: Höhenregelung bei HH abschalten
1159
  {
1232
  {
1160
    int tmp_int;
1233
    int tmp_int;
1161
    if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1234
    if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
1162
    {
1235
    {
Line 1224... Line 1297...
1224
 
1297
 
1225
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1298
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1226
// Nick-Achse
1299
// Nick-Achse
1227
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1300
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1228
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
1301
    DiffNick = MesswertNick - StickNick;        // Differenz bestimmen
-
 
1302
//    if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung // so war es, MartinR
-
 
1303
//      das IntegralNick ist bereits im MesswertNick. Die SummeNick wird bei mir im ACC-Mode mit sowiso über Ki auf Null gesetzt. MartinR
-
 
1304
 
-
 
1305
        if(IntegralFaktor) SummeNick = (IntegralNick * IntegralFaktor - StickNick + (stick_nick_neutral/4)) / Ki ; // Startwert von SummeNick bei Umschaltung auf HH, MartinR
1229
    if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung
1306
        // im ACC-Mode wird SummeNick nicht mehr verwendet. SummeNick im ACC-Mode ist nur der Startwert für SummeNick im HH-Mode, MartinR
-
 
1307
    else  SummeNick += DiffNick; // I-Anteil bei HH 
1230
    else  SummeNick += DiffNick; // I-Anteil bei HH 
1308
       
1231
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1309
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
-
 
1310
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
-
 
1311
       
1232
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1312
        if(IntegralFaktor) pd_ergebnis = DiffNick;              // PI-Regler im ACC-Mode , MartinR 
1233
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
1313
    else pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick // bei HH , MartinR                             
1234
    // Motor Vorn
1314
    // Motor Vorn
1235
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1315
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1236
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1316
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
Line 1251... Line 1331...
1251
        Motor_Hinten = motorwert;              
1331
        Motor_Hinten = motorwert;              
1252
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1332
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1253
// Roll-Achse
1333
// Roll-Achse
1254
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1334
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1255
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1335
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1256
    if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;// I-Anteil bei Winkelregelung
1336
//    if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;// I-Anteil bei Winkelregelung
-
 
1337
        if(IntegralFaktor) SummeRoll = (IntegralRoll * IntegralFaktor - StickRoll + (stick_roll_neutral/4)) / Ki; // Startwert von SummeRoll bei Umschaltung auf HH, MartinR
-
 
1338
        // im ACC-Mode wird SummeRoll nicht mehr verwendet. SummeRoll im ACC-Mode ist nur der Startwert für SummeRoll im HH-Mode, MartinR
1257
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1339
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
-
 
1340
       
1258
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1341
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1259
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1342
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
-
 
1343
       
-
 
1344
        if(IntegralFaktor)      pd_ergebnis = DiffRoll;         // PI-Regler im ACC-Mode , MartinR 
1260
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1345
    else pd_ergebnis = DiffRoll + Ki * SummeRoll;       // PI-Regler für Roll
1261
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1346
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1262
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1347
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1263
    if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int;
1348
    if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int;
1264
    // Motor Links
1349
    // Motor Links
1265
    motorwert = GasMischanteil + pd_ergebnis - GierMischanteil;
1350
    motorwert = GasMischanteil + pd_ergebnis - GierMischanteil;