Subversion Repositories FlightCtrl

Rev

Rev 976 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 976 Rev 977
Line 87... Line 87...
87
int   GierGyroFehler = 0;
87
int   GierGyroFehler = 0;
88
float GyroFaktor;
88
float GyroFaktor;
89
float IntegralFaktor;
89
float IntegralFaktor;
90
volatile int  DiffNick,DiffRoll;
90
volatile int  DiffNick,DiffRoll;
91
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
91
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
-
 
92
#ifdef HEXAKOPTER
-
 
93
volatile unsigned char Motor_VorneLinks,Motor_VorneRechts,Motor_HintenLinks,Motor_HintenRechts,Motor_Rechts,Motor_Links, Count;
-
 
94
#else
92
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
95
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
-
 
96
#endif
93
volatile unsigned char SenderOkay = 0;
97
volatile unsigned char SenderOkay = 0;
94
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
98
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0;
95
char MotorenEin = 0;
99
char MotorenEin = 0;
96
int HoehenWert = 0;
100
int HoehenWert = 0;
97
int SollHoehe = 0;
101
int SollHoehe = 0;
Line 225... Line 229...
225
    MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier;
229
    MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier;
226
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
230
    MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
227
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
231
    MesswertNick = (signed int) AdWertNick - AdNeutralNick;
Line 228... Line 232...
228
 
232
 
229
//DebugOut.Analog[26] = MesswertNick;
233
//DebugOut.Analog[26] = MesswertNick;
Line 230... Line 234...
230
DebugOut.Analog[28] = MesswertRoll;
234
//DebugOut.Analog[28] = MesswertRoll;
231
 
235
 
232
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
236
// Beschleunigungssensor  ++++++++++++++++++++++++++++++++++++++++++++++++
233
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
237
        Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
Line 374... Line 378...
374
void SendMotorData(void)
378
void SendMotorData(void)
375
//############################################################################
379
//############################################################################
376
{
380
{
377
    if(!MotorenEin)
381
    if(!MotorenEin)
378
        {
382
        {
-
 
383
#ifdef HEXAKOPTER               
-
 
384
        Motor_HintenLinks = 0;
-
 
385
        Motor_HintenRechts = 0;
-
 
386
        Motor_VorneLinks = 0;
-
 
387
        Motor_VorneRechts = 0;
-
 
388
        Motor_Rechts = 0;
-
 
389
        Motor_Links = 0;
-
 
390
        if(MotorTest[0]) Motor_VorneLinks = Motor_VorneRechts = MotorTest[0];
-
 
391
        if(MotorTest[1]) Motor_HintenLinks = Motor_HintenRechts = MotorTest[1];
-
 
392
        if(MotorTest[2]) Motor_Links = MotorTest[2];
-
 
393
        if(MotorTest[3]) Motor_Rechts = MotorTest[3];
-
 
394
#else
379
        Motor_Hinten = 0;
395
        Motor_Hinten = 0;
380
        Motor_Vorne = 0;
396
        Motor_Vorne = 0;
381
        Motor_Rechts = 0;
397
        Motor_Rechts = 0;
382
        Motor_Links = 0;
398
        Motor_Links = 0;
383
        if(MotorTest[0]) Motor_Vorne = MotorTest[0];
399
        if(MotorTest[0]) Motor_Vorne = MotorTest[0];
384
        if(MotorTest[1]) Motor_Hinten = MotorTest[1];
400
        if(MotorTest[1]) Motor_Hinten = MotorTest[1];
385
        if(MotorTest[2]) Motor_Links = MotorTest[2];
401
        if(MotorTest[2]) Motor_Links = MotorTest[2];
386
        if(MotorTest[3]) Motor_Rechts = MotorTest[3];
402
        if(MotorTest[3]) Motor_Rechts = MotorTest[3];
-
 
403
#endif          
387
        MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY);
404
        MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY);
388
        } else MikroKopterFlags |= FLAG_MOTOR_RUN;
405
        } else MikroKopterFlags |= FLAG_MOTOR_RUN;
Line -... Line 406...
-
 
406
 
-
 
407
#ifdef HEXAKOPTER
-
 
408
    DebugOut.Analog[10] = Motor_VorneLinks;
-
 
409
    DebugOut.Analog[11] = Motor_VorneRechts;
-
 
410
    DebugOut.Analog[12] = Motor_HintenLinks;
-
 
411
    DebugOut.Analog[13] = Motor_HintenRechts;
-
 
412
    DebugOut.Analog[14] = Motor_Links;
-
 
413
    DebugOut.Analog[15] = Motor_Rechts;  
389
 
414
#else
390
    DebugOut.Analog[12] = Motor_Vorne;
415
    DebugOut.Analog[12] = Motor_Vorne;
391
    DebugOut.Analog[13] = Motor_Hinten;
416
    DebugOut.Analog[13] = Motor_Hinten;
392
    DebugOut.Analog[14] = Motor_Links;
417
    DebugOut.Analog[14] = Motor_Links;
393
    DebugOut.Analog[15] = Motor_Rechts;  
418
    DebugOut.Analog[15] = Motor_Rechts;  
394
 
419
#endif
395
    //Start I2C Interrupt Mode
420
    //Start I2C Interrupt Mode
396
    twi_state = 0;
421
    twi_state = 0;
397
    motor = 0;
422
    motor = 0;
398
    i2c_start();
423
    i2c_start();
Line 452... Line 477...
452
void MotorRegler(void)
477
void MotorRegler(void)
453
//############################################################################
478
//############################################################################
454
{
479
{
455
         int motorwert,pd_ergebnis,h,tmp_int;
480
         int motorwert,pd_ergebnis,h,tmp_int;
456
         int GierMischanteil,GasMischanteil;
481
         int GierMischanteil,GasMischanteil;
-
 
482
         int NickMischanteil, RollMischanteil;
457
     static long SummeNick=0,SummeRoll=0;
483
     static long SummeNick=0,SummeRoll=0;
458
     static long sollGier = 0,tmp_long,tmp_long2;
484
     static long sollGier = 0,tmp_long,tmp_long2;
459
     static long IntegralFehlerNick = 0;
485
     static long IntegralFehlerNick = 0;
460
     static long IntegralFehlerRoll = 0;
486
     static long IntegralFehlerRoll = 0;
461
         static unsigned int RcLostTimer;
487
         static unsigned int RcLostTimer;
Line 1084... Line 1110...
1084
    DebugOut.Analog[4] = MesswertGier;
1110
    DebugOut.Analog[4] = MesswertGier;
1085
    DebugOut.Analog[5] = HoehenWert;
1111
    DebugOut.Analog[5] = HoehenWert;
1086
    DebugOut.Analog[6] = (Mess_Integral_Hoch / 512);
1112
    DebugOut.Analog[6] = (Mess_Integral_Hoch / 512);
1087
    DebugOut.Analog[8] = KompassValue;
1113
    DebugOut.Analog[8] = KompassValue;
1088
    DebugOut.Analog[9] = UBat;
1114
    DebugOut.Analog[9] = UBat;
1089
    DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR;  
1115
    DebugOut.Analog[28] = ErsatzKompass / GIER_GRAD_FAKTOR;  
1090
    DebugOut.Analog[10] = SenderOkay;
1116
    DebugOut.Analog[29] = SenderOkay;
-
 
1117
       
1091
    //DebugOut.Analog[16] = Mittelwert_AccHoch;
1118
    //DebugOut.Analog[16] = Mittelwert_AccHoch;
1092
//    DebugOut.Analog[17] = FromNaviCtrl_Value.Distance;
1119
//    DebugOut.Analog[17] = FromNaviCtrl_Value.Distance;
1093
//    DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar;
1120
//    DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar;
1094
    DebugOut.Analog[19] = WinkelOut.CalcState;
1121
    DebugOut.Analog[19] = WinkelOut.CalcState;
1095
    DebugOut.Analog[20] = ServoValue;
1122
    DebugOut.Analog[20] = ServoValue;
Line 1229... Line 1256...
1229
    if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung
1256
    if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung
1230
    else  SummeNick += DiffNick; // I-Anteil bei HH 
1257
    else  SummeNick += DiffNick; // I-Anteil bei HH 
1231
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1258
    if(SummeNick >  (STICK_GAIN * 16000L)) SummeNick =  (STICK_GAIN * 16000L);
1232
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1259
    if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN);
1233
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
1260
    pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick                                      
1234
    // Motor Vorn
-
 
-
 
1261
 
1235
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1262
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1236
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1263
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1237
    if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int;
1264
    if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int;
Line 1238... Line -...
1238
 
-
 
1239
    motorwert = GasMischanteil + pd_ergebnis + GierMischanteil;   // Mischer
-
 
1240
    motorwert /= STICK_GAIN;
-
 
1241
        if ((motorwert < 0)) motorwert = 0;
-
 
1242
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
-
 
1243
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
-
 
1244
        Motor_Vorne = motorwert;           
-
 
1245
    // Motor Heck
1265
 
1246
        motorwert = GasMischanteil - pd_ergebnis + GierMischanteil;
-
 
1247
    motorwert /= STICK_GAIN;
-
 
1248
        if ((motorwert < 0)) motorwert = 0;
-
 
1249
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
-
 
1250
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
-
 
-
 
1266
    NickMischanteil = (pd_ergebnis*4) / 7;
1251
        Motor_Hinten = motorwert;              
1267
 
1252
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1268
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1253
// Roll-Achse
1269
// Roll-Achse
1254
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1270
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
1255
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
1271
        DiffRoll = MesswertRoll - StickRoll;    // Differenz bestimmen
Line 1258... Line 1274...
1258
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1274
    if(SummeRoll >  (STICK_GAIN * 16000L)) SummeRoll =  (STICK_GAIN * 16000L);
1259
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1275
    if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN);
1260
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1276
    pd_ergebnis = DiffRoll + Ki * SummeRoll;    // PI-Regler für Roll
1261
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1277
    tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64;
1262
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1278
    if(pd_ergebnis >  tmp_int) pd_ergebnis =  tmp_int;
1263
    if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int;
1279
    if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int;
-
 
1280
 
-
 
1281
    RollMischanteil = pd_ergebnis/3;
-
 
1282
       
-
 
1283
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
-
 
1284
// Mischer für die Motorenanteile
-
 
1285
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                
-
 
1286
       
-
 
1287
 
-
 
1288
 #ifdef HEXAKOPTER
-
 
1289
    // Motor Vorn Links
-
 
1290
    motorwert = GasMischanteil + NickMischanteil + RollMischanteil/2 - GierMischanteil;   // Mischer
-
 
1291
    motorwert /= STICK_GAIN;
-
 
1292
        if ((motorwert < 0)) motorwert = 0;
-
 
1293
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
-
 
1294
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
-
 
1295
        Motor_VorneLinks = motorwert;      
-
 
1296
    // Motor Vorn Rechts
-
 
1297
        motorwert = GasMischanteil + NickMischanteil - RollMischanteil/2 + GierMischanteil;
-
 
1298
    motorwert /= STICK_GAIN;
-
 
1299
        if ((motorwert < 0)) motorwert = 0;
-
 
1300
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
-
 
1301
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
-
 
1302
        Motor_VorneRechts = motorwert; 
-
 
1303
            // Motor Hinten Links
-
 
1304
    motorwert = GasMischanteil - NickMischanteil + RollMischanteil/2 - GierMischanteil;
-
 
1305
    motorwert /= STICK_GAIN;
-
 
1306
        if ((motorwert < 0)) motorwert = 0;
-
 
1307
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
-
 
1308
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
-
 
1309
    Motor_HintenLinks = motorwert;             
-
 
1310
    // Motor HintenRechts
-
 
1311
        motorwert = GasMischanteil - NickMischanteil - RollMischanteil/2 + GierMischanteil;
-
 
1312
    motorwert /= STICK_GAIN;
-
 
1313
        if ((motorwert < 0)) motorwert = 0;
-
 
1314
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
-
 
1315
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
-
 
1316
    Motor_HintenRechts = motorwert;
-
 
1317
    // Motor Rechts
-
 
1318
        motorwert = GasMischanteil - RollMischanteil - GierMischanteil;
-
 
1319
    motorwert /= STICK_GAIN;
-
 
1320
        if ((motorwert < 0)) motorwert = 0;
-
 
1321
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
-
 
1322
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
-
 
1323
    Motor_Rechts = motorwert;
1264
    // Motor Links
1324
    // Motor Links
-
 
1325
        motorwert = GasMischanteil + RollMischanteil + GierMischanteil;
-
 
1326
    motorwert /= STICK_GAIN;
-
 
1327
        if ((motorwert < 0)) motorwert = 0;
-
 
1328
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
-
 
1329
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
-
 
1330
    Motor_Links = motorwert;
-
 
1331
#else   
-
 
1332
    // Motor Vorn       
-
 
1333
    motorwert = GasMischanteil + NickMischanteil + GierMischanteil;       // Mischer
-
 
1334
    motorwert /= STICK_GAIN;
-
 
1335
        if ((motorwert < 0)) motorwert = 0;
-
 
1336
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
-
 
1337
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
-
 
1338
        Motor_Vorne = motorwert;           
-
 
1339
    // Motor Heck
-
 
1340
        motorwert = GasMischanteil - NickMischanteil + GierMischanteil;
-
 
1341
    motorwert /= STICK_GAIN;
-
 
1342
        if ((motorwert < 0)) motorwert = 0;
-
 
1343
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
-
 
1344
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
-
 
1345
        Motor_Hinten = motorwert;      
-
 
1346
            // Motor Links
1265
    motorwert = GasMischanteil + pd_ergebnis - GierMischanteil;
1347
    motorwert = GasMischanteil + RollMischanteil - GierMischanteil;
1266
    motorwert /= STICK_GAIN;
1348
    motorwert /= STICK_GAIN;
1267
        if ((motorwert < 0)) motorwert = 0;
1349
        if ((motorwert < 0)) motorwert = 0;
1268
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
1350
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
1269
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
1351
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
1270
    Motor_Links = motorwert;           
1352
    Motor_Links = motorwert;           
1271
    // Motor Rechts
1353
    // Motor Rechts
1272
        motorwert = GasMischanteil - pd_ergebnis - GierMischanteil;
1354
        motorwert = GasMischanteil - RollMischanteil - GierMischanteil;
1273
    motorwert /= STICK_GAIN;
1355
    motorwert /= STICK_GAIN;
1274
        if ((motorwert < 0)) motorwert = 0;
1356
        if ((motorwert < 0)) motorwert = 0;
1275
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
1357
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
1276
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
1358
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;       
1277
    Motor_Rechts = motorwert;          
1359
    Motor_Rechts = motorwert;
1278
   // +++++++++++++++++++++++++++++++++++++++++++++++
-
 
-
 
1360
#endif
1279
}
1361
}