Subversion Repositories FlightCtrl

Rev

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

Rev 492 Rev 498
Line 88... Line 88...
88
volatile unsigned char SenderOkay = 0;
88
volatile unsigned char SenderOkay = 0;
89
int StickNick = 0,StickRoll = 0,StickGier = 0;
89
int StickNick = 0,StickRoll = 0,StickGier = 0;
90
char MotorenEin = 0;
90
char MotorenEin = 0;
91
int HoehenWert = 0;
91
int HoehenWert = 0;
92
int SollHoehe = 0;
92
int SollHoehe = 0;
93
int I_LageRoll = 0,I_LageNick = 0;
93
int LageKorrekturRoll = 0,LageKorrekturNick = 0;
94
float Kp =  FAKTOR_P;
94
float Kp =  FAKTOR_P;
95
float Ki =  FAKTOR_I;
95
float Ki =  FAKTOR_I;
96
unsigned char Looping_Nick = 0,Looping_Roll = 0;
96
unsigned char Looping_Nick = 0,Looping_Roll = 0;
97
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
97
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0;
Line 210... Line 210...
210
      else  tmpl = tmpl2 = 0;
210
      else  tmpl = tmpl2 = 0;
211
// Roll  ++++++++++++++++++++++++++++++++++++++++++++++++
211
// Roll  ++++++++++++++++++++++++++++++++++++++++++++++++
212
            MesswertRoll += tmpl;
212
            MesswertRoll += tmpl;
213
            MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109
213
            MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109
214
            Mess_IntegralRoll2 += MesswertRoll;
214
            Mess_IntegralRoll2 += MesswertRoll;
215
            Mess_IntegralRoll +=  MesswertRoll - I_LageRoll;
215
            Mess_IntegralRoll +=  MesswertRoll - LageKorrekturRoll;
216
            if(Mess_IntegralRoll > Umschlag180Roll)
216
            if(Mess_IntegralRoll > Umschlag180Roll)
217
            {
217
            {
218
             Mess_IntegralRoll  = -(Umschlag180Roll - 10000L);
218
             Mess_IntegralRoll  = -(Umschlag180Roll - 10000L);
219
             Mess_IntegralRoll2 = Mess_IntegralRoll;
219
             Mess_IntegralRoll2 = Mess_IntegralRoll;
220
            }
220
            }
Line 237... Line 237...
237
                         }
237
                         }
238
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
238
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
239
            MesswertNick -= tmpl2;
239
            MesswertNick -= tmpl2;
240
            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L;
240
            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L;
241
            Mess_IntegralNick2 += MesswertNick;
241
            Mess_IntegralNick2 += MesswertNick;
242
            Mess_IntegralNick  += MesswertNick - I_LageNick;
242
            Mess_IntegralNick  += MesswertNick - LageKorrekturNick;
243
            if(Mess_IntegralNick > Umschlag180Nick)
243
            if(Mess_IntegralNick > Umschlag180Nick)
244
            {
244
            {
245
             Mess_IntegralNick = -(Umschlag180Nick - 10000L);
245
             Mess_IntegralNick = -(Umschlag180Nick - 10000L);
246
             Mess_IntegralNick2 = Mess_IntegralNick;
246
             Mess_IntegralNick2 = Mess_IntegralNick;
247
            }
247
            }
Line 680... Line 680...
680
    MittelIntegralNick2 = 0;
680
    MittelIntegralNick2 = 0;
681
    MittelIntegralRoll2 = 0;
681
    MittelIntegralRoll2 = 0;
682
    Mess_IntegralNick2 = Mess_IntegralNick;
682
    Mess_IntegralNick2 = Mess_IntegralNick;
683
    Mess_IntegralRoll2 = Mess_IntegralRoll;
683
    Mess_IntegralRoll2 = Mess_IntegralRoll;
684
    ZaehlMessungen = 0;
684
    ZaehlMessungen = 0;
685
    I_LageNick = 0;
685
    LageKorrekturNick = 0;
686
    I_LageRoll = 0;
686
    LageKorrekturRoll = 0;
687
  }
687
  }
Line 688... Line 688...
688
 
688
 
689
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
689
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
690
  if(IntegralFaktor && !Looping_Nick && !Looping_Roll)
690
  if(!Looping_Nick && !Looping_Roll)
691
  {
691
  {
692
   long tmp_long, tmp_long2;
692
   long tmp_long, tmp_long2;
693
    tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
693
    tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
694
    tmp_long /= 16;
694
    tmp_long /= 16;
Line 718... Line 718...
718
    IntegralAccZ    = IntegralAccZ / ABGLEICH_ANZAHL;
718
    IntegralAccZ    = IntegralAccZ / ABGLEICH_ANZAHL;
719
#define MAX_I 0//(Poti2/10)
719
#define MAX_I 0//(Poti2/10)
720
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++
720
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++
721
    IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick);
721
    IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick);
722
    ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
722
    ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
723
/*    if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000)
-
 
724
     {
-
 
725
       tmp_long = IntegralFehlerNick / 256L;
723
    LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL;
726
       if(tmp_long > MAX_I) tmp_long = MAX_I;
-
 
727
       if(tmp_long <-MAX_I) tmp_long =-MAX_I;
-
 
728
       I_LageNick = tmp_long;    
-
 
729
     }
-
 
730
     else
-
 
731
     {
-
 
732
      I_LageNick /= 2;
-
 
733
     }
-
 
734
*/
-
 
735
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++     
724
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++     
736
    IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll);
725
    IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll);
737
    ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich;
726
    ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich;
738
/*    if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000)
-
 
739
     {
-
 
740
      tmp_long2 = IntegralFehlerRoll / 256L;
727
    LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL;
741
      if(tmp_long2 > MAX_I) tmp_long2 = MAX_I;
-
 
742
      if(tmp_long2 <-MAX_I) tmp_long2 =-MAX_I;
-
 
743
      I_LageRoll = tmp_long2;    
-
 
744
     }
-
 
745
     else
-
 
746
     {
-
 
747
      I_LageRoll /=2;
-
 
748
     }
-
 
749
*/
728
 
750
    Mess_IntegralNick -= ausgleichNick;
729
//    Mess_IntegralNick -= ausgleichNick;
751
    Mess_IntegralRoll -= ausgleichRoll;
730
//    Mess_IntegralRoll -= ausgleichRoll;
Line 752... Line 731...
752
 
731
 
753
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
732
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
754
// Gyro-Drift ermitteln
733
// Gyro-Drift ermitteln
755
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
734
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
Line 776... Line 755...
776
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26;
755
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26;
777
DebugOut.Analog[21] = MittelIntegralNick / 26;
756
DebugOut.Analog[21] = MittelIntegralNick / 26;
778
DebugOut.Analog[22] = MittelIntegralRoll / 26;
757
DebugOut.Analog[22] = MittelIntegralRoll / 26;
779
//DebugOut.Analog[28] = ausgleichNick;
758
//DebugOut.Analog[28] = ausgleichNick;
780
DebugOut.Analog[29] = ausgleichRoll;
759
DebugOut.Analog[29] = ausgleichRoll;
781
DebugOut.Analog[30] = I_LageRoll * 10;
760
DebugOut.Analog[30] = LageKorrekturRoll * 10;
Line 782... Line 761...
782
 
761
 
783
#define FEHLER_LIMIT  (ABGLEICH_ANZAHL * 4)
762
#define FEHLER_LIMIT  (ABGLEICH_ANZAHL * 4)
784
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16)
763
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16)
785
#define BEWEGUNGS_LIMIT 20000
764
#define BEWEGUNGS_LIMIT 20000
Line 792... Line 771...
792
           if(last_n_p)
771
           if(last_n_p)
793
           {
772
           {
794
            cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
773
            cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
795
            ausgleichNick = IntegralFehlerNick / 8;
774
            ausgleichNick = IntegralFehlerNick / 8;
796
            if(ausgleichNick > 5000) ausgleichNick = 5000;
775
            if(ausgleichNick > 5000) ausgleichNick = 5000;
-
 
776
            LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL;
797
            Mess_IntegralNick -= ausgleichNick;
777
//            Mess_IntegralNick -= ausgleichNick;
798
           }
778
           }
799
           else last_n_p = 1;
779
           else last_n_p = 1;
800
         } else  last_n_p = 0;
780
         } else  last_n_p = 0;
801
        if(IntegralFehlerNick < -FEHLER_LIMIT2)
781
        if(IntegralFehlerNick < -FEHLER_LIMIT2)
802
         {
782
         {
803
           if(last_n_n)
783
           if(last_n_n)
804
            {
784
            {
805
             cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
785
             cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
806
             ausgleichNick = IntegralFehlerNick / 8;
786
             ausgleichNick = IntegralFehlerNick / 8;
807
             if(ausgleichNick < -5000) ausgleichNick = -5000;
787
             if(ausgleichNick < -5000) ausgleichNick = -5000;
-
 
788
             LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL;
808
             Mess_IntegralNick -= ausgleichNick;
789
//             Mess_IntegralNick -= ausgleichNick;
809
            }
790
            }
810
           else last_n_n = 1;
791
           else last_n_n = 1;
811
         } else  last_n_n = 0;
792
         } else  last_n_n = 0;
812
        } else cnt = 0;
793
        } else cnt = 0;
813
        if(cnt > 4) cnt = 4;
794
        if(cnt > 4) cnt = 4;
Line 816... Line 797...
816
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
797
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
Line 817... Line 798...
817
 
798
 
818
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++
799
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++
Line 819... Line 800...
819
        cnt = 1;// + labs(IntegralFehlerNick) / 4096;
800
        cnt = 1;// + labs(IntegralFehlerNick) / 4096;
820
 
801
 
821
ausgleichRoll = 0;
802
        ausgleichRoll = 0;
822
        if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT)
803
        if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT)
823
        {
804
        {
824
        if(IntegralFehlerRoll >  FEHLER_LIMIT2)
805
        if(IntegralFehlerRoll >  FEHLER_LIMIT2)
825
         {
806
         {
826
           if(last_r_p)
807
           if(last_r_p)
827
           {
808
           {
828
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
809
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
829
            ausgleichRoll = IntegralFehlerRoll / 8;
810
            ausgleichRoll = IntegralFehlerRoll / 8;
830
            if(ausgleichRoll > 5000) ausgleichRoll = 5000;
811
            if(ausgleichRoll > 5000) ausgleichRoll = 5000;
831
            Mess_IntegralRoll -= ausgleichRoll;
812
            LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL;
832
//            beeptime = 50;
813
//            Mess_IntegralRoll -= ausgleichRoll;
833
           }
814
           }
834
           else last_r_p = 1;
815
           else last_r_p = 1;
835
         } else  last_r_p = 0;
816
         } else  last_r_p = 0;
836
        if(IntegralFehlerRoll < -FEHLER_LIMIT2)
817
        if(IntegralFehlerRoll < -FEHLER_LIMIT2)
837
         {
818
         {
838
           if(last_r_n)
819
           if(last_r_n)
839
           {
820
           {
840
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
821
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
841
            ausgleichRoll = IntegralFehlerRoll / 8;
822
            ausgleichRoll = IntegralFehlerRoll / 8;
842
            if(ausgleichRoll < -5000) ausgleichRoll = -5000;
823
            if(ausgleichRoll < -5000) ausgleichRoll = -5000;
843
            Mess_IntegralRoll -= ausgleichRoll;
824
//            Mess_IntegralRoll -= ausgleichRoll;
844
//            beeptime = 50;
825
            LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL;
845
           }
826
           }
846
           else last_r_n = 1;
827
           else last_r_n = 1;
847
         } else  last_r_n = 0;
828
         } else  last_r_n = 0;
848
        } else
-
 
849
        {
829
        } else
850
         beeptime = 50;
830
        {
851
         cnt = 0;
831
         cnt = 0;
852
        }
832
        }
853
DebugOut.Analog[27] = ausgleichRoll;
833
DebugOut.Analog[27] = ausgleichRoll;
854
        if(cnt > 4) cnt = 4;
-
 
-
 
834
        if(cnt > 4) cnt = 4;
855
//        if(cnt > Poti2 / 40) cnt =  Poti2 / 40;
835
//        if(cnt > Poti2 / 40) cnt =  Poti2 / 40;
856
 
836
//if(cnt > 1) beeptime = 50;
857
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
837
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
858
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
838
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
859
DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick);
-
 
860
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll);
839
DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick);
-
 
840
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll);
-
 
841
  }
-
 
842
  else
-
 
843
  {
-
 
844
   LageKorrekturRoll = 0;
-
 
845
   LageKorrekturNick = 0;
861
 
846
  }
862
  }
847
  if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH
863
// +++++++++++++++++++++++++++++++++++++++++++++++++++++     
848
// +++++++++++++++++++++++++++++++++++++++++++++++++++++     
864
   MittelIntegralNick_Alt = MittelIntegralNick;      
849
   MittelIntegralNick_Alt = MittelIntegralNick;      
865
   MittelIntegralRoll_Alt = MittelIntegralRoll;      
850
   MittelIntegralRoll_Alt = MittelIntegralRoll;      
Line 1044... Line 1029...
1044
    if(GasMischanteil < 20) GierMischanteil = 0;
1029
    if(GasMischanteil < 20) GierMischanteil = 0;
1045
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1030
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1046
// Nick-Achse
1031
// Nick-Achse
1047
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1032
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1048
    DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick));    // Differenz bestimmen
1033
    DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick));    // Differenz bestimmen
1049
    if(IntegralRoll) SummeNick += IntegralNick * IntegralFaktor - StickNick;
1034
    if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - (StickNick - GPS_Nick); // I-Anteil bei Winkelregelung
1050
    else  SummeNick += DiffNick;                                   // I-Anteil
1035
    else  SummeNick += DiffNick; // I-Anteil bei HH 
1051
    if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1;
1036
    if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1;
1052
    if(SummeNick >  16000) SummeNick =  16000;
1037
    if(SummeNick >  16000) SummeNick =  16000;
1053
    if(SummeNick < -16000) SummeNick = -16000;
1038
    if(SummeNick < -16000) SummeNick = -16000;
1054
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
1039
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
1055
    // Motor Vorn
1040
    // Motor Vorn
Line 1070... Line 1055...
1070
        Motor_Hinten = motorwert;              
1055
        Motor_Hinten = motorwert;              
1071
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1056
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1072
// Roll-Achse
1057
// Roll-Achse
1073
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1058
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1074
        DiffRoll = Kp * (MesswertRoll - (StickRoll  - GPS_Roll));       // Differenz bestimmen
1059
        DiffRoll = Kp * (MesswertRoll - (StickRoll  - GPS_Roll));       // Differenz bestimmen
1075
    if(IntegralRoll) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;
1060
    if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - (StickRoll  - GPS_Roll);// I-Anteil bei Winkelregelung
1076
    else                 SummeRoll += DiffRoll;                                                             // I-Anteil
1061
    else                 SummeRoll += DiffRoll;  // I-Anteil bei HH
1077
    if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1;
1062
    if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1;
1078
    if(SummeRoll >  16000) SummeRoll =  16000;
1063
    if(SummeRoll >  16000) SummeRoll =  16000;
1079
    if(SummeRoll < -16000) SummeRoll = -16000;
1064
    if(SummeRoll < -16000) SummeRoll = -16000;
1080
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1065
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1081
    if(pd_ergebnis >  MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis =  MUL * (GasMischanteil + abs(GierMischanteil));
1066
    if(pd_ergebnis >  MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis =  MUL * (GasMischanteil + abs(GierMischanteil));