Subversion Repositories FlightCtrl

Rev

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

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