Rev 1167 | Rev 1172 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1167 | Rev 1171 | ||
---|---|---|---|
Line 176... | Line 176... | ||
176 | void SetNeutral(void) |
176 | void SetNeutral(void) |
177 | //############################################################################ |
177 | //############################################################################ |
178 | { |
178 | { |
179 | unsigned char i; |
179 | unsigned char i; |
180 | unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
180 | unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
- | 181 | ServoActive = 0; HEF4017R_ON; |
|
181 | NeutralAccX = 0; |
182 | NeutralAccX = 0; |
182 | NeutralAccY = 0; |
183 | NeutralAccY = 0; |
183 | NeutralAccZ = 0; |
184 | NeutralAccZ = 0; |
184 | AdNeutralNick = 0; |
185 | AdNeutralNick = 0; |
185 | AdNeutralRoll = 0; |
186 | AdNeutralRoll = 0; |
Line 209... | Line 210... | ||
209 | AdNeutralGierBias = AdNeutralGier; |
210 | AdNeutralGierBias = AdNeutralGier; |
210 | StartNeutralRoll = AdNeutralRoll; |
211 | StartNeutralRoll = AdNeutralRoll; |
211 | StartNeutralNick = AdNeutralNick; |
212 | StartNeutralNick = AdNeutralNick; |
212 | if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
213 | if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
213 | { |
214 | { |
214 | NeutralAccY = abs(Mittelwert_AccRoll) / (4*ACC_AMPLIFY); |
215 | NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
215 | NeutralAccX = abs(Mittelwert_AccNick) / (4*ACC_AMPLIFY); |
216 | NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
216 | NeutralAccZ = Aktuell_az; |
217 | NeutralAccZ = Aktuell_az; |
217 | } |
218 | } |
218 | else |
219 | else |
219 | { |
220 | { |
220 | 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]); |
Line 246... | Line 247... | ||
246 | LED_Init(); |
247 | LED_Init(); |
247 | MikroKopterFlags |= FLAG_CALIBRATE; |
248 | MikroKopterFlags |= FLAG_CALIBRATE; |
248 | FromNaviCtrl_Value.Kalman_K = -1; |
249 | FromNaviCtrl_Value.Kalman_K = -1; |
249 | FromNaviCtrl_Value.Kalman_MaxDrift = EE_Parameter.Driftkomp * 16; |
250 | FromNaviCtrl_Value.Kalman_MaxDrift = EE_Parameter.Driftkomp * 16; |
250 | FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
251 | FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
- | 252 | if(Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110); |
|
- | 253 | if(Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110); |
|
- | 254 | if(Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110); |
|
- | 255 | if(Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110); |
|
- | 256 | ServoActive = 1; |
|
- | 257 | SenderOkay = 100; |
|
251 | } |
258 | } |
Line 252... | Line 259... | ||
252 | 259 | ||
253 | //############################################################################ |
260 | //############################################################################ |
254 | // Bearbeitet die Messwerte |
261 | // Bearbeitet die Messwerte |
255 | void Mittelwert(void) |
262 | void Mittelwert(void) |
256 | //############################################################################ |
263 | //############################################################################ |
257 | { |
264 | { |
258 | static signed long tmpl,tmpl2,tmpl3,tmpl4; |
265 | static signed long tmpl,tmpl2,tmpl3,tmpl4; |
259 | static signed int oldNick, oldRoll, d2Roll, d2Nick; |
- | |
260 | signed int tmp_int; |
266 | static signed int oldNick, oldRoll, d2Roll, d2Nick; |
- | 267 | signed long winkel_nick, winkel_roll; |
|
261 | signed long winkel_nick, winkel_roll; |
268 | |
262 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
269 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
263 | // MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
270 | // MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
264 | MesswertNick = (signed int) AdWertNickFilter / 20; |
271 | MesswertNick = (signed int) AdWertNickFilter / 8; |
265 | MesswertRoll = (signed int) AdWertRollFilter / 20; |
272 | MesswertRoll = (signed int) AdWertRollFilter / 8; |
266 | RohMesswertNick = MesswertNick; |
273 | RohMesswertNick = MesswertNick; |
267 | RohMesswertRoll = MesswertRoll; |
274 | RohMesswertRoll = MesswertRoll; |
268 | //DebugOut.Analog[21] = MesswertNick; |
275 | //DebugOut.Analog[21] = MesswertNick; |
269 | //DebugOut.Analog[22] = MesswertRoll; |
276 | //DebugOut.Analog[22] = MesswertRoll; |
Line 282... | Line 289... | ||
282 | NaviCntAcc++; |
289 | NaviCntAcc++; |
283 | IntegralAccZ += Aktuell_az - NeutralAccZ; |
290 | IntegralAccZ += Aktuell_az - NeutralAccZ; |
Line 284... | Line 291... | ||
284 | 291 | ||
285 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
292 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
286 | // ADC einschalten |
- | |
287 | AdReady = 0; |
293 | // ADC einschalten |
- | 294 | ANALOG_ON; |
|
288 | ANALOG_ON; |
295 | AdReady = 0; |
Line 289... | Line 296... | ||
289 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
296 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
290 | 297 | ||
291 | if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
298 | if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
Line 365... | Line 372... | ||
365 | IntegralNick2 = Mess_IntegralNick2; |
372 | IntegralNick2 = Mess_IntegralNick2; |
366 | IntegralRoll2 = Mess_IntegralRoll2; |
373 | IntegralRoll2 = Mess_IntegralRoll2; |
Line 367... | Line 374... | ||
367 | 374 | ||
Line 368... | Line 375... | ||
368 | #define D_LIMIT 128 |
375 | #define D_LIMIT 128 |
369 | 376 | ||
Line 370... | Line 377... | ||
370 | MesswertNick = HiResNick / 20; |
377 | MesswertNick = HiResNick / 8; |
371 | MesswertRoll = HiResRoll / 20; |
378 | MesswertRoll = HiResRoll / 8; |
372 | 379 | ||
373 | if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
380 | if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
Line 867... | Line 874... | ||
867 | LageKorrekturNick = 0; |
874 | LageKorrekturNick = 0; |
868 | LageKorrekturRoll = 0; |
875 | LageKorrekturRoll = 0; |
869 | } |
876 | } |
Line 870... | Line 877... | ||
870 | 877 | ||
871 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
878 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
872 | if(!Looping_Nick && !Looping_Roll) |
879 | if(!Looping_Nick && !Looping_Roll && Aktuell_az > 600) |
873 | { |
880 | { |
874 | long tmp_long, tmp_long2; |
881 | long tmp_long, tmp_long2; |
875 | if(FromNaviCtrl_Value.Kalman_K != -1 && !TrichterFlug) |
882 | if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
876 | { |
883 | { |
877 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
884 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
878 | tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
885 | tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
879 | tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
886 | tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
Line 901... | Line 908... | ||
901 | tmp_long2 /= 16; |
908 | tmp_long2 /= 16; |
902 | if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
909 | if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
903 | { |
910 | { |
904 | tmp_long /= 3; |
911 | tmp_long /= 3; |
905 | tmp_long2 /= 3; |
912 | tmp_long2 /= 3; |
906 | } |
913 | } |
907 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
914 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
908 | { |
915 | { |
909 | tmp_long /= 3; |
916 | tmp_long /= 3; |
910 | tmp_long2 /= 3; |
917 | tmp_long2 /= 3; |
911 | } |
918 | } |
Line 1111... | Line 1118... | ||
1111 | if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
1118 | if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
Line 1112... | Line 1119... | ||
1112 | 1119 | ||
1113 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1120 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1114 | // Kompass |
1121 | // Kompass |
1115 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1122 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 1116... | Line 1123... | ||
1116 | //DebugOut.Analog[29] = (MaxStickNick + MaxStickRoll); |
1123 | DebugOut.Analog[16] = KompassSignalSchlecht; |
1117 | 1124 | ||
1118 | if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
1125 | if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
1119 | { |
1126 | { |
1120 | int w,v,r,fehler,korrektur; |
1127 | int w,v,r,fehler,korrektur; |
1121 | w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
1128 | w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
1122 | v = abs(IntegralRoll /512); |
1129 | v = abs(IntegralRoll /512); |
1123 | if(v > w) w = v; // grösste Neigung ermitteln |
1130 | if(v > w) w = v; // grösste Neigung ermitteln |
1124 | korrektur = w / 8 + 1; |
1131 | korrektur = w / 8 + 1; |
1125 | fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
1132 | fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
1126 | if(NeueKompassRichtungMerken) |
1133 | if(abs(MesswertGier) > 128) |
- | 1134 | { |
|
- | 1135 | fehler = 0; |
|
- | 1136 | } |
|
- | 1137 | ||
- | 1138 | if(NeueKompassRichtungMerken) |
|
- | 1139 | { |
|
- | 1140 | // ErsatzKompass += (fehler * 32) / korrektur; |
|
1127 | { |
1141 | // fehler = 0; |
1128 | fehler = 0; |
1142 | // fehler /= 4; |
1129 | ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
1143 | // ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
1130 | } |
1144 | } |
1131 | if(!KompassSignalSchlecht && w < 25) |
1145 | if(!KompassSignalSchlecht && w < 25) |
1132 | { |
1146 | { |
1133 | GierGyroFehler += fehler; |
1147 | GierGyroFehler += fehler; |
1134 | if(NeueKompassRichtungMerken) |
1148 | if(NeueKompassRichtungMerken) |
1135 | { |
1149 | { |
- | 1150 | beeptime = 200; |
|
1136 | beeptime = 200; |
1151 | // KompassStartwert = KompassValue; |
1137 | // KompassStartwert = KompassValue; |
1152 | ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
1138 | KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
1153 | KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
1139 | NeueKompassRichtungMerken = 0; |
1154 | NeueKompassRichtungMerken = 0; |
1140 | } |
1155 | } |
Line 1167... | Line 1182... | ||
1167 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1182 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1168 | if(!TimerWerteausgabe--) |
1183 | if(!TimerWerteausgabe--) |
1169 | { |
1184 | { |
1170 | TimerWerteausgabe = 24; |
1185 | TimerWerteausgabe = 24; |
Line 1171... | Line 1186... | ||
1171 | 1186 | ||
1172 | DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor; |
1187 | DebugOut.Analog[0] = IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
1173 | DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
1188 | DebugOut.Analog[1] = IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
1174 | DebugOut.Analog[2] = Mittelwert_AccNick; |
1189 | DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
1175 | DebugOut.Analog[3] = Mittelwert_AccRoll; |
1190 | DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
1176 | DebugOut.Analog[4] = MesswertGier; |
1191 | DebugOut.Analog[4] = MesswertGier; |
1177 | DebugOut.Analog[5] = HoehenWert; |
1192 | DebugOut.Analog[5] = HoehenWert; |
1178 | DebugOut.Analog[6] = Aktuell_az;//(Mess_Integral_Hoch / 512); |
1193 | DebugOut.Analog[6] = (Mess_Integral_Hoch / 512);//Aktuell_az; |
1179 | DebugOut.Analog[8] = KompassValue; |
1194 | DebugOut.Analog[8] = KompassValue; |
1180 | DebugOut.Analog[9] = UBat; |
1195 | DebugOut.Analog[9] = UBat; |
1181 | DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
1196 | DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
1182 | DebugOut.Analog[10] = SenderOkay; |
1197 | DebugOut.Analog[10] = SenderOkay; |
1183 | //DebugOut.Analog[16] = Mittelwert_AccHoch; |
1198 | //DebugOut.Analog[16] = Mittelwert_AccHoch; |
1184 | //DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1199 | //DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1185 | //DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1200 | //DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1186 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1201 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1187 | DebugOut.Analog[20] = ServoValue; |
1202 | DebugOut.Analog[20] = ServoValue; |
1188 | DebugOut.Analog[24] = MesswertNick/2; |
1203 | // DebugOut.Analog[24] = MesswertNick/2; |
1189 | DebugOut.Analog[25] = MesswertRoll/2; |
1204 | // DebugOut.Analog[25] = MesswertRoll/2; |
1190 | DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
1205 | DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
1191 | DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
1206 | DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
1192 | DebugOut.Analog[30] = GPS_Nick; |
1207 | DebugOut.Analog[30] = GPS_Nick; |
Line 1223... | Line 1238... | ||
1223 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1238 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1224 | // Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
1239 | // Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
1225 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1240 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1226 | if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
1241 | if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
Line 1227... | Line 1242... | ||
1227 | 1242 | ||
1228 | if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
1243 | if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
Line 1229... | Line 1244... | ||
1229 | if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
1244 | if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
1230 | 1245 | ||
1231 | #define TRIM_MAX 200 |
1246 | #define TRIM_MAX 200 |
Line 1327... | Line 1342... | ||
1327 | GasMischanteil = hoehenregler; |
1342 | GasMischanteil = hoehenregler; |
1328 | } |
1343 | } |
1329 | } |
1344 | } |
1330 | if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
1345 | if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
Line 1331... | Line -... | ||
1331 | - | ||
1332 | 1346 | ||
1333 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1347 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1334 | // + Mischer und PI-Regler |
1348 | // + Mischer und PI-Regler |
1335 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1349 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1336 | DebugOut.Analog[7] = GasMischanteil; |
1350 | DebugOut.Analog[7] = GasMischanteil; |
Line 1454... | Line 1468... | ||
1454 | 1468 | ||
1455 | motorwert = GasMischanteil + pd_ergebnis_nick - pd_ergebnis_roll - GierMischanteil; |
1469 | motorwert = GasMischanteil + pd_ergebnis_nick - pd_ergebnis_roll - GierMischanteil; |
1456 | motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS); |
1470 | motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS); |
Line 1457... | Line 1471... | ||
1457 | Motor2 = motorwert; |
1471 | Motor2 = motorwert; |
1458 | 1472 | ||
1459 | motorwert = GasMischanteil + - pd_ergebnis_roll + GierMischanteil; |
1473 | motorwert = GasMischanteil - pd_ergebnis_roll + GierMischanteil; |
Line 1460... | Line 1474... | ||
1460 | motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS); |
1474 | motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS); |
1461 | Motor3 = motorwert; |
1475 | Motor3 = motorwert; |