Rev 978 | Rev 993 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 978 | Rev 992 | ||
---|---|---|---|
Line 211... | Line 211... | ||
211 | ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
211 | ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
212 | GierGyroFehler = 0; |
212 | GierGyroFehler = 0; |
213 | SendVersionToNavi = 1; |
213 | SendVersionToNavi = 1; |
214 | LED_Init(); |
214 | LED_Init(); |
215 | MikroKopterFlags |= FLAG_CALIBRATE; |
215 | MikroKopterFlags |= FLAG_CALIBRATE; |
- | 216 | FromNaviCtrl_Value.Kalman_K = -1; |
|
- | 217 | FromNaviCtrl_Value.Kalman_MaxDrift = EE_Parameter.Driftkomp * 16; |
|
- | 218 | FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
|
216 | } |
219 | } |
Line 217... | Line 220... | ||
217 | 220 | ||
218 | //############################################################################ |
221 | //############################################################################ |
219 | // Bearbeitet die Messwerte |
222 | // Bearbeitet die Messwerte |
Line 809... | Line 812... | ||
809 | 812 | ||
810 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
813 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
811 | if(!Looping_Nick && !Looping_Roll) |
814 | if(!Looping_Nick && !Looping_Roll) |
812 | { |
815 | { |
- | 816 | long tmp_long, tmp_long2; |
|
- | 817 | if(FromNaviCtrl_Value.Kalman_K != -1) |
|
813 | long tmp_long, tmp_long2; |
818 | { |
- | 819 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
|
- | 820 | tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
|
- | 821 | tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
|
- | 822 | tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
|
- | 823 | if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
|
- | 824 | { |
|
- | 825 | tmp_long /= 2; |
|
- | 826 | tmp_long2 /= 2; |
|
- | 827 | } |
|
- | 828 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
|
- | 829 | { |
|
- | 830 | tmp_long /= 3; |
|
- | 831 | tmp_long2 /= 3; |
|
- | 832 | } |
|
- | 833 | if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
|
- | 834 | if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
|
- | 835 | if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
|
- | 836 | if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
|
- | 837 | } |
|
- | 838 | else |
|
- | 839 | { |
|
814 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
840 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
815 | tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
841 | tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
816 | tmp_long /= 16; |
842 | tmp_long /= 16; |
817 | tmp_long2 /= 16; |
843 | tmp_long2 /= 16; |
818 | if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
844 | if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
819 | { |
845 | { |
820 | tmp_long /= 3; |
846 | tmp_long /= 3; |
821 | tmp_long2 /= 3; |
847 | tmp_long2 /= 3; |
822 | } |
848 | } |
823 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
849 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
824 | { |
850 | { |
825 | tmp_long /= 3; |
851 | tmp_long /= 3; |
826 | tmp_long2 /= 3; |
852 | tmp_long2 /= 3; |
827 | } |
- | |
828 | 853 | } |
|
829 | #define AUSGLEICH 32 |
854 | #define AUSGLEICH 32 |
830 | if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
855 | if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
831 | if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
856 | if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
832 | if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
857 | if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
- | 858 | if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
|
833 | if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
859 | } |
834 | 860 | ||
835 | Mess_IntegralNick -= tmp_long; |
861 | Mess_IntegralNick -= tmp_long; |
836 | Mess_IntegralRoll -= tmp_long2; |
862 | Mess_IntegralRoll -= tmp_long2; |
837 | } |
863 | } |
838 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
- | |
839 | 864 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
840 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
865 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
841 | { |
866 | { |
842 | static int cnt = 0; |
867 | static int cnt = 0; |
843 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
868 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
Line 858... | Line 883... | ||
858 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
883 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
Line 859... | Line 884... | ||
859 | 884 | ||
860 | LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
885 | LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
Line 861... | Line 886... | ||
861 | LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
886 | LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
862 | 887 | ||
863 | if((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) |
888 | if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
864 | { |
889 | { |
865 | LageKorrekturNick /= 2; |
890 | LageKorrekturNick /= 2; |
Line 906... | Line 931... | ||
906 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
931 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
907 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
932 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
908 | #define BEWEGUNGS_LIMIT 20000 |
933 | #define BEWEGUNGS_LIMIT 20000 |
909 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
934 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
910 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
935 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
911 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
936 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*16)) |
912 | { |
937 | { |
913 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
938 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
914 | { |
939 | { |
915 | if(last_n_p) |
940 | if(last_n_p) |
916 | { |
941 | { |
Line 937... | Line 962... | ||
937 | { |
962 | { |
938 | cnt = 0; |
963 | cnt = 0; |
939 | KompassSignalSchlecht = 1000; |
964 | KompassSignalSchlecht = 1000; |
940 | } |
965 | } |
941 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
966 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
- | 967 | if(cnt * 16 > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift/16; |
|
942 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
968 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
943 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
969 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
Line 944... | Line 970... | ||
944 | 970 | ||
945 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
971 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 946... | Line 972... | ||
946 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
972 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
947 | 973 | ||
948 | ausgleichRoll = 0; |
974 | ausgleichRoll = 0; |
949 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT) |
975 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*16)) |
950 | { |
976 | { |
951 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
977 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
952 | { |
978 | { |
Line 973... | Line 999... | ||
973 | } else |
999 | } else |
974 | { |
1000 | { |
975 | cnt = 0; |
1001 | cnt = 0; |
976 | KompassSignalSchlecht = 1000; |
1002 | KompassSignalSchlecht = 1000; |
977 | } |
1003 | } |
978 | - | ||
979 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
1004 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
- | 1005 | if(cnt * 16 > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift/16; |
|
980 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
1006 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
981 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
1007 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
982 | } |
1008 | } |
983 | else |
1009 | else |
984 | { |
1010 | { |
Line 1091... | Line 1117... | ||
1091 | //DebugOut.Analog[16] = Mittelwert_AccHoch; |
1117 | //DebugOut.Analog[16] = Mittelwert_AccHoch; |
1092 | DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1118 | DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1093 | DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1119 | DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1094 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1120 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1095 | DebugOut.Analog[20] = ServoValue; |
1121 | DebugOut.Analog[20] = ServoValue; |
1096 | - | ||
- | 1122 | DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
|
- | 1123 | DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
|
1097 | DebugOut.Analog[30] = GPS_Nick; |
1124 | DebugOut.Analog[30] = GPS_Nick; |
1098 | DebugOut.Analog[31] = GPS_Roll; |
1125 | DebugOut.Analog[31] = GPS_Roll; |
Line 1099... | Line 1126... | ||
1099 | 1126 |