Subversion Repositories FlightCtrl

Rev

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

Rev 419 Rev 469
Line 664... Line 664...
664
    ZaehlMessungen = 0;
664
    ZaehlMessungen = 0;
665
    I_LageNick = 0;
665
    I_LageNick = 0;
666
    I_LageRoll = 0;
666
    I_LageRoll = 0;
667
  }
667
  }
Line -... Line 668...
-
 
668
 
-
 
669
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
-
 
670
  if(IntegralFaktor && !Looping_Nick && !Looping_Roll)
-
 
671
  {
-
 
672
   long tmp_long, tmp_long2;
-
 
673
    tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
-
 
674
    tmp_long /= 16;
-
 
675
    tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll);
-
 
676
    tmp_long2 /= 16;
-
 
677
 #define AUSGLEICH 32
-
 
678
    if(tmp_long >  AUSGLEICH)  tmp_long  = AUSGLEICH;
-
 
679
    if(tmp_long < -AUSGLEICH)  tmp_long  =-AUSGLEICH;
-
 
680
    if(tmp_long2 > AUSGLEICH)  tmp_long2 = AUSGLEICH;
-
 
681
    if(tmp_long2 <-AUSGLEICH)  tmp_long2 =-AUSGLEICH;
-
 
682
    Mess_IntegralNick -= tmp_long;
-
 
683
    Mess_IntegralRoll -= tmp_long2;
-
 
684
  }
-
 
685
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
668
 
686
 
669
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
687
 if(ZaehlMessungen >= ABGLEICH_ANZAHL)
670
 {
688
 {
671
  static int cnt = 0;
689
  static int cnt = 0;
672
  static char last_n_p,last_n_n,last_r_p,last_r_n;
690
  static char last_n_p,last_n_n,last_r_p,last_r_n;
Line 676... Line 694...
676
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
694
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
677
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
695
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
678
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
696
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
679
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
697
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
680
    IntegralAccZ    = IntegralAccZ / ABGLEICH_ANZAHL;
698
    IntegralAccZ    = IntegralAccZ / ABGLEICH_ANZAHL;
681
#define MAX_I 32
699
#define MAX_I 1//(Poti2/10)
682
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++
700
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++
683
    IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick);
701
    IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick);
684
    ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
702
    ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
685
    if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000)
703
    if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000)
686
     {
704
     {
Line 705... Line 723...
705
     }
723
     }
706
     else
724
     else
707
     {
725
     {
708
      I_LageRoll /=2;
726
      I_LageRoll /=2;
709
     }
727
     }
-
 
728
 
710
// +++++++++++++++++++++++++++++++++++++++++++++++++++++     
729
// +++++++++++++++++++++++++++++++++++++++++++++++++++++     
711
   MittelIntegralNick_Alt = MittelIntegralNick;      
730
   MittelIntegralNick_Alt = MittelIntegralNick;      
712
   MittelIntegralRoll_Alt = MittelIntegralRoll;      
731
   MittelIntegralRoll_Alt = MittelIntegralRoll;      
713
// +++++++++++++++++++++++++++++++++++++++++++++++++++++     
732
// +++++++++++++++++++++++++++++++++++++++++++++++++++++     
714
    Mess_IntegralNick -= ausgleichNick;
733
    Mess_IntegralNick -= ausgleichNick;
Line 730... Line 749...
730
 
749
 
731
//    IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2;
750
//    IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2;
Line 732... Line -...
732
//    IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2;
-
 
733
 
751
//    IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2;
734
 
752
 
735
DebugOut.Analog[30] = I_LageRoll * 10;
753
 
736
DebugOut.Analog[17] = IntegralAccNick / 26;
754
DebugOut.Analog[17] = IntegralAccNick / 26;
737
DebugOut.Analog[18] = IntegralAccRoll / 26;
755
DebugOut.Analog[18] = IntegralAccRoll / 26;
738
DebugOut.Analog[19] = IntegralFehlerNick;// / 26;
756
DebugOut.Analog[19] = IntegralFehlerNick;// / 26;
739
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26;
757
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26;
740
DebugOut.Analog[21] = MittelIntegralNick / 26;
758
DebugOut.Analog[21] = MittelIntegralNick / 26;
-
 
759
DebugOut.Analog[22] = MittelIntegralRoll / 26;
Line 741... Line 760...
741
DebugOut.Analog[22] = MittelIntegralRoll / 26;
760
//DebugOut.Analog[28] = ausgleichNick;
742
DebugOut.Analog[28] = ausgleichNick;
761
DebugOut.Analog[29] = ausgleichRoll;
Line 743... Line 762...
743
DebugOut.Analog[29] = ausgleichRoll;
762
DebugOut.Analog[30] = I_LageRoll * 10;
Line 750... Line 769...
750
        if(IntegralFehlerNick >  FEHLER_LIMIT2)
769
        if(IntegralFehlerNick >  FEHLER_LIMIT2)
751
         {
770
         {
752
           if(last_n_p)
771
           if(last_n_p)
753
           {
772
           {
754
            cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
773
            cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
755
            ausgleichNick = IntegralFehlerNick / 8;
774
            ausgleichNick = IntegralFehlerNick / 12;
756
            if(ausgleichNick > 5000) ausgleichNick = 5000;
775
            if(ausgleichNick > 5000) ausgleichNick = 5000;
757
            Mess_IntegralNick -= ausgleichNick;
776
//            Mess_IntegralNick -= ausgleichNick;
758
           }
777
           }
759
           else last_n_p = 1;
778
           else last_n_p = 1;
760
         } else  last_n_p = 0;
779
         } else  last_n_p = 0;
761
        if(IntegralFehlerNick < -FEHLER_LIMIT2)
780
        if(IntegralFehlerNick < -FEHLER_LIMIT2)
762
         {
781
         {
763
           if(last_n_n)
782
           if(last_n_n)
764
            {
783
            {
765
             cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
784
             cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
766
             ausgleichNick = IntegralFehlerNick / 8;
785
             ausgleichNick = IntegralFehlerNick / 12;
767
             if(ausgleichNick < -5000) ausgleichNick = -5000;
786
             if(ausgleichNick < -5000) ausgleichNick = -5000;
768
             Mess_IntegralNick -= ausgleichNick;
787
//             Mess_IntegralNick -= ausgleichNick;
769
            }
788
            }
770
           else last_n_n = 1;
789
           else last_n_n = 1;
771
         } else  last_n_n = 0;
790
         } else  last_n_n = 0;
Line 772... Line 791...
772
 
791
 
773
        if(cnt > 3) cnt = 3;
792
        if(cnt > 5) cnt = 5;
774
        if(IntegralFehlerNick >  FEHLER_LIMIT)   AdNeutralNick += cnt;
793
        if(IntegralFehlerNick >  FEHLER_LIMIT)   AdNeutralNick += cnt;
Line 775... Line 794...
775
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
794
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
776
 
795
 
Line 780... Line 799...
780
        if(IntegralFehlerRoll >  FEHLER_LIMIT2)
799
        if(IntegralFehlerRoll >  FEHLER_LIMIT2)
781
         {
800
         {
782
           if(last_r_p)
801
           if(last_r_p)
783
           {
802
           {
784
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
803
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
785
            ausgleichRoll = IntegralFehlerRoll / 4;
804
            ausgleichRoll = IntegralFehlerRoll / 12;
786
            if(ausgleichRoll > 5000) ausgleichRoll = 5000;
805
            if(ausgleichRoll > 5000) ausgleichRoll = 5000;
787
            Mess_IntegralRoll -= ausgleichRoll;
806
//            Mess_IntegralRoll -= ausgleichRoll;
788
           }
807
           }
789
           else last_r_p = 1;
808
           else last_r_p = 1;
790
         } else  last_r_p = 0;
809
         } else  last_r_p = 0;
791
        if(IntegralFehlerRoll < -FEHLER_LIMIT2)
810
        if(IntegralFehlerRoll < -FEHLER_LIMIT2)
792
         {
811
         {
793
           if(last_r_n)
812
           if(last_r_n)
794
           {
813
           {
795
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
814
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
796
            ausgleichRoll = IntegralFehlerRoll / 4;
815
            ausgleichRoll = IntegralFehlerRoll / 12;
797
            if(ausgleichRoll < -5000) ausgleichRoll = -5000;
816
            if(ausgleichRoll < -5000) ausgleichRoll = -5000;
798
            Mess_IntegralRoll -= ausgleichRoll;
817
//            Mess_IntegralRoll -= ausgleichRoll;
799
           }
818
           }
800
           else last_r_n = 1;
819
           else last_r_n = 1;
801
         } else  last_r_n = 0;
820
         } else  last_r_n = 0;
Line 802... Line 821...
802
 
821
 
803
DebugOut.Analog[27] = ausgleichRoll;
822
DebugOut.Analog[27] = ausgleichRoll;
804
        if(cnt > 3) cnt = 3;
823
        if(cnt > 5) cnt = 5;
805
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
824
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
806
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
825
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
-
 
826
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll);
807
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll);
827
 
808
  }
828
  }
809
    IntegralAccNick = 0;
829
    IntegralAccNick = 0;
810
    IntegralAccRoll = 0;
830
    IntegralAccRoll = 0;
811
    IntegralAccZ = 0;
831
    IntegralAccZ = 0;
812
    MittelIntegralNick = 0;
832
    MittelIntegralNick = 0;
813
    MittelIntegralRoll = 0;
833
    MittelIntegralRoll = 0;
814
    MittelIntegralNick2 = 0;
834
    MittelIntegralNick2 = 0;
815
    MittelIntegralRoll2 = 0;
835
    MittelIntegralRoll2 = 0;
816
    ZaehlMessungen = 0;
836
    ZaehlMessungen = 0;
-
 
837
 }
Line 817... Line 838...
817
 }
838
//DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor);
818
 
839
 
819
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
840
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
820
//  Gieren
841
//  Gieren
Line 906... Line 927...
906
    if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor;
927
    if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor;
907
    else             MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor;
928
    else             MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor;
908
//    MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor;
929
//    MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor;
909
    MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2;
930
    MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2;
Line -... Line 931...
-
 
931
 
-
 
932
DebugOut.Analog[28] = MesswertRoll;
-
 
933
DebugOut.Analog[25] = IntegralRoll * IntegralFaktor;
-
 
934
DebugOut.Analog[31] = StickRoll;// / (26*IntegralFaktor);
910
 
935
 
911
    // Maximalwerte abfangen
936
    // Maximalwerte abfangen
912
    #define MAX_SENSOR  2048
937
    #define MAX_SENSOR  2048
913
    if(MesswertNick >  MAX_SENSOR) MesswertNick =  MAX_SENSOR;
938
    if(MesswertNick >  MAX_SENSOR) MesswertNick =  MAX_SENSOR;
914
    if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR;
939
    if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR;
Line 981... Line 1006...
981
    if(GasMischanteil < 20) GierMischanteil = 0;
1006
    if(GasMischanteil < 20) GierMischanteil = 0;
982
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1007
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
983
// Nick-Achse
1008
// Nick-Achse
984
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1009
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
985
    DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick));    // Differenz bestimmen
1010
    DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick));    // Differenz bestimmen
-
 
1011
    if(IntegralRoll) SummeNick += IntegralNick * IntegralFaktor - StickNick;
986
    SummeNick += DiffNick;                                   // I-Anteil
1012
    else  SummeNick += DiffNick;                                   // I-Anteil
987
    if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1;
1013
    if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1;
988
    if(SummeNick >  16000) SummeNick =  16000;
1014
    if(SummeNick >  16000) SummeNick =  16000;
989
    if(SummeNick < -16000) SummeNick = -16000;
1015
    if(SummeNick < -16000) SummeNick = -16000;
990
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
1016
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
991
    // Motor Vorn
1017
    // Motor Vorn
Line 1006... Line 1032...
1006
        Motor_Hinten = motorwert;              
1032
        Motor_Hinten = motorwert;              
1007
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1033
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1008
// Roll-Achse
1034
// Roll-Achse
1009
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1035
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1010
        DiffRoll = Kp * (MesswertRoll - (StickRoll  - GPS_Roll));       // Differenz bestimmen
1036
        DiffRoll = Kp * (MesswertRoll - (StickRoll  - GPS_Roll));       // Differenz bestimmen
-
 
1037
    if(IntegralRoll) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;
1011
        SummeRoll += DiffRoll;                                                              // I-Anteil
1038
    else                 SummeRoll += DiffRoll;                                                             // I-Anteil
1012
    if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1;
1039
    if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1;
1013
    if(SummeRoll >  16000) SummeRoll =  16000;
1040
    if(SummeRoll >  16000) SummeRoll =  16000;
1014
    if(SummeRoll < -16000) SummeRoll = -16000;
1041
    if(SummeRoll < -16000) SummeRoll = -16000;
1015
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1042
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1016
    if(pd_ergebnis >  MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis =  MUL * (GasMischanteil + abs(GierMischanteil));
1043
    if(pd_ergebnis >  MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis =  MUL * (GasMischanteil + abs(GierMischanteil));