Rev 1172 | Rev 1174 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1172 | Rev 1173 | ||
---|---|---|---|
Line 202... | Line 202... | ||
202 | Delay_ms_Mess(10); |
202 | Delay_ms_Mess(10); |
203 | gier_neutral += AdWertGier; |
203 | gier_neutral += AdWertGier; |
204 | nick_neutral += AdWertNick; |
204 | nick_neutral += AdWertNick; |
205 | roll_neutral += AdWertRoll; |
205 | roll_neutral += AdWertRoll; |
206 | } |
206 | } |
207 | AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / NEUTRAL_FILTER; |
207 | AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
208 | AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / NEUTRAL_FILTER; |
208 | AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
209 | AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / NEUTRAL_FILTER; |
209 | AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
210 | AdNeutralGierBias = AdNeutralGier; |
210 | AdNeutralGierBias = AdNeutralGier; |
211 | StartNeutralRoll = AdNeutralRoll; |
211 | StartNeutralRoll = AdNeutralRoll; |
212 | StartNeutralNick = AdNeutralNick; |
212 | StartNeutralNick = AdNeutralNick; |
213 | if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
213 | if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
214 | { |
214 | { |
Line 221... | Line 221... | ||
221 | NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
221 | NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
222 | NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
222 | NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
223 | NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
223 | NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
224 | } |
224 | } |
Line 225... | Line -... | ||
225 | - | ||
226 | Mess_IntegralNick = 0; |
- | |
227 | Mess_IntegralNick2 = 0; |
- | |
228 | Mess_IntegralRoll = 0; |
- | |
229 | Mess_IntegralRoll2 = 0; |
- | |
230 | Mess_Integral_Gier = 0; |
225 | |
231 | MesswertNick = 0; |
226 | MesswertNick = 0; |
232 | MesswertRoll = 0; |
227 | MesswertRoll = 0; |
233 | MesswertGier = 0; |
228 | MesswertGier = 0; |
- | 229 | Delay_ms_Mess(100); |
|
- | 230 | Mittelwert_AccNick = AdWertAccNick; |
|
- | 231 | Mittelwert_AccRoll = AdWertAccRoll; |
|
- | 232 | Mittelwert_AccHoch = AdWertAccHoch; |
|
- | 233 | IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
|
- | 234 | IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
|
- | 235 | Mess_IntegralNick2 = IntegralNick; |
|
- | 236 | Mess_IntegralRoll2 = IntegralRoll; |
|
234 | Delay_ms_Mess(100); |
237 | Mess_Integral_Gier = 0; |
235 | StartLuftdruck = Luftdruck; |
238 | StartLuftdruck = Luftdruck; |
236 | HoeheD = 0; |
239 | HoeheD = 0; |
237 | Mess_Integral_Hoch = 0; |
240 | Mess_Integral_Hoch = 0; |
238 | KompassStartwert = KompassValue; |
241 | KompassStartwert = KompassValue; |
Line 245... | Line 248... | ||
245 | GierGyroFehler = 0; |
248 | GierGyroFehler = 0; |
246 | SendVersionToNavi = 1; |
249 | SendVersionToNavi = 1; |
247 | LED_Init(); |
250 | LED_Init(); |
248 | MikroKopterFlags |= FLAG_CALIBRATE; |
251 | MikroKopterFlags |= FLAG_CALIBRATE; |
249 | FromNaviCtrl_Value.Kalman_K = -1; |
252 | FromNaviCtrl_Value.Kalman_K = -1; |
250 | FromNaviCtrl_Value.Kalman_MaxDrift = EE_Parameter.Driftkomp * 16; |
253 | FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
251 | FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
254 | FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
252 | Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
255 | Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
253 | Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
256 | Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
254 | Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
257 | Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
255 | Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
258 | Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
Line 304... | Line 307... | ||
304 | else winkel_nick = Mess_IntegralNick; |
307 | else winkel_nick = Mess_IntegralNick; |
Line 305... | Line 308... | ||
305 | 308 | ||
306 | // Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
309 | // Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
307 | Mess_Integral_Gier += MesswertGier; |
310 | Mess_Integral_Gier += MesswertGier; |
308 | ErsatzKompass += MesswertGier; |
- | |
309 | 311 | ErsatzKompass += MesswertGier; |
|
310 | // Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
312 | // Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
311 | if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
313 | if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
312 | { |
314 | { |
313 | tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
315 | tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
Line 695... | Line 697... | ||
695 | modell_fliegt = 1; |
697 | modell_fliegt = 1; |
696 | MotorenEin = 1; |
698 | MotorenEin = 1; |
697 | sollGier = 0; |
699 | sollGier = 0; |
698 | Mess_Integral_Gier = 0; |
700 | Mess_Integral_Gier = 0; |
699 | Mess_Integral_Gier2 = 0; |
701 | Mess_Integral_Gier2 = 0; |
700 | Mess_IntegralNick = 0; |
702 | Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
701 | Mess_IntegralRoll = 0; |
703 | Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
702 | Mess_IntegralNick2 = IntegralNick; |
704 | Mess_IntegralNick2 = IntegralNick; |
703 | Mess_IntegralRoll2 = IntegralRoll; |
705 | Mess_IntegralRoll2 = IntegralRoll; |
704 | SummeNick = 0; |
706 | SummeNick = 0; |
705 | SummeRoll = 0; |
707 | SummeRoll = 0; |
706 | MikroKopterFlags |= FLAG_START; |
708 | MikroKopterFlags |= FLAG_START; |
Line 932... | Line 934... | ||
932 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
934 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
933 | { |
935 | { |
934 | static int cnt = 0; |
936 | static int cnt = 0; |
935 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
937 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
936 | static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
938 | static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
937 | if(!Looping_Nick && !Looping_Roll && !TrichterFlug && (PlatinenVersion < 20)) |
939 | if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
938 | { |
940 | { |
939 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
941 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
940 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
942 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
941 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
943 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
942 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
944 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
Line 1000... | Line 1002... | ||
1000 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
1002 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
1001 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
1003 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
1002 | #define BEWEGUNGS_LIMIT 20000 |
1004 | #define BEWEGUNGS_LIMIT 20000 |
1003 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
1005 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
1004 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
1006 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
1005 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*16)) |
1007 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
1006 | { |
1008 | { |
1007 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
1009 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
1008 | { |
1010 | { |
1009 | if(last_n_p) |
1011 | if(last_n_p) |
1010 | { |
1012 | { |
1011 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
1013 | cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
1012 | ausgleichNick = IntegralFehlerNick / 8; |
1014 | ausgleichNick = IntegralFehlerNick / 8; |
1013 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
1015 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
1014 | LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
1016 | LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
1015 | } |
1017 | } |
1016 | else last_n_p = 1; |
1018 | else last_n_p = 1; |
1017 | } else last_n_p = 0; |
1019 | } else last_n_p = 0; |
1018 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
1020 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
1019 | { |
1021 | { |
1020 | if(last_n_n) |
1022 | if(last_n_n) |
1021 | { |
1023 | { |
1022 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
1024 | cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
1023 | ausgleichNick = IntegralFehlerNick / 8; |
1025 | ausgleichNick = IntegralFehlerNick / 8; |
1024 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
1026 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
1025 | LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
1027 | LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
1026 | } |
1028 | } |
1027 | else last_n_n = 1; |
1029 | else last_n_n = 1; |
Line 1031... | Line 1033... | ||
1031 | { |
1033 | { |
1032 | cnt = 0; |
1034 | cnt = 0; |
1033 | KompassSignalSchlecht = 1000; |
1035 | KompassSignalSchlecht = 1000; |
1034 | } |
1036 | } |
1035 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
1037 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
1036 | if(cnt * 16 > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift/16; |
1038 | if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
1037 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
1039 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
1038 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
1040 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
Line 1039... | Line 1041... | ||
1039 | 1041 | ||
1040 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
1042 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 1041... | Line 1043... | ||
1041 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
1043 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
1042 | 1044 | ||
1043 | ausgleichRoll = 0; |
1045 | ausgleichRoll = 0; |
1044 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*16)) |
1046 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
1045 | { |
1047 | { |
1046 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
1048 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
1047 | { |
1049 | { |
1048 | if(last_r_p) |
1050 | if(last_r_p) |
1049 | { |
1051 | { |
1050 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
1052 | cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
1051 | ausgleichRoll = IntegralFehlerRoll / 8; |
1053 | ausgleichRoll = IntegralFehlerRoll / 8; |
1052 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
1054 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
1053 | LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
1055 | LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
1054 | } |
1056 | } |
1055 | else last_r_p = 1; |
1057 | else last_r_p = 1; |
1056 | } else last_r_p = 0; |
1058 | } else last_r_p = 0; |
1057 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
1059 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
1058 | { |
1060 | { |
1059 | if(last_r_n) |
1061 | if(last_r_n) |
1060 | { |
1062 | { |
1061 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
1063 | cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
1062 | ausgleichRoll = IntegralFehlerRoll / 8; |
1064 | ausgleichRoll = IntegralFehlerRoll / 8; |
1063 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
1065 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
1064 | LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
1066 | LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
Line 1069... | Line 1071... | ||
1069 | { |
1071 | { |
1070 | cnt = 0; |
1072 | cnt = 0; |
1071 | KompassSignalSchlecht = 1000; |
1073 | KompassSignalSchlecht = 1000; |
1072 | } |
1074 | } |
1073 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
1075 | if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
1074 | if(cnt * 16 > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift/16; |
1076 | if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
1075 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
1077 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
1076 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
1078 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
1077 | } |
1079 | } |
1078 | else |
1080 | else |
1079 | { |
1081 | { |
Line 1093... | Line 1095... | ||
1093 | MittelIntegralNick = 0; |
1095 | MittelIntegralNick = 0; |
1094 | MittelIntegralRoll = 0; |
1096 | MittelIntegralRoll = 0; |
1095 | MittelIntegralNick2 = 0; |
1097 | MittelIntegralNick2 = 0; |
1096 | MittelIntegralRoll2 = 0; |
1098 | MittelIntegralRoll2 = 0; |
1097 | ZaehlMessungen = 0; |
1099 | ZaehlMessungen = 0; |
- | 1100 | } // ZaehlMessungen >= ABGLEICH_ANZAHL |
|
1098 | } |
1101 | |
1099 | //DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor); |
- | |
Line 1100... | Line 1102... | ||
1100 | 1102 | ||
1101 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1103 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1102 | // Gieren |
1104 | // Gieren |
1103 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1105 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 1200... | Line 1202... | ||
1200 | //DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1202 | //DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1201 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1203 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1202 | DebugOut.Analog[20] = ServoValue; |
1204 | DebugOut.Analog[20] = ServoValue; |
1203 | // DebugOut.Analog[24] = MesswertNick/2; |
1205 | // DebugOut.Analog[24] = MesswertNick/2; |
1204 | // DebugOut.Analog[25] = MesswertRoll/2; |
1206 | // DebugOut.Analog[25] = MesswertRoll/2; |
1205 | // DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
1207 | DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
1206 | // DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
1208 | // DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
1207 | // DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
1209 | // DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
1208 | DebugOut.Analog[30] = GPS_Nick; |
1210 | DebugOut.Analog[30] = GPS_Nick; |
1209 | DebugOut.Analog[31] = GPS_Roll; |
1211 | DebugOut.Analog[31] = GPS_Roll; |