Rev 1226 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1226 | Rev 1286 | ||
---|---|---|---|
Line 52... | Line 52... | ||
52 | // + POSSIBILITY OF SUCH DAMAGE. |
52 | // + POSSIBILITY OF SUCH DAMAGE. |
53 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
53 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 54... | Line 54... | ||
54 | 54 | ||
55 | #include "main.h" |
55 | #include "main.h" |
- | 56 | #include "eeprom.c" |
|
- | 57 | #include "mymath.c" // MartinR: für Killagreg´s Erweiterung |
|
Line 56... | Line 58... | ||
56 | #include "eeprom.c" |
58 | #include "mymath.h" // MartinR: für Killagreg´s Erweiterung |
57 | 59 | ||
58 | unsigned char h,m,s; |
60 | unsigned char h,m,s; |
59 | volatile unsigned int I2CTimeout = 100; |
61 | volatile unsigned int I2CTimeout = 100; |
60 | int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
62 | int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
61 | int TrimNick, TrimRoll; |
63 | int TrimNick, TrimRoll; |
62 | int AdNeutralGierBias; |
64 | int AdNeutralGierBias; |
63 | int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
65 | int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
64 | int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
66 | int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
- | 67 | int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
|
- | 68 | //volatile float NeutralAccZ = 0; // MartinR : so war es |
|
- | 69 | volatile int NeutralAccZ = 0; // MartinR geändert |
|
- | 70 | ||
- | 71 | volatile int NeutralAccZ2 = 0; // MartinR: für HP-Filter |
|
- | 72 | signed int h_p,h_d,h_delta,Ziel_d; // MartinR: P,D Anteil beim eigenen Höhenregler |
|
65 | int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
73 | signed int SchwebeGas; // MartinR: für neuen Höhenregler |
66 | volatile float NeutralAccZ = 0; |
74 | |
67 | unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
75 | unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
68 | long IntegralNick = 0,IntegralNick2 = 0; |
76 | long IntegralNick = 0,IntegralNick2 = 0; |
69 | long IntegralRoll = 0,IntegralRoll2 = 0; |
77 | long IntegralRoll = 0,IntegralRoll2 = 0; |
Line 80... | Line 88... | ||
80 | unsigned int KompassSignalSchlecht = 500; |
88 | unsigned int KompassSignalSchlecht = 500; |
81 | unsigned char MAX_GAS,MIN_GAS; |
89 | unsigned char MAX_GAS,MIN_GAS; |
82 | unsigned char Notlandung = 0; |
90 | unsigned char Notlandung = 0; |
83 | unsigned char HoehenReglerAktiv = 0; |
91 | unsigned char HoehenReglerAktiv = 0; |
84 | unsigned char TrichterFlug = 0; |
92 | unsigned char TrichterFlug = 0; |
- | 93 | ||
- | 94 | unsigned char delay_Hoehenregler = 0; // MartinR: zur Begrenzung der Sinkgeschwindigkeit |
|
- | 95 | signed int delay_SchwebeGas = 0; // MartinR: zur Begrenzung der Sinkgeschwindigkeit |
|
- | 96 | ||
85 | long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
97 | long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
86 | long ErsatzKompass; |
98 | long ErsatzKompass; |
87 | int ErsatzKompassInGrad; // Kompasswert in Grad |
99 | int ErsatzKompassInGrad; // Kompasswert in Grad |
88 | int GierGyroFehler = 0; |
100 | int GierGyroFehler = 0; |
89 | char GyroFaktor,GyroFaktorGier; |
101 | char GyroFaktor,GyroFaktorGier; |
Line 91... | Line 103... | ||
91 | int DiffNick,DiffRoll; |
103 | int DiffNick,DiffRoll; |
92 | int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
104 | int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
93 | volatile unsigned char SenderOkay = 0; |
105 | volatile unsigned char SenderOkay = 0; |
94 | int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
106 | int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
95 | char MotorenEin = 0; |
107 | char MotorenEin = 0; |
96 | int HoehenWert = 0; |
108 | //int HoehenWert = 0; //MartinR: so war es |
- | 109 | long HoehenWert = 0; //MartinR: geändert |
|
- | 110 | ||
- | 111 | long HoehenWertalt = 0; //MartinR: Test |
|
- | 112 | unsigned char iHoehe; // MartinR: Zähler für HoeheD |
|
- | 113 | signed long HoehenWertSumme = 0; // MartinR: für neuen Höhenregler D-Anteil |
|
- | 114 | ||
97 | int SollHoehe = 0; |
115 | //int SollHoehe = 0;//MartinR: so war es |
- | 116 | long SollHoehe = 0;//MartinR: geändert |
|
- | 117 | ||
98 | int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
118 | int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
99 | //float Ki = FAKTOR_I; |
119 | //float Ki = FAKTOR_I; |
100 | int Ki = 10300 / 33; |
120 | int Ki = 10300 / 33; |
- | 121 | ||
- | 122 | int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter |
|
- | 123 | ||
101 | unsigned char Looping_Nick = 0,Looping_Roll = 0; |
124 | unsigned char Looping_Nick = 0,Looping_Roll = 0; |
102 | unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
125 | unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
Line 103... | Line 126... | ||
103 | 126 | ||
104 | unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
127 | unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
Line 140... | Line 163... | ||
140 | unsigned char Parameter_NaviWindCorrection; |
163 | unsigned char Parameter_NaviWindCorrection; |
141 | unsigned char Parameter_NaviSpeedCompensation; |
164 | unsigned char Parameter_NaviSpeedCompensation; |
142 | unsigned char Parameter_ExternalControl; |
165 | unsigned char Parameter_ExternalControl; |
143 | struct mk_param_struct EE_Parameter; |
166 | struct mk_param_struct EE_Parameter; |
144 | signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
167 | signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
145 | int MaxStickNick = 0,MaxStickRoll = 0; |
168 | //int MaxStickNick = 0,MaxStickRoll = 0;MartinR: so war es |
- | 169 | ||
- | 170 | int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0; // MartinR: stick_.._neutral hinzugefügt |
|
- | 171 | ||
146 | unsigned int modell_fliegt = 0; |
172 | unsigned int modell_fliegt = 0; |
147 | volatile unsigned char MikroKopterFlags = 0; |
173 | volatile unsigned char MikroKopterFlags = 0; |
148 | long GIER_GRAD_FAKTOR = 1291; |
174 | long GIER_GRAD_FAKTOR = 1291; |
149 | signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
175 | signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
150 | unsigned char RequiredMotors = 4; |
176 | unsigned char RequiredMotors = 4; |
Line 153... | Line 179... | ||
153 | 179 | ||
154 | int MotorSmoothing(int neu, int alt) |
180 | int MotorSmoothing(int neu, int alt) |
155 | { |
181 | { |
156 | int motor; |
182 | int motor; |
157 | if(neu > alt) motor = (1*(int)alt + neu) / 2; |
183 | if(neu > alt) motor = (1*(int)alt + neu) / 2; |
- | 184 | //else motor = neu - (alt - neu)*1; // MartinR: so war es |
|
158 | else motor = neu - (alt - neu)*1; |
185 | else motor = neu; // MartinR: Entsprechend Vorschlag von MartinW geändert |
159 | //if(Poti2 < 20) return(neu); |
186 | //if(Poti2 < 20) return(neu); |
160 | return(motor); |
187 | return(motor); |
Line 180... | Line 207... | ||
180 | unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
207 | unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
181 | ServoActive = 0; HEF4017R_ON; |
208 | ServoActive = 0; HEF4017R_ON; |
182 | NeutralAccX = 0; |
209 | NeutralAccX = 0; |
183 | NeutralAccY = 0; |
210 | NeutralAccY = 0; |
184 | NeutralAccZ = 0; |
211 | NeutralAccZ = 0; |
- | 212 | NeutralAccZ2 = 0; // MartinR |
|
- | 213 | ||
185 | AdNeutralNick = 0; |
214 | AdNeutralNick = 0; |
186 | AdNeutralRoll = 0; |
215 | AdNeutralRoll = 0; |
187 | AdNeutralGier = 0; |
216 | AdNeutralGier = 0; |
188 | AdNeutralGierBias = 0; |
217 | AdNeutralGierBias = 0; |
189 | Parameter_AchsKopplung1 = 0; |
218 | Parameter_AchsKopplung1 = 0; |
Line 213... | Line 242... | ||
213 | if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
242 | if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
214 | { |
243 | { |
215 | NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
244 | NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
216 | NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
245 | NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
217 | NeutralAccZ = Aktuell_az; |
246 | NeutralAccZ = Aktuell_az; |
- | 247 | NeutralAccZ2 = NeutralAccZ; // MartinR |
|
218 | } |
248 | } |
219 | else |
249 | else |
220 | { |
250 | { |
221 | NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
251 | 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]); |
252 | NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
Line 264... | Line 294... | ||
264 | void Mittelwert(void) |
294 | void Mittelwert(void) |
265 | //############################################################################ |
295 | //############################################################################ |
266 | { |
296 | { |
267 | static signed long tmpl,tmpl2,tmpl3,tmpl4; |
297 | static signed long tmpl,tmpl2,tmpl3,tmpl4; |
268 | static signed int oldNick, oldRoll, d2Roll, d2Nick; |
298 | static signed int oldNick, oldRoll, d2Roll, d2Nick; |
- | 299 | static signed int oldNick2, oldRoll2 ; //MartinR : für geänderte d2* Ermittlung |
|
269 | signed long winkel_nick, winkel_roll; |
300 | signed long winkel_nick, winkel_roll; |
Line 270... | Line 301... | ||
270 | 301 | ||
271 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
302 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
272 | // MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
303 | // MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
Line 287... | Line 318... | ||
287 | IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
318 | IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
288 | IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
319 | IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
289 | NaviAccNick += AdWertAccNick; |
320 | NaviAccNick += AdWertAccNick; |
290 | NaviAccRoll += AdWertAccRoll; |
321 | NaviAccRoll += AdWertAccRoll; |
291 | NaviCntAcc++; |
322 | NaviCntAcc++; |
292 | IntegralAccZ += Aktuell_az - NeutralAccZ; |
323 | //IntegralAccZ += Aktuell_az - NeutralAccZ; // MartinR: so war es |
- | 324 | IntegralAccZ += AdWertAccHoch;// MartinR: AdWertAccHoch = Aktuell_az - NeutralAccZ; in analog.c |
|
Line 293... | Line 325... | ||
293 | 325 | ||
294 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
326 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
295 | // ADC einschalten |
327 | // ADC einschalten |
- | 328 | //ANALOG_ON; // MartinR : so war es |
|
296 | ANALOG_ON; |
329 | // ANALOG_START; // MartinR verschoben zu timer0 |
297 | AdReady = 0; |
330 | AdReady = 0; |
Line 298... | Line 331... | ||
298 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
331 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
299 | 332 | ||
Line 307... | Line 340... | ||
307 | 340 | ||
308 | // Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
341 | // Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
309 | Mess_Integral_Gier += MesswertGier; |
342 | Mess_Integral_Gier += MesswertGier; |
310 | ErsatzKompass += MesswertGier; |
343 | ErsatzKompass += MesswertGier; |
- | 344 | // Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
|
- | 345 | ||
- | 346 | if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR: zusätzlich |
|
311 | // Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
347 | |
- | 348 | //if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR : so war es |
|
312 | if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
349 | if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor" |
313 | { |
350 | { |
314 | tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
351 | tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
315 | tmpl3 *= Parameter_AchsKopplung2; //65 |
352 | tmpl3 *= Parameter_AchsKopplung2; //65 |
316 | tmpl3 /= 4096L; |
353 | tmpl3 /= 4096L; |
Line 373... | Line 410... | ||
373 | IntegralNick2 = Mess_IntegralNick2; |
410 | IntegralNick2 = Mess_IntegralNick2; |
374 | IntegralRoll2 = Mess_IntegralRoll2; |
411 | IntegralRoll2 = Mess_IntegralRoll2; |
Line 375... | Line 412... | ||
375 | 412 | ||
Line 376... | Line 413... | ||
376 | #define D_LIMIT 128 |
413 | #define D_LIMIT 128 |
377 | 414 | ||
- | 415 | //MesswertNick = HiResNick / 8;// MartinR : so war es |
|
- | 416 | //MesswertRoll = HiResRoll / 8;// MartinR : so war es |
|
Line -... | Line 417... | ||
- | 417 | MesswertNick = AdWertNickFilter / 8;// MartinR : anstelle HiResNick : AdWertNickFilter |
|
- | 418 | MesswertRoll = AdWertRollFilter / 8;// MartinR : ist im vergleich zu HiRes.. eimal mehr gemittelt |
|
- | 419 | ||
378 | MesswertNick = HiResNick / 8; |
420 | |
379 | MesswertRoll = HiResRoll / 8; |
421 | // MartinR : so war es Anfang |
380 | 422 | /* |
|
381 | if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
423 | if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
382 | if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
424 | if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
383 | else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
425 | else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
- | 426 | if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
|
- | 427 | if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
|
- | 428 | else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
|
- | 429 | |
|
- | 430 | // MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000 |
|
- | 431 | */ |
|
- | 432 | // MartinR : so war es Ende |
|
- | 433 | ||
- | 434 | // MartinR : Neu Anfang |
|
- | 435 | if(PlatinenVersion == 10) |
|
- | 436 | { |
|
- | 437 | if(AdWertNick > 1010) MesswertNick = +600; |
|
- | 438 | if(AdWertNick > 1017) MesswertNick = +800; |
|
- | 439 | if(AdWertNick < 15) MesswertNick = -600; |
|
- | 440 | if(AdWertNick < 7) MesswertNick = -800; |
|
- | 441 | if(AdWertRoll > 1010) MesswertRoll = +600; |
|
- | 442 | if(AdWertRoll > 1017) MesswertRoll = +800; |
|
- | 443 | if(AdWertRoll < 15) MesswertRoll = -600; |
|
- | 444 | if(AdWertRoll < 7) MesswertRoll = -800; |
|
- | 445 | } |
|
- | 446 | else |
|
- | 447 | { |
|
- | 448 | if(AdWertNick > 2000) MesswertNick = +1200; |
|
- | 449 | if(AdWertNick > 2015) MesswertNick = +1600; |
|
- | 450 | if(AdWertNick < 15) MesswertNick = -1200; |
|
- | 451 | if(AdWertNick < 7) MesswertNick = -1600; |
|
- | 452 | if(AdWertRoll > 2000) MesswertRoll = +1200; |
|
- | 453 | if(AdWertRoll > 2015) MesswertRoll = +1600; |
|
- | 454 | if(AdWertRoll < 15) MesswertRoll = -1200; |
|
Line 384... | Line 455... | ||
384 | if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
455 | if(AdWertRoll < 7) MesswertRoll = -1600; |
385 | if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
456 | } |
- | 457 | // MartinR : Neu Ende |
|
- | 458 | ||
386 | else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
459 | if(Parameter_Gyro_D) |
387 | 460 | { |
|
388 | if(Parameter_Gyro_D) |
461 | /* MartinR: so war es Anfang |
389 | { |
462 | |
390 | d2Nick = HiResNick - oldNick; |
463 | d2Nick = HiResNick - oldNick; |
Line 397... | Line 470... | ||
397 | if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
470 | if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
398 | else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
471 | else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
399 | MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
472 | MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
400 | HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
473 | HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
401 | HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
474 | HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
- | 475 | |
|
- | 476 | */ //MartinR: so war es Ende |
|
- | 477 | ||
- | 478 | // MartinR :neu Anfang |
|
- | 479 | d2Nick = MesswertNick - oldNick2; |
|
- | 480 | oldNick2 = oldNick; |
|
- | 481 | oldNick = MesswertNick; |
|
- | 482 | if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
|
- | 483 | else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
|
- | 484 | if(d2Nick > 0) d2Nick --; |
|
- | 485 | if(d2Nick < 0) d2Nick ++; |
|
- | 486 | ||
- | 487 | MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
|
- | 488 | ||
- | 489 | d2Roll = MesswertRoll - oldRoll2; |
|
- | 490 | oldRoll2 = oldRoll; |
|
- | 491 | oldRoll = MesswertRoll; |
|
- | 492 | if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
|
- | 493 | else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
|
- | 494 | if(d2Roll > 0) d2Roll --; |
|
- | 495 | if(d2Roll < 0) d2Roll ++; |
|
- | 496 | ||
- | 497 | MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
|
- | 498 | // MartinR :neu Ende |
|
- | 499 | ||
402 | } |
500 | } |
Line 403... | Line 501... | ||
403 | 501 | ||
404 | if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
502 | if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
405 | else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
503 | else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
Line 517... | Line 615... | ||
517 | CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
615 | CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
518 | CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
616 | CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
519 | CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
617 | CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
520 | CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
618 | CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
521 | Ki = 10300 / (Parameter_I_Faktor + 1); |
619 | Ki = 10300 / (Parameter_I_Faktor + 1); |
- | 620 | ||
- | 621 | if(Parameter_UserParam1 > 140) KiHH = 10300 / (Parameter_UserParam2 + 1); else KiHH = Ki; // MartinR : für HH über Schalter |
|
- | 622 | Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen |
|
- | 623 | if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode |
|
- | 624 | // 0 = AID; 100 = free; 200 = coming home //so war es |
|
- | 625 | // 0 = free; 100 = AID; 200 = coming home //neu |
|
- | 626 | ||
- | 627 | ||
522 | MAX_GAS = EE_Parameter.Gas_Max; |
628 | MAX_GAS = EE_Parameter.Gas_Max; |
523 | MIN_GAS = EE_Parameter.Gas_Min; |
629 | MIN_GAS = EE_Parameter.Gas_Min; |
524 | } |
630 | } |
Line 531... | Line 637... | ||
531 | //############################################################################ |
637 | //############################################################################ |
532 | { |
638 | { |
533 | int pd_ergebnis_nick,pd_ergebnis_roll,h,tmp_int; |
639 | int pd_ergebnis_nick,pd_ergebnis_roll,h,tmp_int; |
534 | int GierMischanteil,GasMischanteil; |
640 | int GierMischanteil,GasMischanteil; |
535 | static long SummeNick=0,SummeRoll=0; |
641 | static long SummeNick=0,SummeRoll=0; |
- | 642 | ||
- | 643 | static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung |
|
- | 644 | ||
536 | static long sollGier = 0,tmp_long,tmp_long2; |
645 | static long sollGier = 0,tmp_long,tmp_long2; |
537 | static long IntegralFehlerNick = 0; |
646 | static long IntegralFehlerNick = 0; |
538 | static long IntegralFehlerRoll = 0; |
647 | static long IntegralFehlerRoll = 0; |
539 | static unsigned int RcLostTimer; |
648 | static unsigned int RcLostTimer; |
540 | static unsigned char delay_neutral = 0; |
649 | static unsigned char delay_neutral = 0; |
Line 696... | Line 805... | ||
696 | Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
805 | Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
697 | Mess_IntegralNick2 = IntegralNick; |
806 | Mess_IntegralNick2 = IntegralNick; |
698 | Mess_IntegralRoll2 = IntegralRoll; |
807 | Mess_IntegralRoll2 = IntegralRoll; |
699 | SummeNick = 0; |
808 | SummeNick = 0; |
700 | SummeRoll = 0; |
809 | SummeRoll = 0; |
- | 810 | SchwebeGas = 0; // MartinR: für neuen Höhenregler |
|
701 | MikroKopterFlags |= FLAG_START; |
811 | MikroKopterFlags |= FLAG_START; |
702 | } |
812 | } |
703 | } |
813 | } |
704 | else delay_einschalten = 0; |
814 | else delay_einschalten = 0; |
705 | //Auf Neutralwerte setzen |
815 | //Auf Neutralwerte setzen |
Line 725... | Line 835... | ||
725 | 835 | ||
726 | if(!NewPpmData-- || Notlandung) |
836 | if(!NewPpmData-- || Notlandung) |
727 | { |
837 | { |
728 | static int stick_nick,stick_roll; |
838 | static int stick_nick,stick_roll; |
- | 839 | ParameterZuordnung(); |
|
- | 840 | ||
- | 841 | // MartinR: original: |
|
729 | ParameterZuordnung(); |
842 | /* |
730 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
843 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
731 | stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
844 | stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
Line 732... | Line 845... | ||
732 | StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
845 | StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
733 | 846 | ||
734 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
847 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
- | 848 | stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
|
- | 849 | StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
|
- | 850 | |
|
- | 851 | */ |
|
- | 852 | // MartinR: geändert Anfang |
|
- | 853 | if(Parameter_UserParam1 > 140) // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist |
|
- | 854 | { |
|
- | 855 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4; |
|
- | 856 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ; |
|
- | 857 | } |
|
- | 858 | ||
- | 859 | else |
|
- | 860 | ||
- | 861 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
|
- | 862 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
|
- | 863 | ||
- | 864 | ||
- | 865 | if(IntegralFaktor) |
|
- | 866 | { |
|
- | 867 | stick_nick_neutral = stick_nick; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
|
- | 868 | stick_roll_neutral = stick_roll; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
|
- | 869 | stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
|
- | 870 | stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
|
- | 871 | ||
- | 872 | StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 873 | StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 874 | } |
|
- | 875 | else // wenn HH , MartinR |
|
- | 876 | { |
|
- | 877 | stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
|
- | 878 | stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
|
- | 879 | StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 880 | StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 881 | } |
|
- | 882 | ||
Line 735... | Line 883... | ||
735 | stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
883 | // MartinR: geändert Ende |
736 | StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
884 | |
737 | 885 | ||
Line 746... | Line 894... | ||
746 | IntegralFaktorGier = Parameter_Gyro_I; |
894 | IntegralFaktorGier = Parameter_Gyro_I; |
Line 747... | Line 895... | ||
747 | 895 | ||
748 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
896 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
749 | //+ Analoge Steuerung per Seriell |
897 | //+ Analoge Steuerung per Seriell |
- | 898 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 899 | // MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen?? |
|
750 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
900 | |
751 | if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
901 | if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
752 | { |
902 | { |
753 | StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
903 | StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
754 | StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
904 | StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
755 | StickGier += ExternControl.Gier; |
905 | StickGier += ExternControl.Gier; |
756 | ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
906 | ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
757 | if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
907 | if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
758 | } |
908 | } |
Line 759... | Line 909... | ||
759 | if(StickGas < 0) StickGas = 0; |
909 | if(StickGas < 0) StickGas = 0; |
- | 910 | ||
- | 911 | //if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; // MartinR: Original |
|
760 | 912 | if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR |
|
761 | if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
913 | |
Line 762... | Line 914... | ||
762 | if(GyroFaktor < 0) GyroFaktor = 0; |
914 | if(GyroFaktor < 0) GyroFaktor = 0; |
763 | if(IntegralFaktor < 0) IntegralFaktor = 0; |
915 | if(IntegralFaktor < 0) IntegralFaktor = 0; |
Line 848... | Line 1000... | ||
848 | MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
1000 | MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
849 | MittelIntegralRoll += IntegralRoll; |
1001 | MittelIntegralRoll += IntegralRoll; |
850 | MittelIntegralNick2 += IntegralNick2; |
1002 | MittelIntegralNick2 += IntegralNick2; |
851 | MittelIntegralRoll2 += IntegralRoll2; |
1003 | MittelIntegralRoll2 += IntegralRoll2; |
Line 852... | Line 1004... | ||
852 | 1004 | ||
- | 1005 | //if(Looping_Nick || Looping_Roll) // MartinR: so war es |
|
853 | if(Looping_Nick || Looping_Roll) |
1006 | if(Looping_Nick || Looping_Roll || !IntegralFaktor) // MartinR: "|| !IntegralFaktor" hinzugefügt |
854 | { |
1007 | { |
855 | IntegralAccNick = 0; |
1008 | IntegralAccNick = 0; |
856 | IntegralAccRoll = 0; |
1009 | IntegralAccRoll = 0; |
857 | MittelIntegralNick = 0; |
1010 | MittelIntegralNick = 0; |
858 | MittelIntegralRoll = 0; |
1011 | MittelIntegralRoll = 0; |
859 | MittelIntegralNick2 = 0; |
1012 | MittelIntegralNick2 = 0; |
- | 1013 | MittelIntegralRoll2 = 0; |
|
- | 1014 | ||
- | 1015 | IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 1016 | IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 1017 | Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 1018 | Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 1019 | Mess_Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 1020 | Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
860 | MittelIntegralRoll2 = 0; |
1021 | |
861 | Mess_IntegralNick2 = Mess_IntegralNick; |
1022 | Mess_IntegralNick2 = Mess_IntegralNick; |
862 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
1023 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
863 | ZaehlMessungen = 0; |
1024 | ZaehlMessungen = 0; |
864 | LageKorrekturNick = 0; |
1025 | LageKorrekturNick = 0; |
865 | LageKorrekturRoll = 0; |
1026 | LageKorrekturRoll = 0; |
Line 866... | Line 1027... | ||
866 | } |
1027 | } |
867 | 1028 | ||
868 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1029 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
869 | if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) |
1030 | if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
870 | { |
1031 | { |
871 | long tmp_long, tmp_long2; |
1032 | long tmp_long, tmp_long2; |
872 | if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
1033 | if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
Line 922... | Line 1083... | ||
922 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
1083 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
923 | { |
1084 | { |
924 | static int cnt = 0; |
1085 | static int cnt = 0; |
925 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
1086 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
926 | static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
1087 | static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
927 | if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
1088 | if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
928 | { |
1089 | { |
929 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
1090 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
930 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
1091 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
931 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
1092 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
932 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
1093 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
Line 1181... | Line 1342... | ||
1181 | DebugOut.Analog[10] = SenderOkay; |
1342 | DebugOut.Analog[10] = SenderOkay; |
1182 | //DebugOut.Analog[16] = Mittelwert_AccHoch; |
1343 | //DebugOut.Analog[16] = Mittelwert_AccHoch; |
1183 | //DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1344 | //DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1184 | //DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1345 | //DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1185 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1346 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1186 | DebugOut.Analog[20] = ServoValue; |
1347 | //DebugOut.Analog[20] = ServoValue; // MartinR: DebugOut.Analog[20] wird in timer0.c ausgegeben!! |
1187 | // DebugOut.Analog[24] = MesswertNick/2; |
1348 | // DebugOut.Analog[24] = MesswertNick/2; |
1188 | // DebugOut.Analog[25] = MesswertRoll/2; |
1349 | // DebugOut.Analog[25] = MesswertRoll/2; |
1189 | DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
1350 | DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
1190 | // DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
1351 | // DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
1191 | // DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
1352 | // DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
Line 1230... | Line 1391... | ||
1230 | if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
1391 | if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
Line 1231... | Line 1392... | ||
1231 | 1392 | ||
1232 | #define TRIM_MAX 200 |
1393 | #define TRIM_MAX 200 |
1233 | if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
1394 | if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
1234 | if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
1395 | if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
- | 1396 | ||
- | 1397 | if(!IntegralFaktor) // MartinR : hinzugefügt |
|
- | 1398 | { |
|
- | 1399 | MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
|
- | 1400 | MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
|
- | 1401 | } |
|
- | 1402 | else // MartinR so war es |
|
1235 | 1403 | { |
|
1236 | MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
1404 | MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
- | 1405 | MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
|
- | 1406 | } |
|
1237 | MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
1407 | |
Line 1238... | Line 1408... | ||
1238 | MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
1408 | MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
- | 1409 | ||
1239 | 1410 | // Maximalwerte abfangen |
|
1240 | // Maximalwerte abfangen |
1411 | // MartinR : Prüfen ob Unterscheidung nach Platinenversion erforderlich? |
1241 | // #define MAX_SENSOR (4096*STICK_GAIN) |
1412 | // #define MAX_SENSOR (4096*STICK_GAIN) |
1242 | #define MAX_SENSOR (4096*4) |
1413 | #define MAX_SENSOR (4096*4) |
1243 | if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
1414 | if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
Line 1259... | Line 1430... | ||
1259 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1430 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1260 | // Höhenregelung |
1431 | // Höhenregelung |
1261 | // Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
1432 | // Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
1262 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1433 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1263 | GasMischanteil *= STICK_GAIN; |
1434 | GasMischanteil *= STICK_GAIN; |
- | 1435 | ||
- | 1436 | // MartinR : so war es: |
|
- | 1437 | /* |
|
1264 | if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
1438 | if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
1265 | { |
1439 | { |
1266 | int tmp_int; |
1440 | int tmp_int; |
1267 | static char delay = 100; |
1441 | static char delay = 100; |
1268 | if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
1442 | if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
Line 1334... | Line 1508... | ||
1334 | if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
1508 | if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
1335 | GasMischanteil = hoehenregler; |
1509 | GasMischanteil = hoehenregler; |
1336 | } |
1510 | } |
1337 | } |
1511 | } |
1338 | if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
1512 | if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
- | 1513 | */ |
|
- | 1514 | ||
- | 1515 | // MartinR: Neuer Höhenregler von MartinR: Anfang |
|
- | 1516 | ||
- | 1517 | if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
|
- | 1518 | { |
|
- | 1519 | int tmp_int; |
|
- | 1520 | static char delay = 100; |
|
- | 1521 | // Definitionen Vorschlag Killagreg Anfang |
|
- | 1522 | #define HOOVER_GAS_AVERAGE 4192 // 4192 * 2ms = 8.2s averaging |
|
- | 1523 | #define HEIGHT_CONTROL_GAS_AVERAGE 16 |
|
- | 1524 | int16_t CosNick, CosRoll; |
|
- | 1525 | //int16_t HeightControlGas; // MartinR: Schwebegas |
|
- | 1526 | //static int16_t FilterHeightControlGas = 0; // MartinR: SchwebegasFilter |
|
- | 1527 | static uint32_t HooverGasEstimation = 0; |
|
- | 1528 | //static uint8_t delay = 100; |
|
- | 1529 | ||
- | 1530 | int32_t tmp_long3; |
|
- | 1531 | // Ende Definitionen Vorschlag Killagreg |
|
- | 1532 | ||
- | 1533 | // calculate cos of nick and roll angle used for projection of the vertical hoover gas // Vorschlag von Killagerg: |
|
- | 1534 | CosNick = IntegralNick/GIER_GRAD_FAKTOR; // nick angle in deg // =IntegralNick/GIER_GRAD_FAKTOR |
|
- | 1535 | CHECK_MIN_MAX(CosNick, -60, 60); // limit nick angle |
|
- | 1536 | CosNick = c_cos_8192(CosNick); |
|
- | 1537 | CosRoll = IntegralRoll/GIER_GRAD_FAKTOR; // roll angle in deg |
|
- | 1538 | CHECK_MIN_MAX(CosRoll, -60, 60); // limit roll angle |
|
- | 1539 | CosRoll = c_cos_8192(CosRoll); |
|
- | 1540 | ||
- | 1541 | ||
- | 1542 | // Neigungskorrektur ACCHoch: |
|
- | 1543 | tmp_long3 = (int32_t) (NeutralAccZ-(Parameter_UserParam6*4)); // take current thrust |
|
- | 1544 | tmp_long3 *= CosNick; // apply nick projection |
|
- | 1545 | tmp_long3 /= 8192; tmp_long3 *= CosRoll; // apply roll projection |
|
- | 1546 | tmp_long3 /= 8129; // average vertical projected thrust |
|
- | 1547 | ||
- | 1548 | //Mess_Integral_Hoch += AdWertAccHoch; // Integrieren // MartinR: zu Höhenregler in fc.c verschoben |
|
- | 1549 | //Mess_Integral_Hoch += tmp_long3; // Integrieren // MartinR: mit Neigungskorrektur // Test |
|
- | 1550 | ||
- | 1551 | tmp_int = (int16_t) (AdWertAccHoch + NeutralAccZ - tmp_long3 - (Parameter_UserParam6*4)); |
|
- | 1552 | if (tmp_int < 0) tmp_int ++ ; // MartinR: Digitalisierungsrauschen abmindern |
|
- | 1553 | if (tmp_int > 0) tmp_int -- ; // MartinR: entspricht - 1 Bit |
|
- | 1554 | ||
- | 1555 | Mess_Integral_Hoch += tmp_int; // Integrieren // MartinR: mit Neigungskorrektur |
|
- | 1556 | Mess_Integral_Hoch -= Mess_Integral_Hoch / 256; // dämfen // MartinR: zu Höhenregler in fc.c verschoben |
|
- | 1557 | CHECK_MIN_MAX(Mess_Integral_Hoch, -16000, 16000); // limit |
|
- | 1558 | ||
- | 1559 | ||
- | 1560 | // MartinR: Änderungen HoheD und D-Anteil Höhenregler (h_d) Anfang : |
|
- | 1561 | HoehenWertSumme += HoehenWert ; |
|
- | 1562 | //if (++ iHoehe >= 40) // MartinR: Wartezeit um auch kleine Änderungsgeschwindigkeiten erkennen zu können |
|
- | 1563 | if (++ iHoehe >= Parameter_UserParam5) // MartinR: Wartezeit einstellbar |
|
- | 1564 | { |
|
- | 1565 | HoehenWertSumme = HoehenWertSumme / iHoehe ; // MartinR: Mittelwert während der Wartezeit |
|
- | 1566 | HoeheD = (int) Parameter_Luftdruck_D * (HoehenWert - HoehenWertalt) ; |
|
- | 1567 | if (HoeheD < 0) HoeheD += Parameter_Luftdruck_D ; // MartinR: Digitalisierungsrauschen abmindern |
|
- | 1568 | if (HoeheD > 0) HoeheD -= Parameter_Luftdruck_D ; // MartinR: entspricht - 1 Bit vom Höhenwert |
|
- | 1569 | ||
- | 1570 | iHoehe = 0 ; |
|
- | 1571 | HoehenWertalt = HoehenWertSumme ; |
|
- | 1572 | HoehenWertSumme = 0 ; |
|
- | 1573 | } |
|
- | 1574 | // D-Anteil berechnen: |
|
- | 1575 | h_d = (int) (HoeheD)/(64/STICK_GAIN); // D-Anteil (8*8=64) |
|
- | 1576 | // ACC-D-Anteil |
|
- | 1577 | tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
|
- | 1578 | if(tmp_int > 50*STICK_GAIN) tmp_int = 50*STICK_GAIN; |
|
- | 1579 | else if(tmp_int < -(50*STICK_GAIN)) tmp_int = -(50*STICK_GAIN); |
|
- | 1580 | h_d += tmp_int; // positiver D-Anteil bedeutet Steigen |
|
- | 1581 | ||
- | 1582 | // MartinR: Änderungen HoheD und D-Anteil Höhenregler (h_d) Ende |
|
- | 1583 | ||
- | 1584 | ||
- | 1585 | if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
|
- | 1586 | { |
|
- | 1587 | //if(Parameter_MaxHoehe < 50) // MartinR :so war es |
|
- | 1588 | ||
- | 1589 | ||
- | 1590 | if(Parameter_MaxHoehe < 50 || (Parameter_UserParam1 > 140) ) // MartinR: Schalter aus oder HH über UsererParam1 an |
|
- | 1591 | { |
|
- | 1592 | // Höhenregler nicht aktiv |
|
- | 1593 | if(!delay--) |
|
- | 1594 | { |
|
- | 1595 | #define OPA_OFFSET_STEP 10 |
|
- | 1596 | if((MessLuftdruck > 1000) && (OCR0A < (255 - OPA_OFFSET_STEP)) ) |
|
- | 1597 | { |
|
- | 1598 | ExpandBaro -= 1; |
|
- | 1599 | OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; |
|
- | 1600 | beeptime = 300; |
|
- | 1601 | delay = 250; |
|
- | 1602 | } |
|
- | 1603 | else if((MessLuftdruck < 100) && (OCR0A > OPA_OFFSET_STEP)) |
|
- | 1604 | { |
|
- | 1605 | ExpandBaro += 1; |
|
- | 1606 | OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; |
|
- | 1607 | beeptime = 300; |
|
- | 1608 | delay = 250; |
|
- | 1609 | } |
|
- | 1610 | else |
|
- | 1611 | if((MessLuftdruck < 100) && OCR0A > 1) |
|
- | 1612 | { |
|
- | 1613 | if(OCR0A > 10) |
|
- | 1614 | { |
|
- | 1615 | ExpandBaro += 10; |
|
- | 1616 | OCR0A = DruckOffsetSetting - ExpandBaro; |
|
- | 1617 | } |
|
- | 1618 | else OCR0A = 1; |
|
- | 1619 | beeptime = 300; |
|
- | 1620 | delay = 250; |
|
- | 1621 | } |
|
- | 1622 | else |
|
- | 1623 | { |
|
- | 1624 | //SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters // MartinR : so war es |
|
- | 1625 | SollHoehe = HoehenWert; // MartinR : geändert |
|
- | 1626 | HoehenReglerAktiv = 0; |
|
- | 1627 | delay = 1; |
|
- | 1628 | } |
|
- | 1629 | } |
|
- | 1630 | SollHoehe = HoehenWert; // MartinR: SollHoehe wird nachgeführt bis HoehenreglerAktiv = 1 |
|
- | 1631 | //SchwebeGas = GasMischanteil; // MartinR: SchwebeGas wird nachgeführt bis HoehenreglerAktiv = 1 |
|
- | 1632 | // Deaktiv wegen HooverGasEstimation/HOOVER_GAS_AVERAGE |
|
- | 1633 | ||
- | 1634 | HoehenReglerAktiv = 0; // MartinR: zur Sicherheit |
|
- | 1635 | } |
|
- | 1636 | else // Schalter an und kein HH über Schalter |
|
- | 1637 | { |
|
- | 1638 | HoehenReglerAktiv = 1; |
|
- | 1639 | // Schwebegas ist der letzte GasMischanteil vor dem Aktivieren der Höhenregelung |
|
- | 1640 | delay = 200; |
|
- | 1641 | } |
|
- | 1642 | } |
|
- | 1643 | else // Sollhöhe über Poti |
|
- | 1644 | { |
|
- | 1645 | //SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; // MartinR : so war es |
|
- | 1646 | //HoehenReglerAktiv = 1; // MartinR : so war es |
|
- | 1647 | if(Parameter_UserParam1 > 140) // HH über Schalter: Höhenregler abgeschaltet, Nachführen von Parametern |
|
- | 1648 | { |
|
- | 1649 | SollHoehe = HoehenWert; // SollHoehe wird nachgeführt bis HoehenreglerAktiv = 1 |
|
- | 1650 | HoehenReglerAktiv = 0; |
|
- | 1651 | } |
|
- | 1652 | else // Höhenregler mit Sollhöhe über Poti aktiv |
|
- | 1653 | { |
|
- | 1654 | // SchwebeGas = GasMischanteil; // SchwebeGas zunächst = Gasmischanteil bis bessere Lösung |
|
- | 1655 | // Deaktiv wegen HooverGasEstimation/HOOVER_GAS_AVERAGE |
|
- | 1656 | HoehenReglerAktiv = 1; |
|
- | 1657 | // MartinR: Versuch Höhenregler zu verlangsamen. Steig- / Sinkrate im MK-Tool über UserParam4 einstellbar |
|
- | 1658 | if (((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20 > SollHoehe) |
|
- | 1659 | { |
|
- | 1660 | if(++delay_Hoehenregler > (Parameter_UserParam4 / 4)) |
|
- | 1661 | { |
|
- | 1662 | delay_Hoehenregler = 0; |
|
- | 1663 | SollHoehe ++ ; //MartinR: Höhenänderung begrenzen. |
|
- | 1664 | } |
|
- | 1665 | } |
|
- | 1666 | else |
|
- | 1667 | { |
|
- | 1668 | if (((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20 < SollHoehe) |
|
- | 1669 | { |
|
- | 1670 | if(++delay_Hoehenregler > (Parameter_UserParam4 / 4)) |
|
- | 1671 | { |
|
- | 1672 | delay_Hoehenregler = 0; |
|
- | 1673 | SollHoehe -- ; //MartinR: Höhenänderung begrenzen. |
|
- | 1674 | } |
|
- | 1675 | } |
|
- | 1676 | } |
|
- | 1677 | } |
|
- | 1678 | } |
|
- | 1679 | ||
- | 1680 | if(Notlandung) SollHoehe = 0; |
|
- | 1681 | ||
- | 1682 | if(HoehenReglerAktiv && !(Parameter_UserParam1 > 140)) // kein HH |
|
- | 1683 | { |
|
- | 1684 | h_delta = (int) SollHoehe - (int) HoehenWert; // positiver Wert: MK ist unterhalb der Sollhöhe |
|
- | 1685 | ||
- | 1686 | h_p = (h_delta * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
|
- | 1687 | ||
- | 1688 | ||
- | 1689 | /* an Anfang Höhenregler verschoben, da h_d für Schwebegas- Abschätzung verwendet wird |
|
- | 1690 | h_d = (int) (HoeheD)/(64/STICK_GAIN); // D-Anteil (8*8=64) |
|
- | 1691 | // ACC-D-Anteil |
|
- | 1692 | tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
|
- | 1693 | if(tmp_int > 50*STICK_GAIN) tmp_int = 50*STICK_GAIN; |
|
- | 1694 | else if(tmp_int < -(50*STICK_GAIN)) tmp_int = -(50*STICK_GAIN); |
|
- | 1695 | h_d += tmp_int; // positiver D-Anteil bedeutet Steigen |
|
- | 1696 | */ |
|
- | 1697 | ||
- | 1698 | ||
- | 1699 | //if(HooverGasEstimation == 0) HeightControlGas = GasMixFraction; // take stick gas // MartinR: SchwebeGas = GasMischanteil; |
|
- | 1700 | if(HooverGasEstimation == 0) SchwebeGas = GasMischanteil; |
|
- | 1701 | else SchwebeGas = (int16_t)(HooverGasEstimation/HOOVER_GAS_AVERAGE); // take hoover point |
|
- | 1702 | // MartinR: SchwebeGas = HooverGasEstimation/HOOVER_GAS_AVERAGE |
|
- | 1703 | ||
- | 1704 | h = SchwebeGas + h_p - h_d ; |
|
- | 1705 | ||
- | 1706 | // strech by actual attitude projection // Neigungskorrektur |
|
- | 1707 | tmp_long3 = (int32_t)h; // MartinR: HeightControlGas = h |
|
- | 1708 | tmp_long3 *= 8192; tmp_long3 /= CosNick; |
|
- | 1709 | tmp_long3 *= 8192; tmp_long3 /= CosRoll; |
|
- | 1710 | h = (int16_t)tmp_long3; |
|
- | 1711 | ||
- | 1712 | hoehenregler = (hoehenregler*7 + h) / 8; |
|
- | 1713 | ||
- | 1714 | if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
|
- | 1715 | { |
|
- | 1716 | if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
|
- | 1717 | if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
|
- | 1718 | } |
|
- | 1719 | if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
|
- | 1720 | //else hoehenregler += (GasMischanteil-hoehenregler)/16 ; // um die Höhe noch leicht mit Gas korrigieren zu können |
|
- | 1721 | //if(SchwebeGas < 20) SchwebeGas = 20; // nicht unter 20 |
|
- | 1722 | ||
- | 1723 | GasMischanteil = hoehenregler; |
|
- | 1724 | } |
|
- | 1725 | else // Integratoren auf Null halten |
|
- | 1726 | { |
|
- | 1727 | Mess_Integral_Hoch = 0; |
|
- | 1728 | hoehenregler = GasMischanteil; |
|
- | 1729 | // h_p = 0 ; |
|
- | 1730 | // h_d = 0 ; |
|
- | 1731 | } |
|
- | 1732 | // Hoover gas estimation by averaging gas control output on small z-velocities |
|
- | 1733 | // this is done only if height contol option is selected in global config and aircraft is flying |
|
- | 1734 | if(MikroKopterFlags & FLAG_FLY) //MikroKopterFlags FLAG_FLY |
|
- | 1735 | { |
|
- | 1736 | if(HooverGasEstimation == 0) HooverGasEstimation = HOOVER_GAS_AVERAGE * (uint32_t)GasMischanteil; // init estimation |
|
- | 1737 | // HOOVER_GAS_AVERAGE= 4192 |
|
- | 1738 | if(abs(h_d) < 8) |
|
- | 1739 | { |
|
- | 1740 | tmp_long3 = (int32_t)GasMischanteil; // take current thrust |
|
- | 1741 | tmp_long3 *= CosNick; // apply nick projection |
|
- | 1742 | tmp_long3 /= 8192; tmp_long3 *= CosRoll; // apply roll projection |
|
- | 1743 | tmp_long3 /= 8129; // average vertical projected thrust |
|
- | 1744 | HooverGasEstimation -= HooverGasEstimation/HOOVER_GAS_AVERAGE; |
|
- | 1745 | HooverGasEstimation += tmp_long3; |
|
- | 1746 | } |
|
- | 1747 | } |
|
- | 1748 | ||
- | 1749 | DebugOut.Analog[16] = HooverGasEstimation/HOOVER_GAS_AVERAGE; |
|
- | 1750 | //DebugOut.Analog[16] = Mess_Integral_Hoch; |
|
- | 1751 | DebugOut.Analog[17] = h_d; |
|
- | 1752 | ||
- | 1753 | } // EOF: EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG |
|
- | 1754 | ||
- | 1755 | ||
- | 1756 | if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
|
- | 1757 | ||
- | 1758 | // MartinR: Ende neuer Höhenregler |
|
Line 1339... | Line 1759... | ||
1339 | 1759 | ||
1340 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1760 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1341 | // + Mischer und PI-Regler |
1761 | // + Mischer und PI-Regler |
1342 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1762 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 1364... | Line 1784... | ||
1364 | 1784 | ||
1365 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1785 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1366 | // Nick-Achse |
1786 | // Nick-Achse |
1367 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1787 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
- | 1788 | DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
|
- | 1789 | ||
- | 1790 | // MartinR : so war es Anfang |
|
1368 | DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
1791 | /* |
1369 | if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
1792 | if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
1370 | else SummeNick += DiffNick; // I-Anteil bei HH |
1793 | else SummeNick += DiffNick; // I-Anteil bei HH |
1371 | if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
1794 | if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
1372 | if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
1795 | if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
1373 | pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
1796 | pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
- | 1797 | // Motor Vorn |
|
- | 1798 | */ |
|
- | 1799 | // MartinR : so war es Ende |
|
- | 1800 | // MartinR : geändert Anfang |
|
- | 1801 | ||
- | 1802 | if(IntegralFaktor) // MartinR : ACC-Mode |
|
- | 1803 | { |
|
- | 1804 | SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
|
- | 1805 | if(SummeNick > (STICK_GAIN * 8000L)) SummeNick = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
|
- | 1806 | if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
|
- | 1807 | pd_ergebnis_nick = DiffNick + (SummeNick / Ki); |
|
- | 1808 | SummeNickHH = 0 ; |
|
- | 1809 | } |
|
- | 1810 | else // MartinR : HH-Mode |
|
- | 1811 | { |
|
- | 1812 | SummeNickHH += DiffNick; // I-Anteil bei HH |
|
- | 1813 | if(SummeNickHH > (STICK_GAIN * 8000L)) SummeNickHH = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
|
- | 1814 | if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
|
- | 1815 | pd_ergebnis_nick = DiffNick + SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH |
|
- | 1816 | SummeNick = 0; |
|
- | 1817 | } |
|
- | 1818 | ||
- | 1819 | // MartinR : geändert Ende |
|
1374 | // Motor Vorn |
1820 | |
1375 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1821 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1376 | if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
1822 | if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
Line 1377... | Line 1823... | ||
1377 | if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
1823 | if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
1378 | 1824 | ||
1379 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1825 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1380 | // Roll-Achse |
1826 | // Roll-Achse |
- | 1827 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 1828 | DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
|
- | 1829 | ||
1381 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1830 | // MartinR : so war es Anfang |
1382 | DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
1831 | /* |
1383 | if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
1832 | if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
1384 | else SummeRoll += DiffRoll; // I-Anteil bei HH |
1833 | else SummeRoll += DiffRoll; // I-Anteil bei HH |
1385 | if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
1834 | if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
- | 1835 | if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
|
- | 1836 | pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
|
- | 1837 | */ |
|
- | 1838 | // MartinR : so war es Ende |
|
- | 1839 | // MartinR : geändert Anfang |
|
- | 1840 | ||
- | 1841 | if(IntegralFaktor) // MartinR : ACC-Mode |
|
- | 1842 | { |
|
- | 1843 | SummeRoll += IntegralRollMalFaktor - StickRoll; |
|
- | 1844 | if(SummeRoll > (STICK_GAIN * 8000L)) SummeRoll = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
|
- | 1845 | if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
|
- | 1846 | tmp_int = SummeRoll / Ki; |
|
- | 1847 | pd_ergebnis_roll = DiffRoll + tmp_int; // MartinR: PI-Regler im ACC-Mode |
|
- | 1848 | //SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH |
|
- | 1849 | // MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern! |
|
- | 1850 | SummeRollHH = 0; |
|
- | 1851 | } |
|
- | 1852 | else // MartinR : HH-Mode |
|
- | 1853 | { |
|
- | 1854 | SummeRollHH += DiffRoll; // I-Anteil bei HH |
|
- | 1855 | if(SummeRollHH > (STICK_GAIN * 8000L)) SummeRollHH = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
|
- | 1856 | if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
|
- | 1857 | pd_ergebnis_roll = DiffRoll + SummeRollHH / KiHH; // MartinR: PI-Regler für Roll bei HH |
|
- | 1858 | SummeRoll = 0; |
|
- | 1859 | } |
|
- | 1860 | ||
1386 | if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
1861 | // MartinR : geändert Ende |
1387 | pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
1862 | |
1388 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1863 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
Line 1389... | Line 1864... | ||
1389 | if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
1864 | if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |