Subversion Repositories FlightCtrl

Rev

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

Rev 1155 Rev 1166
Line 56... Line 56...
56
#include "eeprom.c"
56
#include "eeprom.c"
Line 57... Line 57...
57
 
57
 
58
unsigned char h,m,s;
58
unsigned char h,m,s;
59
volatile unsigned int I2CTimeout = 100;
59
volatile unsigned int I2CTimeout = 100;
-
 
60
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll;
60
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll;
61
int TrimNick, TrimRoll;
61
int AdNeutralGierBias;
62
int AdNeutralGierBias;
62
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
63
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0;
63
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
64
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
64
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
65
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0;
Line 87... Line 88...
87
int   GierGyroFehler = 0;
88
int   GierGyroFehler = 0;
88
char GyroFaktor;
89
char GyroFaktor;
89
char IntegralFaktor;
90
char IntegralFaktor;
90
int  DiffNick,DiffRoll;
91
int  DiffNick,DiffRoll;
91
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
92
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
92
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
93
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links;
93
volatile unsigned char Motor1, Motor2,Motor3,Motor4,Motor5,Motor6,Motor7,Motor8;
94
volatile unsigned char Motor1, Motor2,Motor3,Motor4,Motor5,Motor6,Motor7,Motor8;
94
volatile unsigned char SenderOkay = 0;
95
volatile unsigned char SenderOkay = 0;
95
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
96
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
96
char MotorenEin = 0;
97
char MotorenEin = 0;
97
int HoehenWert = 0;
98
int HoehenWert = 0;
Line 148... Line 149...
148
unsigned char MikroKopterFlags = 0;
149
unsigned char MikroKopterFlags = 0;
149
long GIER_GRAD_FAKTOR = 1291;
150
long GIER_GRAD_FAKTOR = 1291;
150
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
151
signed int KopplungsteilNickRoll,KopplungsteilRollNick;
Line -... Line 152...
-
 
152
 
-
 
153
 
-
 
154
int MotorSmoothing(int neu, int alt)
-
 
155
{
-
 
156
 int motor;
-
 
157
 if(neu > alt) motor = (1*(int)alt + neu) / 2;
-
 
158
 else   motor = neu - (alt - neu)*1;
-
 
159
//if(Poti2 < 20)  return(neu);
-
 
160
 return(motor);
-
 
161
}
151
 
162
 
152
 
163
 
153
void Piep(unsigned char Anzahl)
164
void Piep(unsigned char Anzahl)
154
{
165
{
155
 while(Anzahl--)
166
 while(Anzahl--)
Line 182... Line 193...
182
        CalibrierMittelwert();
193
        CalibrierMittelwert();
183
    if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // Höhenregelung aktiviert?
194
    if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // Höhenregelung aktiviert?
184
     {
195
     {
185
      if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
196
      if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
186
     }
197
     }
-
 
198
#define NEUTRAL_FILTER 32
187
    for(i=0; i<32; i++)
199
    for(i=0; i<NEUTRAL_FILTER; i++)
188
         {
200
         {
189
          Delay_ms_Mess(10);
201
          Delay_ms_Mess(10);
190
          gier_neutral += AdWertGier;
202
          gier_neutral += AdWertGier;
191
          nick_neutral += MesswertNick;
203
          nick_neutral += AdWertNick;
192
          roll_neutral += MesswertRoll;
204
          roll_neutral += AdWertRoll;
193
         }
205
         }
194
     AdNeutralNick= nick_neutral / 32;
206
     AdNeutralNick= nick_neutral / NEUTRAL_FILTER;
195
         AdNeutralRoll= roll_neutral / 32;
207
         AdNeutralRoll= roll_neutral / NEUTRAL_FILTER;
196
         AdNeutralGier= gier_neutral / 32;
208
         AdNeutralGier= gier_neutral / NEUTRAL_FILTER;
197
     AdNeutralGierBias = AdNeutralGier;
209
     AdNeutralGierBias = AdNeutralGier;
198
     StartNeutralRoll = AdNeutralRoll;
210
     StartNeutralRoll = AdNeutralRoll;
199
     StartNeutralNick = AdNeutralNick;
211
     StartNeutralNick = AdNeutralNick;
200
    if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4)
212
    if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4)
201
    {
213
    {
202
      NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY);
214
      NeutralAccY = abs(Mittelwert_AccRoll) / (4*ACC_AMPLIFY);
203
          NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY);
215
          NeutralAccX = abs(Mittelwert_AccNick) / (4*ACC_AMPLIFY);
204
          NeutralAccZ = Aktuell_az;
216
          NeutralAccZ = Aktuell_az;
205
    }
217
    }
206
    else
218
    else
207
    {
219
    {
208
      NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]);
220
      NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]);
Line 247... Line 259...
247
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
259
        static signed int oldNick, oldRoll, d2Roll, d2Nick;
248
        signed int tmp_int;
260
        signed int tmp_int;
249
        signed long winkel_nick, winkel_roll;
261
        signed long winkel_nick, winkel_roll;
250
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
262
        MesswertGier = (signed int) AdNeutralGier - AdWertGier;
251
//    MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier;
263
//    MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier;
252
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
264
    MesswertNick = (signed int) AdWertNickFilter / 20;
253
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
265
    MesswertRoll = (signed int) AdWertRollFilter / 20;
254
    RohMesswertNick = MesswertNick;
266
    RohMesswertNick = MesswertNick;
255
    RohMesswertRoll = MesswertRoll;
267
    RohMesswertRoll = MesswertRoll;
256
//DebugOut.Analog[21] = MesswertNick;
268
//DebugOut.Analog[21] = MesswertNick;
257
//DebugOut.Analog[22] = MesswertRoll;
269
//DebugOut.Analog[22] = MesswertRoll;
258
//DebugOut.Analog[22] = Mess_Integral_Gier;
270
//DebugOut.Analog[22] = Mess_Integral_Gier;
Line -... Line 271...
-
 
271
 
-
 
272
//DebugOut.Analog[21] = MesswertNick;  
-
 
273
//DebugOut.Analog[22] = MesswertRoll; 
259
 
274
 
260
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
275
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
261
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
276
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 4L;
262
        Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L;
277
        Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 4L;
263
        Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L;
278
        Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 3 + ((long)AdWertAccHoch)) / 4L;
264
    IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;
279
    IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;
265
    IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll;
280
    IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll;
266
    NaviAccNick    += AdWertAccNick;
281
    NaviAccNick    += AdWertAccNick;
267
    NaviAccRoll    += AdWertAccRoll;
282
    NaviAccRoll    += AdWertAccRoll;
268
    NaviCntAcc++;
283
    NaviCntAcc++;
Line 269... Line -...
269
    IntegralAccZ  += Aktuell_az - NeutralAccZ;
-
 
270
 
-
 
271
if(abs(Mittelwert_AccRoll > 50)) { DebugOut.Analog[16]++; DebugOut.Analog[17] = Mittelwert_AccRoll;};
284
    IntegralAccZ  += Aktuell_az - NeutralAccZ;
272
 
285
 
273
//++++++++++++++++++++++++++++++++++++++++++++++++
286
//++++++++++++++++++++++++++++++++++++++++++++++++
274
// ADC einschalten
287
// ADC einschalten
275
        AdReady = 0;
288
        AdReady = 0;
Line 299... Line 312...
299
            tmpl4 /= 4096L;
312
            tmpl4 /= 4096L;
300
            KopplungsteilNickRoll = tmpl3;
313
            KopplungsteilNickRoll = tmpl3;
301
            KopplungsteilRollNick = tmpl4;
314
            KopplungsteilRollNick = tmpl4;
302
            tmpl4 -= tmpl3;
315
            tmpl4 -= tmpl3;
303
            ErsatzKompass += tmpl4;
316
            ErsatzKompass += tmpl4;
-
 
317
            if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen
Line 304... Line 318...
304
 
318
 
305
            tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L;
319
            tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L;
306
            tmpl *= Parameter_AchsKopplung1;  // 90
320
            tmpl *= Parameter_AchsKopplung1;  // 90
307
            tmpl /= 4096L;
321
            tmpl /= 4096L;
308
            tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L;
322
            tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L;
309
            tmpl2 *= Parameter_AchsKopplung1;
323
            tmpl2 *= Parameter_AchsKopplung1;
310
            tmpl2 /= 4096L;
324
            tmpl2 /= 4096L;
311
            if(labs(tmpl) > 128 || labs(tmpl2) > 128 /* || abs(KopplungsteilNickRoll) > 128 || abs(KopplungsteilRollNick) > 128)*/) TrichterFlug = 1;
325
            if(labs(tmpl) > 128 || labs(tmpl2) > 128 /* || abs(KopplungsteilNickRoll) > 128 || abs(KopplungsteilRollNick) > 128)*/) TrichterFlug = 1;
312
            //MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256;
-
 
313
DebugOut.Analog[21] = KopplungsteilNickRoll;  
-
 
314
DebugOut.Analog[22] = KopplungsteilRollNick;
326
            //MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256;
-
 
327
         }
-
 
328
      else  tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0;
315
         }
329
 
-
 
330
TrimRoll = tmpl - tmpl2 / 100L;
Line 316... Line 331...
316
      else  tmpl = tmpl2 = 0;
331
TrimNick = -tmpl2 + tmpl / 100L;
317
 
332
 
318
// Kompasswert begrenzen  ++++++++++++++++++++++++++++++++++++++++++++++++
333
// Kompasswert begrenzen  ++++++++++++++++++++++++++++++++++++++++++++++++
319
                    if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR;  // 360° Umschlag
334
                    if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR;  // 360° Umschlag
320
                    if(ErsatzKompass < 0)                          ErsatzKompass += 360L * GIER_GRAD_FAKTOR;
335
                    if(ErsatzKompass < 0)                          ErsatzKompass += 360L * GIER_GRAD_FAKTOR;
321
// Roll  ++++++++++++++++++++++++++++++++++++++++++++++++
336
// Roll  ++++++++++++++++++++++++++++++++++++++++++++++++
322
            MesswertRoll += tmpl;
337
//            MesswertRoll += tmpl;
323
            MesswertRoll += tmpl2 / 100L; // War: *5/512
338
//            MesswertRoll += tmpl2 / 100L; // War: *5/512
324
//            MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109
339
//            MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109
Line 325... Line 340...
325
            Mess_IntegralRoll2 += MesswertRoll;
340
            Mess_IntegralRoll2 += MesswertRoll + TrimRoll;
326
            Mess_IntegralRoll +=  MesswertRoll - LageKorrekturRoll;
341
            Mess_IntegralRoll +=  MesswertRoll + TrimRoll - LageKorrekturRoll;
327
 
342
 
328
            if(Mess_IntegralRoll > Umschlag180Roll)
343
            if(Mess_IntegralRoll > Umschlag180Roll)
Line 346... Line 361...
346
                         {
361
                         {
347
              if(AdWertRoll > 2000) MesswertRoll = +1000;
362
              if(AdWertRoll > 2000) MesswertRoll = +1000;
348
              if(AdWertRoll > 2015) MesswertRoll = +2000;
363
              if(AdWertRoll > 2015) MesswertRoll = +2000;
349
                         }
364
                         }
350
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
365
// Nick  ++++++++++++++++++++++++++++++++++++++++++++++++
351
            MesswertNick -= tmpl2;
366
//            MesswertNick -= tmpl2;
352
//            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; 
367
//            MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; 
353
            MesswertNick -= tmpl / 100L; //109
368
//            MesswertNick -= tmpl / 100L; //109
354
            Mess_IntegralNick2 += MesswertNick;
369
            Mess_IntegralNick2 += MesswertNick + TrimNick;
355
            Mess_IntegralNick  += MesswertNick - LageKorrekturNick;
370
            Mess_IntegralNick  += MesswertNick + TrimNick - LageKorrekturNick;
Line 356... Line 371...
356
 
371
 
357
            if(Mess_IntegralNick > Umschlag180Nick)
372
            if(Mess_IntegralNick > Umschlag180Nick)
358
             {
373
             {
359
              Mess_IntegralNick = -(Umschlag180Nick - 25000L);
374
              Mess_IntegralNick = -(Umschlag180Nick - 25000L);
Line 380... Line 395...
380
    Integral_Gier  = Mess_Integral_Gier;
395
    Integral_Gier  = Mess_Integral_Gier;
381
    IntegralNick = Mess_IntegralNick;
396
    IntegralNick = Mess_IntegralNick;
382
    IntegralRoll = Mess_IntegralRoll;
397
    IntegralRoll = Mess_IntegralRoll;
383
    IntegralNick2 = Mess_IntegralNick2;
398
    IntegralNick2 = Mess_IntegralNick2;
384
    IntegralRoll2 = Mess_IntegralRoll2;
399
    IntegralRoll2 = Mess_IntegralRoll2;
385
    MesswertNick = (RohMesswertNick + 2 * MesswertNick) / 3;
400
//    MesswertNick = (RohMesswertNick + 2 * MesswertNick) / 3;
386
    MesswertRoll = (RohMesswertRoll + 2 * MesswertRoll) / 3;
401
//    MesswertRoll = (RohMesswertRoll + 2 * MesswertRoll) / 3;
-
 
402
 
-
 
403
#define D_LIMIT 128
-
 
404
 
-
 
405
MesswertNick = HiResNick / 20;
-
 
406
MesswertRoll = HiResRoll / 20;
Line 387... Line -...
387
 
-
 
388
#define D_LIMIT 8
407
 
389
  if(Parameter_Gyro_D)
408
  if(Parameter_Gyro_D)
390
  {
409
  {
391
   d2Nick = (((MesswertNick - oldNick)));
410
   d2Nick = HiResNick - oldNick;
392
   oldNick = MesswertNick;
411
   oldNick = (oldNick + HiResNick)/2;
393
   if(d2Nick > D_LIMIT) d2Nick = D_LIMIT;
412
   if(d2Nick > D_LIMIT) d2Nick = D_LIMIT;
394
   else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT;
413
   else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT;
395
   MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D);
-
 
396
 
414
   MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16;
397
   d2Roll = (((MesswertRoll - oldRoll)));
415
   d2Roll = HiResRoll - oldRoll;
398
   oldRoll = MesswertRoll;
416
   oldRoll = (oldRoll + HiResRoll)/2;
399
   if(d2Roll > D_LIMIT) d2Roll = D_LIMIT;
417
   if(d2Roll > D_LIMIT) d2Roll = D_LIMIT;
400
   else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT;
418
   else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT;
-
 
419
   MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16;
-
 
420
   HiResNick += (d2Nick * (signed int) Parameter_Gyro_D);
401
   MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D);
421
   HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D);
Line 402... Line 422...
402
  }
422
  }
403
 
423
 
404
 if(RohMesswertRoll > 0) MesswertRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L;
424
 if(RohMesswertRoll > 0) TrimRoll  += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L;
405
 else                    MesswertRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L;
425
 else                    TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L;
Line 406... Line 426...
406
 if(RohMesswertNick > 0) MesswertNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L;
426
 if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L;
407
 else                    MesswertNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L;
427
 else                    TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L;
408
 
428
 
409
  if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll)
429
  if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll)
Line 458... Line 478...
458
void SendMotorData(void)
478
void SendMotorData(void)
459
//############################################################################
479
//############################################################################
460
{
480
{
461
    if(!MotorenEin)
481
    if(!MotorenEin)
462
        {
482
        {
463
#ifdef OCTO
483
#ifndef QUADRO
464
                Motor1 = 0;Motor2 = 0;Motor3 = 0;Motor4 = 0;Motor5 = 0;Motor6 = 0;Motor7 = 0;Motor8 = 0;
484
                Motor1 = 0;Motor2 = 0;Motor3 = 0;Motor4 = 0;Motor5 = 0;Motor6 = 0;Motor7 = 0;Motor8 = 0;
465
        if(MotorTest[0]) {Motor1 = MotorTest[0]; Motor2 = MotorTest[0];}
485
        if(MotorTest[0]) {Motor1 = MotorTest[0]; Motor2 = MotorTest[0];}
466
        if(MotorTest[3]) {Motor3 = MotorTest[3]; Motor4 = MotorTest[3];}
486
        if(MotorTest[3]) {Motor3 = MotorTest[3]; Motor4 = MotorTest[3];}
467
        if(MotorTest[1]) {Motor5 = MotorTest[1]; Motor6 = MotorTest[1];}
487
        if(MotorTest[1]) {Motor5 = MotorTest[1]; Motor6 = MotorTest[1];}
468
        if(MotorTest[2]) {Motor7 = MotorTest[2]; Motor8 = MotorTest[2];}
488
        if(MotorTest[2]) {Motor7 = MotorTest[2]; Motor8 = MotorTest[2];}
Line 558... Line 578...
558
     static long IntegralFehlerRoll = 0;
578
     static long IntegralFehlerRoll = 0;
559
         static unsigned int RcLostTimer;
579
         static unsigned int RcLostTimer;
560
         static unsigned char delay_neutral = 0;
580
         static unsigned char delay_neutral = 0;
561
         static unsigned char delay_einschalten = 0,delay_ausschalten = 0;
581
         static unsigned char delay_einschalten = 0,delay_ausschalten = 0;
562
     static int hoehenregler = 0;
582
     static int hoehenregler = 0;
-
 
583
         static int motorwert1,motorwert2,motorwert3,motorwert4,motorwert5,motorwert6,motorwert7,motorwert8;
563
     static char TimerWerteausgabe = 0;
584
     static char TimerWerteausgabe = 0;
564
     static char NeueKompassRichtungMerken = 0;
585
     static char NeueKompassRichtungMerken = 0;
565
     static long ausgleichNick, ausgleichRoll;
586
     static long ausgleichNick, ausgleichRoll;
566
     int IntegralNickMalFaktor,IntegralRollMalFaktor;
587
     int IntegralNickMalFaktor,IntegralRollMalFaktor;
567
        Mittelwert();
588
        Mittelwert();
Line 929... Line 950...
929
      {
950
      {
930
      tmp_long  /= 3;
951
      tmp_long  /= 3;
931
      tmp_long2 /= 3;
952
      tmp_long2 /= 3;
932
      }
953
      }
Line -... Line 954...
-
 
954
 
933
 
955
 
934
#define AUSGLEICH  32
956
#define AUSGLEICH  32
935
      if(tmp_long >  AUSGLEICH)  tmp_long  = AUSGLEICH;
957
      if(tmp_long >  AUSGLEICH)  tmp_long  = AUSGLEICH;
936
      if(tmp_long < -AUSGLEICH)  tmp_long  =-AUSGLEICH;
958
      if(tmp_long < -AUSGLEICH)  tmp_long  =-AUSGLEICH;
937
      if(tmp_long2 > AUSGLEICH)  tmp_long2 = AUSGLEICH;
959
      if(tmp_long2 > AUSGLEICH)  tmp_long2 = AUSGLEICH;
938
      if(tmp_long2 <-AUSGLEICH)  tmp_long2 =-AUSGLEICH;
960
      if(tmp_long2 <-AUSGLEICH)  tmp_long2 =-AUSGLEICH;
-
 
961
     }
-
 
962
 
939
     }
963
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;}
940
   Mess_IntegralNick -= tmp_long;
964
   Mess_IntegralNick -= tmp_long;
941
   Mess_IntegralRoll -= tmp_long2;
965
   Mess_IntegralRoll -= tmp_long2;
942
  }
966
  }
943
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
967
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Line 1206... Line 1230...
1206
    DebugOut.Analog[20] = ServoValue;
1230
    DebugOut.Analog[20] = ServoValue;
1207
    DebugOut.Analog[24] = MesswertNick/2;
1231
    DebugOut.Analog[24] = MesswertNick/2;
1208
    DebugOut.Analog[25] = MesswertRoll/2;
1232
    DebugOut.Analog[25] = MesswertRoll/2;
1209
    DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift;
1233
    DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift;
1210
    DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K;
1234
    DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K;
1211
    DebugOut.Analog[30] = GPS_Nick;
1235
    DebugOut.Analog[30] = GPS_Nick;
1212
    DebugOut.Analog[31] = GPS_Roll;
1236
    DebugOut.Analog[31] = GPS_Roll;
Line 1213... Line 1237...
1213
 
1237
 
1214
 
1238
 
Line 1245... Line 1269...
1245
  if(TrichterFlug)  { SummeRoll = 0; SummeNick = 0;};
1269
  if(TrichterFlug)  { SummeRoll = 0; SummeNick = 0;};
Line 1246... Line 1270...
1246
 
1270
 
1247
    if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) /  (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0;
1271
    if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) /  (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0;
Line -... Line 1272...
-
 
1272
    if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) /  (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0;
1248
    if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) /  (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0;
1273
 
1249
 
1274
#define TRIM_MAX (Poti1 * 2)
Line -... Line 1275...
-
 
1275
 if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else  if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX;
-
 
1276
 if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else  if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX;
-
 
1277
 
-
 
1278
 {
-
 
1279
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN);
1250
    MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN);
1280
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);
1251
    MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN);
1281
 }
1252
 
1282
 
1253
#ifdef OCTO
1283
#ifndef QUADRO
1254
    MesswertGier =   (long)(MesswertGier * 4 * (long)GyroFaktor) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktor) / (4 * (44000 / STICK_GAIN));
1284
    MesswertGier =   (long)(MesswertGier * 4 * (long)GyroFaktor) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktor) / (4 * (44000 / STICK_GAIN));
Line 1393... Line 1423...
1393
    pd_ergebnis_roll = DiffRoll + SummeRoll / Ki;       // PI-Regler für Roll
1423
    pd_ergebnis_roll = DiffRoll + SummeRoll / Ki;       // PI-Regler für Roll
1394
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1424
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1395
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
1425
    if(pd_ergebnis_roll >  tmp_int) pd_ergebnis_roll =  tmp_int;
1396
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;
1426
    if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int;
Line 1397... Line 1427...
1397
 
1427
 
1398
#ifndef OCTO
1428
#ifdef QUADRO
1399
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1429
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1400
// Quadro-Mischer 
1430
// Quadro-Mischer 
1401
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1431
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1432
    motorwert = GasMischanteil + pd_ergebnis_nick + GierMischanteil;      // Mischer
1402
    motorwert = GasMischanteil + pd_ergebnis_nick + GierMischanteil;      // Mischer
1433
    motorwert1 = MotorSmoothing(motorwert,motorwert1);
1403
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1434
    motorwert = motorwert1 / STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
Line 1404... Line 1435...
1404
    Motor_Vorne = motorwert;
1435
    Motor_Vorne = motorwert;
-
 
1436
 
1405
 
1437
        motorwert = GasMischanteil - pd_ergebnis_nick + GierMischanteil;
1406
        motorwert = GasMischanteil - pd_ergebnis_nick + GierMischanteil;
1438
    motorwert2 = MotorSmoothing(motorwert,motorwert2);
Line 1407... Line 1439...
1407
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1439
    motorwert = motorwert2 / STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1440
        Motor_Hinten = motorwert;
1408
        Motor_Hinten = motorwert;
1441
 
1409
 
1442
    motorwert = GasMischanteil + pd_ergebnis_roll - GierMischanteil;
Line 1410... Line 1443...
1410
    motorwert = GasMischanteil + pd_ergebnis_roll - GierMischanteil;
1443
    motorwert3 = MotorSmoothing(motorwert,motorwert3);
-
 
1444
    motorwert = motorwert3 / STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1411
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1445
    Motor_Links = motorwert;
1412
    Motor_Links = motorwert;
1446
 
1413
 
1447
        motorwert = GasMischanteil - pd_ergebnis_roll - GierMischanteil;
1414
        motorwert = GasMischanteil - pd_ergebnis_roll - GierMischanteil;
1448
    motorwert4 = MotorSmoothing(motorwert,motorwert4);
1415
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1449
    motorwert = motorwert4 / STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1416
    Motor_Rechts = motorwert;
1450
    Motor_Rechts = motorwert;
1417
   // +++++++++++++++++++++++++++++++++++++++++++++++
1451
   // +++++++++++++++++++++++++++++++++++++++++++++++
1418
 
1452
#endif
1419
#else 
1453
#ifdef OCTO
1420
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1454
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Line 1451... Line 1485...
1451
    motorwert = GasMischanteil + pd_ergebnis_nick + pd_ergebnis_roll - GierMischanteil;
1485
    motorwert = GasMischanteil + pd_ergebnis_nick + pd_ergebnis_roll - GierMischanteil;
1452
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1486
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
1453
    Motor8 = motorwert;
1487
    Motor8 = motorwert;
1454
   // +++++++++++++++++++++++++++++++++++++++++++++++
1488
   // +++++++++++++++++++++++++++++++++++++++++++++++
1455
#endif
1489
#endif
-
 
1490
#ifdef OCTO2
-
 
1491
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1492
// Octo-Mischer 
-
 
1493
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
1494
    motorwert = GasMischanteil + pd_ergebnis_nick + GierMischanteil;     
-
 
1495
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1496
        Motor1 = motorwert;
1456
/*
1497
 
-
 
1498
    motorwert = GasMischanteil + pd_ergebnis_nick - pd_ergebnis_roll - GierMischanteil;  
-
 
1499
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1500
        Motor2 = motorwert;
-
 
1501
 
-
 
1502
        motorwert = GasMischanteil + - pd_ergebnis_roll + GierMischanteil;
-
 
1503
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1504
    Motor3 = motorwert;
-
 
1505
 
-
 
1506
        motorwert = GasMischanteil - pd_ergebnis_nick - pd_ergebnis_roll - GierMischanteil;
-
 
1507
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1508
    Motor4 = motorwert;
-
 
1509
 
-
 
1510
        motorwert = GasMischanteil - pd_ergebnis_roll + GierMischanteil;
-
 
1511
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1512
        Motor5 = motorwert;
-
 
1513
 
-
 
1514
        motorwert = GasMischanteil - pd_ergebnis_nick + pd_ergebnis_roll - GierMischanteil;
-
 
1515
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1516
        Motor6 = motorwert;
-
 
1517
 
-
 
1518
    motorwert = GasMischanteil + pd_ergebnis_roll + GierMischanteil;
-
 
1519
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1520
    Motor7 = motorwert;
-
 
1521
 
-
 
1522
    motorwert = GasMischanteil + pd_ergebnis_nick + pd_ergebnis_roll - GierMischanteil;
-
 
1523
    motorwert /= STICK_GAIN; CHECK_MIN_MAX(motorwert,MIN_GAS,MAX_GAS);
-
 
1524
    Motor8 = motorwert;
-
 
1525
   // +++++++++++++++++++++++++++++++++++++++++++++++
-
 
1526
#endif
-
 
1527
 
1457
if(Poti1 > 20)  Motor1 = 0;
1528
if(Poti1 > 20)  Motor1 = 0;
1458
if(Poti1 > 90)  Motor6 = 0;
1529
if(Poti1 > 90)  Motor6 = 0;
1459
if(Poti1 > 140) Motor2 = 0;
1530
if(Poti1 > 140) Motor2 = 0;
1460
if(Poti1 > 200) Motor7 = 0;
1531
if(Poti1 > 200) Motor7 = 0;
1461
*/
1532
 
1462
}
1533
}