Subversion Repositories FlightCtrl

Rev

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

Rev 395 Rev 401
Line 57... Line 57...
57
#include "eeprom.c"
57
#include "eeprom.c"
Line 58... Line 58...
58
 
58
 
59
unsigned char h,m,s;
59
unsigned char h,m,s;
60
volatile unsigned int I2CTimeout = 100;
60
volatile unsigned int I2CTimeout = 100;
61
volatile int MesswertNick,MesswertRoll,MesswertGier;
61
volatile int MesswertNick,MesswertRoll,MesswertGier;
62
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0;
62
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
63
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
63
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
64
volatile float NeutralAccZ = 0;
64
volatile float NeutralAccZ = 0;
65
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0;
65
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0;
66
volatile long IntegralNick = 0,IntegralNick2 = 0;
66
volatile long IntegralNick = 0,IntegralNick2 = 0;
Line 149... Line 149...
149
     }
149
     }
Line 150... Line 150...
150
 
150
 
151
     AdNeutralNick= AdWertNick;
151
     AdNeutralNick= AdWertNick;
152
         AdNeutralRoll= AdWertRoll;    
152
         AdNeutralRoll= AdWertRoll;    
153
         AdNeutralGier= AdWertGier;
-
 
-
 
153
         AdNeutralGier= AdWertGier;
-
 
154
     StartNeutralRoll = AdNeutralRoll;
154
 
155
     StartNeutralNick = AdNeutralNick;
155
    NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY;
156
    NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY;
156
        NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY;
157
        NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY;
Line 157... Line 158...
157
        NeutralAccZ = Aktuell_az;
158
        NeutralAccZ = Aktuell_az;
Line 181... Line 182...
181
{      
182
{      
182
    static signed long tmpl,tmpl2;     
183
    static signed long tmpl,tmpl2;     
183
    MesswertGier = (signed int) AdNeutralGier - AdWertGier;
184
    MesswertGier = (signed int) AdNeutralGier - AdWertGier;
184
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
185
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
185
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
186
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
186
    if(PlatinenVersion != 10)
-
 
187
     {
-
 
188
      MesswertGier *= 2;
-
 
189
          MesswertRoll *= 2;
-
 
190
      MesswertNick *= 2;
-
 
191
     }
187
 
192
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
188
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
193
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
189
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
194
        Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L;
190
        Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L;
195
        Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L;
191
        Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L;
196
    IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;
192
    IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;
Line 227... Line 223...
227
             Mess_IntegralRoll =  (Umschlag180Roll - 10000L);
223
             Mess_IntegralRoll =  (Umschlag180Roll - 10000L);
228
             Mess_IntegralRoll2 = Mess_IntegralRoll;
224
             Mess_IntegralRoll2 = Mess_IntegralRoll;
229
            }  
225
            }  
230
            if(AdWertRoll < 15)   MesswertRoll = -1000;
226
            if(AdWertRoll < 15)   MesswertRoll = -1000;
231
            if(AdWertRoll <  7)   MesswertRoll = -2000;
227
            if(AdWertRoll <  7)   MesswertRoll = -2000;
-
 
228
            if(PlatinenVersion == 10)
-
 
229
                         {
232
            if(AdWertRoll > 1010) MesswertRoll = +1000;
230
              if(AdWertRoll > 1010) MesswertRoll = +1000;
233
            if(AdWertRoll > 1017) MesswertRoll = +2000;
231
              if(AdWertRoll > 1017) MesswertRoll = +2000;
-
 
232
                         }
-
 
233
                         else
-
 
234
                         {
-
 
235
              if(AdWertRoll > 2020) MesswertRoll = +1000;
-
 
236
              if(AdWertRoll > 2034) MesswertRoll = +2000;
-
 
237
                         }
234
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
238
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
235
            MesswertNick -= tmpl2;
239
            MesswertNick -= tmpl2;
236
            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L;
240
            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L;
237
            Mess_IntegralNick2 += MesswertNick;
241
            Mess_IntegralNick2 += MesswertNick;
238
            Mess_IntegralNick  += MesswertNick - I_LageNick;
242
            Mess_IntegralNick  += MesswertNick - I_LageNick;
Line 246... Line 250...
246
             Mess_IntegralNick =  (Umschlag180Nick - 10000L);
250
             Mess_IntegralNick =  (Umschlag180Nick - 10000L);
247
             Mess_IntegralNick2 = Mess_IntegralNick;
251
             Mess_IntegralNick2 = Mess_IntegralNick;
248
            }
252
            }
249
            if(AdWertNick < 15)   MesswertNick = -1000;
253
            if(AdWertNick < 15)   MesswertNick = -1000;
250
            if(AdWertNick <  7)   MesswertNick = -2000;
254
            if(AdWertNick <  7)   MesswertNick = -2000;
-
 
255
            if(PlatinenVersion == 10)
-
 
256
                         {
251
            if(AdWertNick > 1010) MesswertNick = +1000;
257
              if(AdWertNick > 1010) MesswertNick = +1000;
252
            if(AdWertNick > 1017) MesswertNick = +2000;
258
              if(AdWertNick > 1017) MesswertNick = +2000;
-
 
259
                         }
-
 
260
                         else
-
 
261
                         {
-
 
262
              if(AdWertNick > 2020) MesswertNick = +1000;
-
 
263
              if(AdWertNick > 2034) MesswertNick = +2000;
-
 
264
                         }
253
//++++++++++++++++++++++++++++++++++++++++++++++++
265
//++++++++++++++++++++++++++++++++++++++++++++++++
254
// ADC einschalten
266
// ADC einschalten
255
    ANALOG_ON; 
267
    ANALOG_ON; 
256
//++++++++++++++++++++++++++++++++++++++++++++++++
268
//++++++++++++++++++++++++++++++++++++++++++++++++
-
 
269
DebugOut.Analog[11] = MesswertRoll;
Line 257... Line 270...
257
 
270
 
258
    Integral_Gier  = Mess_Integral_Gier;
271
    Integral_Gier  = Mess_Integral_Gier;
259
    IntegralNick = Mess_IntegralNick;
272
    IntegralNick = Mess_IntegralNick;
260
    IntegralRoll = Mess_IntegralRoll;
273
    IntegralRoll = Mess_IntegralRoll;
Line 663... Line 676...
663
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
676
    MittelIntegralNick  /= ABGLEICH_ANZAHL;
664
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
677
    MittelIntegralRoll  /= ABGLEICH_ANZAHL;
665
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
678
        IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL;
666
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
679
        IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL;
667
    IntegralAccZ    = IntegralAccZ / ABGLEICH_ANZAHL;
680
    IntegralAccZ    = IntegralAccZ / ABGLEICH_ANZAHL;
668
 
-
 
669
//DebugOut.Analog[6] = labs(MittelIntegralNick_Alt - MittelIntegralNick) / 10;
681
#define MAX_I 32
670
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++
682
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++
671
    IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick);
683
    IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick);
672
    ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
684
    ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
673
    if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000)
685
    if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000)
674
     {
686
     {
675
       tmp_long = IntegralFehlerNick / 700L;
687
       tmp_long = IntegralFehlerNick / 700L;
676
       if(tmp_long > 40) tmp_long = 40;
688
       if(tmp_long > MAX_I) tmp_long = MAX_I;
677
       if(tmp_long <-40) tmp_long =-40;
689
       if(tmp_long <-MAX_I) tmp_long =-MAX_I;
678
       I_LageNick = tmp_long;    
690
       I_LageNick = tmp_long;    
679
     }
691
     }
680
     else
692
     else
681
     {
693
     {
682
      I_LageNick /= 2;
694
      I_LageNick /= 2;
Line 685... Line 697...
685
    IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll);
697
    IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll);
686
    ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich;
698
    ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich;
687
    if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000)
699
    if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000)
688
     {
700
     {
689
      tmp_long2 = IntegralFehlerRoll / 700L;
701
      tmp_long2 = IntegralFehlerRoll / 700L;
690
      if(tmp_long2 > 40) tmp_long2 = 40;
702
      if(tmp_long2 > MAX_I) tmp_long2 = MAX_I;
691
      if(tmp_long2 <-40) tmp_long2 =-40;
703
      if(tmp_long2 <-MAX_I) tmp_long2 =-MAX_I;
692
      I_LageRoll = tmp_long2;    
704
      I_LageRoll = tmp_long2;    
693
     }
705
     }
694
     else
706
     else
695
     {
707
     {
696
      I_LageRoll /=2;
708
      I_LageRoll /=2;
Line 714... Line 726...
714
    IntegralFehlerNick = tmp_long;
726
    IntegralFehlerNick = tmp_long;
715
    IntegralFehlerRoll = tmp_long2;
727
    IntegralFehlerRoll = tmp_long2;
716
    Mess_IntegralNick2 -= IntegralFehlerNick;
728
    Mess_IntegralNick2 -= IntegralFehlerNick;
717
    Mess_IntegralRoll2 -= IntegralFehlerRoll;
729
    Mess_IntegralRoll2 -= IntegralFehlerRoll;
Line 718... Line -...
718
 
-
 
719
    if(PlatinenVersion != 10)
-
 
720
    {
-
 
721
     tmp_long /= 2;
-
 
722
     tmp_long2 /= 2;
-
 
723
    }
-
 
724
 
730
 
725
//    IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2;
731
//    IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2;
Line 726... Line 732...
726
//    IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2;
732
//    IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2;
727
 
733
 
728
 
734
 
729
DebugOut.Analog[30] = I_LageRoll;
735
DebugOut.Analog[30] = I_LageRoll * 10;
730
DebugOut.Analog[17] = IntegralAccNick / 26;
736
DebugOut.Analog[17] = IntegralAccNick / 26;
731
DebugOut.Analog[18] = IntegralAccRoll / 26;
737
DebugOut.Analog[18] = IntegralAccRoll / 26;
732
DebugOut.Analog[19] = IntegralFehlerNick;// / 26;
738
DebugOut.Analog[19] = IntegralFehlerNick;// / 26;
733
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26;
739
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26;
734
DebugOut.Analog[21] = MittelIntegralNick / 26;
740
DebugOut.Analog[21] = MittelIntegralNick / 26;
Line 735... Line 741...
735
DebugOut.Analog[22] = MittelIntegralRoll / 26;
741
DebugOut.Analog[22] = MittelIntegralRoll / 26;
736
DebugOut.Analog[28] = ausgleichNick;
742
DebugOut.Analog[28] = ausgleichNick;
Line 737... Line 743...
737
DebugOut.Analog[29] = ausgleichRoll;
743
DebugOut.Analog[29] = ausgleichRoll;
738
 
744
 
739
#define FEHLER_LIMIT  (ABGLEICH_ANZAHL/2)
745
#define FEHLER_LIMIT  (ABGLEICH_ANZAHL/2)
740
#define FEHLER_LIMIT2  4096
746
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL*4)
741
 
747
 
742
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++
748
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++
743
        cnt = 1;// + labs(IntegralFehlerNick) / 4096;
749
        cnt = 1;// + labs(IntegralFehlerNick) / 4096;
744
        if(IntegralFehlerNick >  FEHLER_LIMIT2)
750
        if(IntegralFehlerNick >  FEHLER_LIMIT2)
745
         {
751
         {
746
           if(last_n_p)
752
           if(last_n_p)
747
           {
753
           {
748
            cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
754
            cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
749
            ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
755
            ausgleichNick = IntegralFehlerNick / 4;
750
            if(ausgleichNick > 10000) ausgleichNick = 10000;
756
            if(ausgleichNick > 5000) ausgleichNick = 5000;
751
            Mess_IntegralNick += ausgleichNick;
757
            Mess_IntegralNick -= ausgleichNick;
752
           }
758
           }
753
           else last_n_p = 1;
759
           else last_n_p = 1;
754
         } else  last_n_p = 0;
760
         } else  last_n_p = 0;
755
        if(IntegralFehlerNick < -FEHLER_LIMIT2)
761
        if(IntegralFehlerNick < -FEHLER_LIMIT2)
756
         {
762
         {
757
           if(last_n_n)
763
           if(last_n_n)
758
            {
764
            {
759
             cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
765
             cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2;
760
             ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich;
766
             ausgleichNick = IntegralFehlerNick / 4;
Line 761... Line 767...
761
             if(ausgleichNick < -10000) ausgleichNick = -10000;
767
             if(ausgleichNick < -5000) ausgleichNick = -5000;
762
             Mess_IntegralNick += ausgleichNick;
768
             Mess_IntegralNick -= ausgleichNick;
763
            }
769
            }
764
           else last_n_n = 1;
-
 
765
         } else  last_n_n = 0;
-
 
-
 
770
           else last_n_n = 1;
766
 
771
         } else  last_n_n = 0;
767
        if(cnt > 2) cnt = 2;
772
 
-
 
773
        if(cnt > 3) cnt = 3;
768
        if(IntegralFehlerNick >  FEHLER_LIMIT)   AdNeutralNick += cnt;
774
        if(IntegralFehlerNick >  FEHLER_LIMIT)   AdNeutralNick += cnt;
769
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
775
        if(IntegralFehlerNick < -FEHLER_LIMIT)   AdNeutralNick -= cnt;
770
//        if(IntegralFehlerNick >  FEHLER_LIMIT)  { AdNeutralNick += (cnt + last_n_p/20);  if(last_n_p++ == 4) {last_n_p = 4;}} else last_n_p = 0;
776
 
771
//        if(IntegralFehlerNick < -FEHLER_LIMIT)  { AdNeutralNick -= (cnt + last_n_n/20);  if(last_n_n++ == 4) {last_n_n = 4;}} else last_n_n = 0;
777
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++
772
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++
778
        cnt = 1;// + labs(IntegralFehlerRoll) / 4096;
773
        cnt = 1;// + labs(IntegralFehlerRoll) / 4096;
779
ausgleichRoll = 0;
774
        if(IntegralFehlerRoll >  FEHLER_LIMIT2)
780
        if(IntegralFehlerRoll >  FEHLER_LIMIT2)
775
         {
781
         {
776
           if(last_r_p)
782
           if(last_r_p)
777
           {
783
           {
778
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
784
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
779
            ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich;
785
            ausgleichRoll = IntegralFehlerRoll / 4;
780
            if(ausgleichRoll > 10000) ausgleichRoll = 10000;
786
            if(ausgleichRoll > 5000) ausgleichRoll = 5000;
781
            Mess_IntegralRoll += ausgleichRoll;
787
            Mess_IntegralRoll -= ausgleichRoll;
782
           }
788
           }
783
           else last_r_p = 1;
789
           else last_r_p = 1;
784
         } else  last_r_p = 0;
790
         } else  last_r_p = 0;
785
        if(IntegralFehlerRoll < -FEHLER_LIMIT2)
791
        if(IntegralFehlerRoll < -FEHLER_LIMIT2)
786
         {
792
         {
787
           if(last_r_n)
793
           if(last_r_n)
788
           {
794
           {
789
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
795
            cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2;
Line -... Line 796...
-
 
796
            ausgleichRoll = IntegralFehlerRoll / 4;
-
 
797
            if(ausgleichRoll < -5000) ausgleichRoll = -5000;
790
            ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich;
798
            Mess_IntegralRoll -= ausgleichRoll;
791
            if(ausgleichRoll < -10000) ausgleichRoll = -10000;
799
           }
792
            Mess_IntegralRoll += ausgleichRoll;
-
 
793
           }
-
 
794
           else last_r_n = 1;
-
 
795
         } else  last_r_n = 0;
-
 
796
 
-
 
797
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;
-
 
798
        if(IntegralFehlerRoll < -FEHLER_LIMIT)   AdNeutralRoll -= cnt;
-
 
799
        if(cnt > 2) cnt = 2;
800
           else last_r_n = 1;
800
//        if(IntegralFehlerRoll >  FEHLER_LIMIT)  { AdNeutralRoll += (cnt + last_r_p/20);  if(last_r_p++ == 4) {beeptime =500;last_r_p = 4;}} else last_r_p = 0;
801
         } else  last_r_n = 0;
801
//        if(IntegralFehlerRoll < -FEHLER_LIMIT)  { AdNeutralRoll -= (cnt + last_r_n/20);  if(last_r_n++ == 4) {beeptime = 60;last_r_n = 4;}} else last_r_n = 0;
802
 
802
 
803
DebugOut.Analog[27] = ausgleichRoll;
803
//        if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR)  AdNeutralGier--;   // macht nur mit Referenz (Kompass Sinn)      
804
        if(cnt > 3) cnt = 3;
804
//        if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR)  AdNeutralGier++;   // macht nur mit Referenz (Kompass Sinn)      
805
        if(IntegralFehlerRoll >  FEHLER_LIMIT)   AdNeutralRoll += cnt;