Subversion Repositories FlightCtrl

Rev

Rev 211 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ingob 1
/*#######################################################################################
2
Flight Control
3
#######################################################################################*/
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// + Copyright (c) 04.2007 Holger Buss
6
// + Nur für den privaten Gebrauch
7
// + www.MikroKopter.com
8
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
212 dynahenry 9
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
10
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
11
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
12
// + bzgl. der Nutzungsbedingungen aufzunehmen.
1 ingob 13
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
14
// + Verkauf von Luftbildaufnahmen, usw.
15
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
212 dynahenry 16
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
1 ingob 17
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
18
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
19
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
20
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
21
// + eindeutig als Ursprung verlinkt werden
22
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
24
// + Benutzung auf eigene Gefahr
25
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
26
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
212 dynahenry 27
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
1 ingob 28
// + mit unserer Zustimmung zulässig
29
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
31
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
212 dynahenry 32
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
1 ingob 33
// + this list of conditions and the following disclaimer.
34
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
35
// +     from this software without specific prior written permission.
212 dynahenry 36
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
1 ingob 37
// +     for non-commercial use (directly or indirectly)
212 dynahenry 38
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
1 ingob 39
// +     with our written permission
212 dynahenry 40
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
41
// +     clearly linked as origin
1 ingob 42
// +   * porting to systems other than hardware from www.mikrokopter.de is not allowed
43
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
44
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
47
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
48
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
49
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
50
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
51
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
52
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
212 dynahenry 53
// +  POSSIBILITY OF SUCH DAMAGE.
1 ingob 54
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
55
 
56
#include "main.h"
57
 
58
unsigned char h,m,s;
173 holgerb 59
volatile unsigned int I2CTimeout = 100;
1 ingob 60
volatile int MesswertNick,MesswertRoll,MesswertGier;
61
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0;
62
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0;
63
volatile float NeutralAccZ = 0;
64
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0;
65
volatile long IntegralNick = 0,IntegralNick2 = 0;
66
volatile long IntegralRoll = 0,IntegralRoll2 = 0;
67
volatile long Integral_Gier = 0;
68
volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0;
69
volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0;
70
volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0;
71
volatile long Mess_Integral_Hoch = 0;
72
volatile int  KompassValue = 0;
73
volatile int  KompassStartwert = 0;
74
volatile int  KompassRichtung = 0;
75
unsigned char MAX_GAS,MIN_GAS;
76
unsigned char Notlandung = 0;
77
unsigned char HoehenReglerAktiv = 0;
212 dynahenry 78
//-------HF-------
79
unsigned char LED_Switch = 0;
80
unsigned char LED_flash  = 0;
81
unsigned char LED_1  = 0;
82
unsigned char LED_2  = 0;
83
unsigned char LED_2on  = 0;
84
//-------HF-------
1 ingob 85
 
86
float GyroFaktor;
87
float IntegralFaktor;
88
 
89
volatile int  DiffNick,DiffRoll;
212 dynahenry 90
int  Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0;
1 ingob 91
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count;
92
unsigned char MotorWert[5];
93
volatile unsigned char SenderOkay = 0;
94
int StickNick = 0,StickRoll = 0,StickGier = 0;
95
char MotorenEin = 0;
96
int HoehenWert = 0;
97
int SollHoehe = 0;
173 holgerb 98
unsigned char Looping_Nick = 0,Looping_Roll = 0;
1 ingob 99
 
100
float Kp =  FAKTOR_P;
101
float Ki =  FAKTOR_I;
102
 
103
unsigned char Parameter_Luftdruck_D  = 48;      // Wert : 0-250
104
unsigned char Parameter_MaxHoehe     = 251;      // Wert : 0-250
105
unsigned char Parameter_Hoehe_P      = 16;      // Wert : 0-32
106
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250
107
unsigned char Parameter_KompassWirkung = 64;    // Wert : 0-250
173 holgerb 108
unsigned char Parameter_Gyro_P = 150;           // Wert : 10-250
1 ingob 109
unsigned char Parameter_Gyro_I = 150;           // Wert : 0-250
110
unsigned char Parameter_Gier_P = 2;             // Wert : 1-20
111
unsigned char Parameter_I_Faktor = 10;          // Wert : 1-20
112
unsigned char Parameter_UserParam1 = 0;
113
unsigned char Parameter_UserParam2 = 0;
114
unsigned char Parameter_UserParam3 = 0;
115
unsigned char Parameter_UserParam4 = 0;
116
unsigned char Parameter_ServoNickControl = 100;
173 holgerb 117
unsigned char Parameter_LoopGasLimit = 70;
1 ingob 118
struct mk_param_struct EE_Parameter;
119
 
120
void Piep(unsigned char Anzahl)
121
{
122
 while(Anzahl--)
123
 {
124
  if(MotorenEin) return; //auf keinen Fall im Flug!
125
  beeptime = 100;
126
  Delay_ms(250);
127
 }
128
}
129
 
130
//############################################################################
131
//  Nullwerte ermitteln
132
void SetNeutral(void)
133
//############################################################################
134
{
135
    unsigned int timer;
212 dynahenry 136
        NeutralAccX = 0;
1 ingob 137
        NeutralAccY = 0;
138
        NeutralAccZ = 0;
212 dynahenry 139
    AdNeutralNick = 0;
140
        AdNeutralRoll = 0;
1 ingob 141
        AdNeutralGier = 0;
212 dynahenry 142
    CalibrierMittelwert();
143
    timer = SetDelay(5);
1 ingob 144
        while (!CheckDelay(timer));
145
        CalibrierMittelwert();
146
    if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // Höhenregelung aktiviert?
212 dynahenry 147
     {
1 ingob 148
      if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
149
     }
173 holgerb 150
 
212 dynahenry 151
    if(PlatinenVersion == 10)
173 holgerb 152
    {
212 dynahenry 153
     AdNeutralNick= abs(MesswertNick);
154
         AdNeutralRoll= abs(MesswertRoll);
173 holgerb 155
         AdNeutralGier= abs(MesswertGier);
212 dynahenry 156
    }
157
    else
173 holgerb 158
    {
212 dynahenry 159
     AdNeutralNick= abs(MesswertNick) / 2;
160
         AdNeutralRoll= abs(MesswertRoll) / 2;
173 holgerb 161
         AdNeutralGier= abs(MesswertGier) / 2;
212 dynahenry 162
    }
1 ingob 163
    NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY;
164
        NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY;
165
        NeutralAccZ = Aktuell_az;
212 dynahenry 166
 
167
        Mess_IntegralNick = 0;
1 ingob 168
    Mess_IntegralNick2 = 0;
212 dynahenry 169
    Mess_IntegralRoll = 0;
1 ingob 170
    Mess_IntegralRoll2 = 0;
212 dynahenry 171
    Mess_Integral_Gier = 0;
1 ingob 172
    MesswertNick = 0;
173
    MesswertRoll = 0;
174
    MesswertGier = 0;
175
    StartLuftdruck = Luftdruck;
176
    HoeheD = 0;
177
    Mess_Integral_Hoch = 0;
178
    KompassStartwert = KompassValue;
179
    GPS_Neutral();
212 dynahenry 180
    beeptime = 50;
1 ingob 181
}
182
 
183
//############################################################################
184
// Bildet den Mittelwert aus den Messwerten
185
void Mittelwert(void)
186
//############################################################################
212 dynahenry 187
{
1 ingob 188
    // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern
189
    ANALOG_OFF;
190
        if(MessanzahlNick)    (MesswertNick = AccumulateNick / MessanzahlNick);
191
        if(MessanzahlRoll)    (MesswertRoll = AccumulateRoll / MessanzahlRoll);
192
        if(MessanzahlGier)    (MesswertGier = AccumulateGier / MessanzahlGier);
193
        if(messanzahl_AccNick) Mittelwert_AccNick = ((long)Mittelwert_AccNick * 7 + ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick)) / 8L;
194
        if(messanzahl_AccRoll) Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 7 + ((ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll)) / 8L;
195
        if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 7 + ((long)accumulate_AccHoch) / messanzahl_AccHoch) / 8L;
196
    AccumulateNick = 0;   MessanzahlNick = 0;
197
    AccumulateRoll = 0;   MessanzahlRoll = 0;
198
    AccumulateGier = 0;   MessanzahlGier = 0;
199
    accumulate_AccRoll = 0;messanzahl_AccRoll = 0;
200
    accumulate_AccNick = 0;messanzahl_AccNick = 0;
201
    accumulate_AccHoch = 0;messanzahl_AccHoch = 0;
202
    Integral_Gier  = Mess_Integral_Gier;
203
//    Integral_Gier2 = Mess_Integral_Gier2;
204
    IntegralNick = Mess_IntegralNick;
205
    IntegralRoll = Mess_IntegralRoll;
212 dynahenry 206
    IntegralNick2 = Mess_IntegralNick2;
1 ingob 207
    IntegralRoll2 = Mess_IntegralRoll2;
208
    // ADC einschalten
212 dynahenry 209
    ANALOG_ON;
1 ingob 210
 
173 holgerb 211
/*
1 ingob 212
//------------------------------------------------------------------------------
213
    if(MesswertNick > 200)  MesswertNick += 4 * (MesswertNick - 200);
212 dynahenry 214
    else
215
    if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200);
1 ingob 216
    if(MesswertRoll > 200)  MesswertRoll += 4 * (MesswertRoll - 200);
212 dynahenry 217
    else
218
    if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200);
1 ingob 219
//------------------------------------------------------------------------------
173 holgerb 220
*/
1 ingob 221
    if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--;
222
    if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--;
223
    if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--;
224
    if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--;
225
    if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255;
226
    if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255;
227
    if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255;
228
    if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255;
229
}
230
 
231
//############################################################################
232
// Messwerte beim Ermitteln der Nullage
233
void CalibrierMittelwert(void)
234
//############################################################################
212 dynahenry 235
{
1 ingob 236
    // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern
237
        ANALOG_OFF;
238
    if(MessanzahlNick)    (MesswertNick = AccumulateNick / MessanzahlNick);
239
        if(MessanzahlRoll)    (MesswertRoll = AccumulateRoll / MessanzahlRoll);
240
        if(MessanzahlGier)    (MesswertGier = AccumulateGier / MessanzahlGier);
241
        if(messanzahl_AccNick) Mittelwert_AccNick = ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick);
242
        if(messanzahl_AccRoll) Mittelwert_AccRoll = (ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll;
243
        if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)accumulate_AccHoch) / messanzahl_AccHoch;
244
    AccumulateNick = 0;   MessanzahlNick = 0;
245
    AccumulateRoll = 0;   MessanzahlRoll = 0;
246
    AccumulateGier = 0;   MessanzahlGier = 0;
247
    accumulate_AccRoll = 0;messanzahl_AccRoll = 0;
248
    accumulate_AccNick = 0;messanzahl_AccNick = 0;
249
    accumulate_AccHoch = 0;messanzahl_AccHoch = 0;
250
    // ADC einschalten
212 dynahenry 251
    ANALOG_ON;
1 ingob 252
    if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--;
253
    if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--;
254
    if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--;
255
    if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--;
256
    if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255;
257
    if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255;
258
    if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255;
259
    if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255;
260
}
261
 
262
//############################################################################
263
// Senden der Motorwerte per I2C-Bus
264
void SendMotorData(void)
265
//############################################################################
212 dynahenry 266
{
1 ingob 267
    if(MOTOR_OFF || !MotorenEin)
268
        {
269
        Motor_Hinten = 0;
270
        Motor_Vorne = 0;
271
        Motor_Rechts = 0;
272
        Motor_Links = 0;
273
        if(MotorTest[0]) Motor_Vorne = MotorTest[0];
274
        if(MotorTest[1]) Motor_Hinten = MotorTest[1];
275
        if(MotorTest[2]) Motor_Links = MotorTest[2];
276
        if(MotorTest[3]) Motor_Rechts = MotorTest[3];
277
        }
278
 
279
    DebugOut.Analog[12] = Motor_Vorne;
280
    DebugOut.Analog[13] = Motor_Hinten;
281
    DebugOut.Analog[14] = Motor_Links;
212 dynahenry 282
    DebugOut.Analog[15] = Motor_Rechts;
1 ingob 283
 
284
    //Start I2C Interrupt Mode
285
    twi_state = 0;
286
    motor = 0;
212 dynahenry 287
    i2c_start();
1 ingob 288
}
289
 
290
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
212 dynahenry 291
// + Konstanten
1 ingob 292
// + 0-250 -> normale Werte
293
// + 251 -> Poti1
294
// + 252 -> Poti2
295
// + 253 -> Poti3
296
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
297
void DefaultKonstanten1(void)
298
{
212 dynahenry 299
 EE_Parameter.Kanalbelegung[K_NICK]  = 3;
1 ingob 300
 EE_Parameter.Kanalbelegung[K_ROLL]  = 2;
212 dynahenry 301
 EE_Parameter.Kanalbelegung[K_GAS]   = 1;
1 ingob 302
 EE_Parameter.Kanalbelegung[K_GIER]  = 4;
303
 EE_Parameter.Kanalbelegung[K_POTI1] = 5;
304
 EE_Parameter.Kanalbelegung[K_POTI2] = 6;
305
 EE_Parameter.Kanalbelegung[K_POTI3] = 7;
306
 EE_Parameter.Kanalbelegung[K_POTI4] = 8;
212 dynahenry 307
 EE_Parameter.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01;
1 ingob 308
 EE_Parameter.Hoehe_MinGas = 30;
173 holgerb 309
 EE_Parameter.MaxHoehe     = 251;      // Wert : 0-32   251 -> Poti1
310
 EE_Parameter.Hoehe_P      = 10;       // Wert : 0-32
311
 EE_Parameter.Luftdruck_D  = 50;       // Wert : 0-250
312
 EE_Parameter.Hoehe_ACC_Wirkung = 50;  // Wert : 0-250
313
 EE_Parameter.Hoehe_Verstaerkung = 4;  // Wert : 0-50
314
 EE_Parameter.Stick_P = 4; //2         // Wert : 1-6
315
 EE_Parameter.Stick_D = 8; //8         // Wert : 0-64
316
 EE_Parameter.Gier_P = 16;             // Wert : 1-20
1 ingob 317
 EE_Parameter.Gas_Min = 15;            // Wert : 0-32
173 holgerb 318
 EE_Parameter.Gas_Max = 250;           // Wert : 33-250
319
 EE_Parameter.GyroAccFaktor = 26;      // Wert : 1-64
1 ingob 320
 EE_Parameter.KompassWirkung = 128;    // Wert : 0-250
321
 EE_Parameter.Gyro_P = 120; //80          // Wert : 0-250
322
 EE_Parameter.Gyro_I = 150;               // Wert : 0-250
173 holgerb 323
 EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250
1 ingob 324
 EE_Parameter.NotGas = 35;                // Wert : 0-250     // Gaswert bei Empangsverlust
325
 EE_Parameter.NotGasZeit = 20;            // Wert : 0-250     // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen
326
 EE_Parameter.UfoAusrichtung = 0;         // X oder + Formation
173 holgerb 327
 EE_Parameter.I_Faktor = 0;
1 ingob 328
 EE_Parameter.UserParam1 = 0;             //zur freien Verwendung
329
 EE_Parameter.UserParam2 = 0;             //zur freien Verwendung
330
 EE_Parameter.UserParam3 = 0;             //zur freien Verwendung
331
 EE_Parameter.UserParam4 = 0;             //zur freien Verwendung
332
 EE_Parameter.ServoNickControl = 100;     // Wert : 0-250     // Stellung des Servos
333
 EE_Parameter.ServoNickComp = 40;         // Wert : 0-250     // Einfluss Gyro/Servo
334
 EE_Parameter.ServoNickCompInvert = 0;    // Wert : 0-250     // Richtung Einfluss Gyro/Servo
173 holgerb 335
 EE_Parameter.ServoNickMin = 50;          // Wert : 0-250     // Anschlag
1 ingob 336
 EE_Parameter.ServoNickMax = 150;         // Wert : 0-250     // Anschlag
337
 EE_Parameter.ServoNickRefresh = 5;
173 holgerb 338
 EE_Parameter.LoopGasLimit = 50;
339
 EE_Parameter.LoopThreshold = 90;         // Wert: 0-250  Schwelle für Stickausschlag
340
 EE_Parameter.LoopConfig = 0;             // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt
212 dynahenry 341
 memcpy(EE_Parameter.Name, "Sport\0", 12);
1 ingob 342
}
343
 
344
void DefaultKonstanten2(void)
345
{
212 dynahenry 346
 EE_Parameter.Kanalbelegung[K_NICK]  = 3;
1 ingob 347
 EE_Parameter.Kanalbelegung[K_ROLL]  = 2;
212 dynahenry 348
 EE_Parameter.Kanalbelegung[K_GAS]   = 1;
1 ingob 349
 EE_Parameter.Kanalbelegung[K_GIER]  = 4;
350
 EE_Parameter.Kanalbelegung[K_POTI1] = 5;
351
 EE_Parameter.Kanalbelegung[K_POTI2] = 6;
352
 EE_Parameter.Kanalbelegung[K_POTI3] = 7;
55 ingob 353
 EE_Parameter.Kanalbelegung[K_POTI4] = 8;
212 dynahenry 354
 EE_Parameter.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01;
1 ingob 355
 EE_Parameter.Hoehe_MinGas = 30;
356
 EE_Parameter.MaxHoehe     = 251;     // Wert : 0-32   251 -> Poti1
357
 EE_Parameter.Hoehe_P      = 10;      // Wert : 0-32
358
 EE_Parameter.Luftdruck_D  = 50;      // Wert : 0-250
359
 EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250
360
 EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50
361
 EE_Parameter.Stick_P = 4; //2           // Wert : 1-6
362
 EE_Parameter.Stick_D = 0; //8           // Wert : 0-64
363
 EE_Parameter.Gier_P = 16;            // Wert : 1-20
364
 EE_Parameter.Gas_Min = 15;            // Wert : 0-32
365
 EE_Parameter.Gas_Max = 250;          // Wert : 33-250
366
 EE_Parameter.GyroAccFaktor = 26;     // Wert : 1-64
367
 EE_Parameter.KompassWirkung = 128;    // Wert : 0-250
368
 EE_Parameter.Gyro_P = 175; //80           // Wert : 0-250
369
 EE_Parameter.Gyro_I = 175;           // Wert : 0-250
173 holgerb 370
 EE_Parameter.UnterspannungsWarnung = 94;  // Wert : 0-250
1 ingob 371
 EE_Parameter.NotGas = 35;                 // Wert : 0-250     // Gaswert bei Empangsverlust
372
 EE_Parameter.NotGasZeit = 20;             // Wert : 0-250     // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen
373
 EE_Parameter.UfoAusrichtung = 0;         // X oder + Formation
173 holgerb 374
 EE_Parameter.I_Faktor = 0;
1 ingob 375
 EE_Parameter.UserParam1 = 0;   //zur freien Verwendung
376
 EE_Parameter.UserParam2 = 0;   //zur freien Verwendung
377
 EE_Parameter.UserParam3 = 0;   //zur freien Verwendung
378
 EE_Parameter.UserParam4 = 0;   //zur freien Verwendung
379
 EE_Parameter.ServoNickControl = 100;     // Wert : 0-250     // Stellung des Servos
380
 EE_Parameter.ServoNickComp = 40;         // Wert : 0-250     // Einfluss Gyro/Servo
381
 EE_Parameter.ServoNickCompInvert = 0;    // Wert : 0-250     // Richtung Einfluss Gyro/Servo
382
 EE_Parameter.ServoNickMin = 50;           // Wert : 0-250     // Anschlag
383
 EE_Parameter.ServoNickMax = 150;         // Wert : 0-250     // Anschlag
384
 EE_Parameter.ServoNickRefresh = 5;
173 holgerb 385
 EE_Parameter.LoopGasLimit = 50;
386
 EE_Parameter.LoopThreshold = 90;         // Wert: 0-250  Schwelle für Stickausschlag
212 dynahenry 387
 EE_Parameter.LoopConfig = 0;              // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts
388
 memcpy(EE_Parameter.Name, "Kamera\0", 12);
1 ingob 389
}
390
 
391
 
392
//############################################################################
393
// Trägt ggf. das Poti als Parameter ein
212 dynahenry 394
void ParameterZuordnung(void)
1 ingob 395
//############################################################################
396
{
397
 
398
 #define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;}
399
 CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255);
400
 CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100);
401
 CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100);
402
 CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255);
403
 CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255);
404
 CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255);
405
 CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255);
212 dynahenry 406
 CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255);
407
 CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255);
408
 CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255);
409
 CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255);
410
 CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255);
1 ingob 411
 CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255);
412
 CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255);
413
 CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255);
173 holgerb 414
 CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255);
1 ingob 415
 
416
 Ki = (float) Parameter_I_Faktor * 0.0001;
417
 MAX_GAS = EE_Parameter.Gas_Max;
418
 MIN_GAS = EE_Parameter.Gas_Min;
419
}
420
 
421
 
422
//############################################################################
423
//
424
void MotorRegler(void)
425
//############################################################################
426
{
427
         int motorwert,pd_ergebnis,h,tmp_int;
428
         int GierMischanteil,GasMischanteil;
429
     static long SummeNick=0,SummeRoll=0;
430
     static long sollGier = 0,tmp_long,tmp_long2;
173 holgerb 431
     long IntegralFehlerNick = 0;
432
     long IntegralFehlerRoll = 0;
1 ingob 433
         static unsigned int RcLostTimer;
434
         static unsigned char delay_neutral = 0;
435
         static unsigned char delay_einschalten = 0,delay_ausschalten = 0;
436
         static unsigned int  modell_fliegt = 0;
437
     static int hoehenregler = 0;
438
     static char TimerWerteausgabe = 0;
439
     static char NeueKompassRichtungMerken = 0;
212 dynahenry 440
        Mittelwert();
1 ingob 441
 
442
    GRN_ON;
443
 
212 dynahenry 444
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 445
// Gaswert ermitteln
212 dynahenry 446
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 447
        GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120;
448
    if(GasMischanteil < 0) GasMischanteil = 0;
212 dynahenry 449
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 450
// Emfang schlecht
212 dynahenry 451
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 452
   if(SenderOkay < 100)
453
        {
212 dynahenry 454
        if(!PcZugriff)
173 holgerb 455
         {
212 dynahenry 456
           if(BeepMuster == 0xffff)
457
            {
173 holgerb 458
             beeptime = 15000;
459
             BeepMuster = 0x0c00;
212 dynahenry 460
            }
173 holgerb 461
         }
212 dynahenry 462
        if(RcLostTimer) RcLostTimer--;
463
        else
1 ingob 464
         {
465
          MotorenEin = 0;
466
          Notlandung = 0;
212 dynahenry 467
         }
1 ingob 468
        ROT_ON;
469
        if(modell_fliegt > 2000)  // wahrscheinlich in der Luft --> langsam absenken
470
            {
471
            GasMischanteil = EE_Parameter.NotGas;
472
            Notlandung = 1;
473
            PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0;
474
            PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0;
475
            PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0;
173 holgerb 476
            }
1 ingob 477
         else MotorenEin = 0;
478
        }
212 dynahenry 479
        else
480
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 481
// Emfang gut
212 dynahenry 482
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 483
        if(SenderOkay > 140)
484
            {
485
            Notlandung = 0;
486
            RcLostTimer = EE_Parameter.NotGasZeit * 50;
487
            if(GasMischanteil > 40)
488
                {
489
                if(modell_fliegt < 0xffff) modell_fliegt++;
490
                }
491
            if((modell_fliegt < 200) || (GasMischanteil < 40))
492
                {
493
                SummeNick = 0;
494
                SummeRoll = 0;
212 dynahenry 495
                Mess_Integral_Gier = 0;
1 ingob 496
                Mess_Integral_Gier2 = 0;
497
                }
498
            if((GasMischanteil > 200) && MotorenEin == 0)
499
                {
212 dynahenry 500
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 501
// auf Nullwerte kalibrieren
212 dynahenry 502
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 503
                if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75)  // Neutralwerte
504
                    {
505
                    unsigned char setting;
506
                    if(++delay_neutral > 200)  // nicht sofort
507
                        {
508
                        GRN_OFF;
509
                        MotorenEin = 0;
510
                        delay_neutral = 0;
511
                        modell_fliegt = 0;
512
                        if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70)
513
                        {
514
                         if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1;
515
                         if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2;
516
                         if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3;
517
                         if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4;
518
                         if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5;
519
                         eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting);  // aktiven Datensatz merken
520
                        }
521
                        if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // Höhenregelung aktiviert?
522
                          {
523
                             if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
212 dynahenry 524
                          }
173 holgerb 525
                            ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
526
                        SetNeutral();
527
                        Piep(GetActiveParamSetNumber());
212 dynahenry 528
                        }
1 ingob 529
                    }
530
                 else delay_neutral = 0;
531
                }
212 dynahenry 532
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 533
// Gas ist unten
212 dynahenry 534
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 535
            if(GasMischanteil < 35)
536
                {
537
                // Starten
538
                if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75)
539
                    {
212 dynahenry 540
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 541
// Einschalten
212 dynahenry 542
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 543
                    if(++delay_einschalten > 200)
544
                        {
545
                        delay_einschalten = 200;
546
                        modell_fliegt = 1;
547
                        MotorenEin = 1;
548
                        sollGier = 0;
212 dynahenry 549
                        Mess_Integral_Gier = 0;
1 ingob 550
                        Mess_Integral_Gier2 = 0;
551
                        Mess_IntegralNick = 0;
552
                        Mess_IntegralRoll = 0;
553
                        Mess_IntegralNick2 = IntegralNick;
554
                        Mess_IntegralRoll2 = IntegralRoll;
555
                        SummeNick = 0;
556
                        SummeRoll = 0;
212 dynahenry 557
                        }
558
                    }
1 ingob 559
                    else delay_einschalten = 0;
560
                //Auf Neutralwerte setzen
212 dynahenry 561
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 562
// Auschalten
212 dynahenry 563
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 564
                if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75)
565
                    {
566
                    if(++delay_ausschalten > 200)  // nicht sofort
567
                        {
568
                        MotorenEin = 0;
569
                        delay_ausschalten = 200;
570
                        modell_fliegt = 0;
212 dynahenry 571
                        }
1 ingob 572
                    }
573
                else delay_ausschalten = 0;
574
                }
575
            }
576
 
212 dynahenry 577
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 578
// neue Werte von der Funke
212 dynahenry 579
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
580
 if(!NewPpmData-- || Notlandung)
1 ingob 581
  {
582
    ParameterZuordnung();
212 dynahenry 583
    StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P;
1 ingob 584
    StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D;
585
    StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P;
586
    StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D;
587
    StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
588
    GyroFaktor     = ((float)Parameter_Gyro_P + 10.0) / 256.0;
589
    IntegralFaktor = ((float) Parameter_Gyro_I) / 44000;
590
 
591
    if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor =  0;
592
    if(GyroFaktor < 0) GyroFaktor = 0;
593
    if(IntegralFaktor < 0) IntegralFaktor = 0;
212 dynahenry 594
 
595
    //------HF------- LEDs Schalten - LED1 Normal, LED2 Blitzlicht
596
        LED_Switch = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]];
597
        if (((LED_Switch > 32) & (LED_Switch < 96)) | (LED_Switch > 160)) LED_2++; else if (LED_2 > 0) LED_2--;
598
        if ((LED_Switch > 96)) LED_1++; else if (LED_1 > 0) LED_1--;
599
        if (LED_1 >= 10) {LED_1 = 10; LED1_ON;}
600
    if (LED_1 <=  1) LED1_OFF;
601
        if (LED_2 >= 10) {LED_2 = 10; LED_2on = 1;}
602
        if (LED_2 <=  1) LED_2on = 0;
603
        if (LED_2on  ==  1) LED_flash++;
604
        if (LED_flash > 77) LED2_ON; else LED2_OFF;
605
        if (LED_flash > 80) LED_flash = 0;
606
        //------HF------- End LEDs Schalten
607
 
173 holgerb 608
    // greift in den Stick ein, um ungewolltes überschlagen zu verhindern
609
    if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS))
610
     {
212 dynahenry 611
      if(IntegralNick >  60000)
612
      {
613
       StickNick -=  8 * EE_Parameter.Stick_P;
614
       if(IntegralNick >  80000) StickNick -= 16 * EE_Parameter.Stick_P;
615
      }
173 holgerb 616
      else
212 dynahenry 617
      if(IntegralNick < -60000)
173 holgerb 618
      {
619
       StickNick += 8 * EE_Parameter.Stick_P;
212 dynahenry 620
       if(IntegralNick >  80000) StickNick -= 16 * EE_Parameter.Stick_P;
621
      }
622
      if(IntegralRoll >  60000)
623
      {
624
       StickRoll -=  8 * EE_Parameter.Stick_P;
625
       if(IntegralRoll >  80000) StickRoll -= 16 * EE_Parameter.Stick_P;
626
      }
173 holgerb 627
      else
212 dynahenry 628
      if(IntegralRoll < -60000)
173 holgerb 629
      {
630
       StickRoll += 8 * EE_Parameter.Stick_P;
212 dynahenry 631
       if(IntegralRoll >  80000) StickRoll -= 16 * EE_Parameter.Stick_P;
632
      }
173 holgerb 633
     }
634
 
1 ingob 635
  }
173 holgerb 636
 
212 dynahenry 637
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 638
// Looping?
212 dynahenry 639
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 640
  if(((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) ||
641
     ((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS))
212 dynahenry 642
   {
173 holgerb 643
    Looping_Roll = 1;
644
    if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit;
645
   }
212 dynahenry 646
   else Looping_Roll = 0;
173 holgerb 647
 
648
  if(((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) ||
649
     ((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN))
212 dynahenry 650
   {
173 holgerb 651
    Looping_Nick = 1;
212 dynahenry 652
    Looping_Roll = 0;
173 holgerb 653
    if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit;
654
   }
212 dynahenry 655
   else Looping_Nick = 0;
173 holgerb 656
 
212 dynahenry 657
 
658
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
659
// Bei Empfangsausfall im Flug
660
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 661
   if(Notlandung)
662
    {
663
     StickGier = 0;
664
     StickNick = 0;
665
     StickRoll = 0;
666
     GyroFaktor  = 0.1;
667
     IntegralFaktor = 0.005;
173 holgerb 668
     Looping_Roll = 0;
669
     Looping_Nick = 0;
212 dynahenry 670
    }
671
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 672
// Gyro-Drift kompensieren
212 dynahenry 673
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 674
#define DRIFT_FAKTOR 3
675
    if(ZaehlMessungen >= 1000 / DRIFT_FAKTOR)
676
        {
677
        IntegralFehlerNick = IntegralNick2 - IntegralNick;
678
        IntegralFehlerRoll = IntegralRoll2 - IntegralRoll;
679
        ZaehlMessungen = 0;
680
        if(IntegralFehlerNick > 500/DRIFT_FAKTOR)   AdNeutralNick++;
681
        if(IntegralFehlerNick < -500/DRIFT_FAKTOR)  AdNeutralNick--;
682
        if(IntegralFehlerRoll > 500/DRIFT_FAKTOR)   AdNeutralRoll++;
683
        if(IntegralFehlerRoll < -500/DRIFT_FAKTOR)  AdNeutralRoll--;
212 dynahenry 684
//        if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR)  AdNeutralGier--;   // macht nur mit Referenz (Kompass Sinn)
685
//        if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR)  AdNeutralGier++;   // macht nur mit Referenz (Kompass Sinn)
1 ingob 686
    ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern
212 dynahenry 687
        Mess_IntegralNick2 = IntegralNick;
1 ingob 688
        Mess_IntegralRoll2 = IntegralRoll;
689
        Mess_Integral_Gier2 = Integral_Gier;
690
    ANALOG_ON;  // ADC einschalten
212 dynahenry 691
        }
692
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 693
// Integrale auf ACC-Signal abgleichen
212 dynahenry 694
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 695
  if(IntegralFaktor && !Looping_Nick && !Looping_Roll)
696
  {
697
    tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick);
212 dynahenry 698
    if(labs(Mittelwert_AccNick) < 200) tmp_long /= 8;
173 holgerb 699
    else tmp_long /= 16;
212 dynahenry 700
    tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll);
701
    if(labs(Mittelwert_AccRoll) < 200) tmp_long2 /= 8;
173 holgerb 702
    else tmp_long2 /= 16;
703
 
704
 #define AUSGLEICH 500
1 ingob 705
    if(tmp_long >  AUSGLEICH)  tmp_long  = AUSGLEICH;
706
    if(tmp_long < -AUSGLEICH)  tmp_long  =-AUSGLEICH;
707
    if(tmp_long2 > AUSGLEICH)  tmp_long2 = AUSGLEICH;
708
    if(tmp_long2 <-AUSGLEICH)  tmp_long2 =-AUSGLEICH;
173 holgerb 709
  }
212 dynahenry 710
  else
173 holgerb 711
  {
712
   tmp_long = 0;
713
   tmp_long2 = 0;
714
  }
1 ingob 715
 ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern
716
    Mess_IntegralNick -= tmp_long;
717
    Mess_IntegralRoll -= tmp_long2;
212 dynahenry 718
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 719
//  Gieren
212 dynahenry 720
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
721
    if(abs(StickGier) > 35)
1 ingob 722
     {
723
      if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1;
724
     }
173 holgerb 725
    tmp_int  = EE_Parameter.Gier_P * (StickGier * abs(StickGier)) / 512; // expo  y = ax + bx²
212 dynahenry 726
    tmp_int += (EE_Parameter.Gier_P * StickGier) / 4;
173 holgerb 727
    sollGier = tmp_int;
212 dynahenry 728
    Mess_Integral_Gier -= tmp_int;
173 holgerb 729
    if(Mess_Integral_Gier > 25000) Mess_Integral_Gier = 25000;  // begrenzen
730
    if(Mess_Integral_Gier <-25000) Mess_Integral_Gier =-25000;
212 dynahenry 731
 
1 ingob 732
 ANALOG_ON;     // ADC einschalten
733
 
212 dynahenry 734
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 735
//  Kompass
212 dynahenry 736
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
737
    if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV))
1 ingob 738
     {
739
       int w,v;
740
       static int SignalSchlecht = 0;
741
       w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln
742
       v = abs(IntegralRoll /512);
743
       if(v > w) w = v; // grösste Neigung ermitteln
212 dynahenry 744
       if(w < 25 && NeueKompassRichtungMerken && !SignalSchlecht)
745
        {
1 ingob 746
         KompassStartwert = KompassValue;
747
         NeueKompassRichtungMerken = 0;
748
        }
749
       w = (w * Parameter_KompassWirkung) / 64;           // auf die Wirkung normieren
750
       w = Parameter_KompassWirkung - w;                  // Wirkung ggf drosseln
751
       if(w > 0)
752
        {
753
          ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern
754
          if(!SignalSchlecht) Mess_Integral_Gier += (KompassRichtung * w) / 32;  // nach Kompass ausrichten
755
          ANALOG_ON;  // ADC einschalten
756
          if(SignalSchlecht) SignalSchlecht--;
212 dynahenry 757
        }
1 ingob 758
        else SignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek
212 dynahenry 759
     }
760
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 761
 
212 dynahenry 762
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 763
//  Debugwerte zuordnen
212 dynahenry 764
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 765
  if(!TimerWerteausgabe--)
766
   {
767
    TimerWerteausgabe = 49;
768
    DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor;
769
    DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor;
770
    DebugOut.Analog[2] = Mittelwert_AccNick;
771
    DebugOut.Analog[3] = Mittelwert_AccRoll;
772
    DebugOut.Analog[4] = MesswertGier;
773
    DebugOut.Analog[5] = HoehenWert;
774
    DebugOut.Analog[6] = (Mess_Integral_Hoch / 512);
775
    DebugOut.Analog[8] = KompassValue;
173 holgerb 776
 
777
/*    DebugOut.Analog[16] = motor_rx[0];
778
    DebugOut.Analog[17] = motor_rx[1];
779
    DebugOut.Analog[18] = motor_rx[2];
780
    DebugOut.Analog[19] = motor_rx[3];
781
    DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3];
782
    DebugOut.Analog[20] /= 14;
783
    DebugOut.Analog[21] = motor_rx[4];
784
    DebugOut.Analog[22] = motor_rx[5];
785
    DebugOut.Analog[23] = motor_rx[6];
786
    DebugOut.Analog[24] = motor_rx[7];
787
    DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7];
788
*/
789
//    DebugOut.Analog[9] = MesswertNick;
1 ingob 790
//    DebugOut.Analog[9] = SollHoehe;
791
//    DebugOut.Analog[10] = Mess_Integral_Gier / 128;
792
//    DebugOut.Analog[11] = KompassStartwert;
212 dynahenry 793
//    DebugOut.Analog[10] = Parameter_Gyro_I;
794
//    DebugOut.Analog[10] = EE_Parameter.Gyro_I;
795
//    DebugOut.Analog[9] = KompassRichtung;
1 ingob 796
//    DebugOut.Analog[10] = GasMischanteil;
797
//    DebugOut.Analog[3] = HoeheD * 32;
798
//    DebugOut.Analog[4] = hoehenregler;
799
  }
800
 
212 dynahenry 801
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 802
//  Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen
212 dynahenry 803
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 804
    if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor;
805
    else             MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor;
806
    if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor;
807
    else             MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor;
808
//    MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor;
809
    MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2;
1 ingob 810
 
811
    // Maximalwerte abfangen
812
    #define MAX_SENSOR  2048
813
    if(MesswertNick >  MAX_SENSOR) MesswertNick =  MAX_SENSOR;
814
    if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR;
815
    if(MesswertRoll >  MAX_SENSOR) MesswertRoll =  MAX_SENSOR;
816
    if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR;
817
    if(MesswertGier >  MAX_SENSOR) MesswertGier =  MAX_SENSOR;
818
    if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR;
819
 
212 dynahenry 820
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 821
// Höhenregelung
822
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht
212 dynahenry 823
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 824
//OCR0B = 180 - (Poti1 + 120) / 4;
825
//DruckOffsetSetting = OCR0B;
826
 if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG))  // Höhenregelung
827
  {
828
    int tmp_int;
829
    if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)  // Regler wird über Schalter gesteuert
830
    {
212 dynahenry 831
     if(Parameter_MaxHoehe < 50)
1 ingob 832
      {
833
       SollHoehe = HoehenWert - 20;  // Parameter_MaxHoehe ist der PPM-Wert des Schalters
834
       HoehenReglerAktiv = 0;
835
      }
212 dynahenry 836
      else
1 ingob 837
        HoehenReglerAktiv = 1;
838
    }
212 dynahenry 839
    else
1 ingob 840
    {
841
     SollHoehe = Parameter_MaxHoehe * EE_Parameter.Hoehe_Verstaerkung - 20;
842
     HoehenReglerAktiv = 1;
843
    }
844
 
845
    if(Notlandung) SollHoehe = 0;
846
    h = HoehenWert;
847
    if((h > SollHoehe) && HoehenReglerAktiv)      // zu hoch --> drosseln
848
     {      h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil
849
      h = GasMischanteil - h;         // vom Gas abziehen
850
      h -= (HoeheD * Parameter_Luftdruck_D)/8;    // D-Anteil
851
      tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32;
852
      if(tmp_int > 50) tmp_int = 50;
853
      else if(tmp_int < -50) tmp_int = -50;
854
      h -= tmp_int;
212 dynahenry 855
      hoehenregler = (hoehenregler*15 + h) / 16;
1 ingob 856
      if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN
857
       {
858
         if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas;
859
         if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil;
212 dynahenry 860
       }
1 ingob 861
      if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas
862
      GasMischanteil = hoehenregler;
212 dynahenry 863
     }
1 ingob 864
  }
212 dynahenry 865
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 866
// + Mischer und PI-Regler
212 dynahenry 867
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 868
  DebugOut.Analog[7] = GasMischanteil;
1 ingob 869
 
212 dynahenry 870
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 871
// Gier-Anteil
212 dynahenry 872
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 873
#define MUL_G  1.4
874
    GierMischanteil = MesswertGier - sollGier;     // Regler für Gier
875
//GierMischanteil = 0;
876
    if(GierMischanteil > (MUL_G * GasMischanteil))  GierMischanteil = MUL_G * GasMischanteil;
877
    if(GierMischanteil < -(MUL_G * GasMischanteil)) GierMischanteil = -(MUL_G * GasMischanteil);
878
 
879
    if(GasMischanteil < 10) GierMischanteil = 0;
212 dynahenry 880
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 881
// Nick-Achse
212 dynahenry 882
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
173 holgerb 883
 
1 ingob 884
    DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick));    // Differenz bestimmen
885
    SummeNick += DiffNick;                                   // I-Anteil
212 dynahenry 886
    if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1;
1 ingob 887
    if(SummeNick >  16000) SummeNick =  16000;
888
    if(SummeNick < -16000) SummeNick = -16000;
212 dynahenry 889
    pd_ergebnis = DiffNick;// + Ki * SummeNick; // PI-Regler für Nick
1 ingob 890
    // Motor Vorn
173 holgerb 891
#define MUL  2
212 dynahenry 892
    if((pd_ergebnis >  MUL * (GasMischanteil))) pd_ergebnis =  MUL * (GasMischanteil);
893
    if((pd_ergebnis < -MUL * (GasMischanteil))) pd_ergebnis = -MUL * (GasMischanteil);
173 holgerb 894
 
1 ingob 895
    motorwert = GasMischanteil + pd_ergebnis + GierMischanteil;   // Mischer
173 holgerb 896
        if ((motorwert < 0)) motorwert = 0;
1 ingob 897
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
212 dynahenry 898
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
899
        Motor_Vorne = motorwert;
1 ingob 900
    // Motor Heck
901
        motorwert = GasMischanteil - pd_ergebnis + GierMischanteil;
173 holgerb 902
        if ((motorwert < 0)) motorwert = 0;
1 ingob 903
        else if(motorwert > MAX_GAS)        motorwert = MAX_GAS;
904
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
212 dynahenry 905
        Motor_Hinten = motorwert;
906
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 907
// Roll-Achse
212 dynahenry 908
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 909
        DiffRoll = Kp * (MesswertRoll - (StickRoll  - GPS_Roll));       // Differenz bestimmen
910
        SummeRoll += DiffRoll;                                                              // I-Anteil
911
    if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1;
912
    if(SummeRoll >  16000) SummeRoll =  16000;
913
    if(SummeRoll < -16000) SummeRoll = -16000;
173 holgerb 914
    pd_ergebnis = DiffRoll;// + Ki * SummeRoll; // PI-Regler für Roll
212 dynahenry 915
    if((pd_ergebnis >  MUL * (GasMischanteil))) pd_ergebnis =  MUL * (GasMischanteil);
916
    if((pd_ergebnis < -MUL * (GasMischanteil))) pd_ergebnis = -MUL * (GasMischanteil);
1 ingob 917
    // Motor Links
918
    motorwert = GasMischanteil + pd_ergebnis - GierMischanteil;
173 holgerb 919
        if ((motorwert < 0)) motorwert = 0;
1 ingob 920
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
921
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
212 dynahenry 922
        Motor_Links = motorwert;
1 ingob 923
    // Motor Rechts
924
        motorwert = GasMischanteil - pd_ergebnis - GierMischanteil;
173 holgerb 925
        if ((motorwert < 0)) motorwert = 0;
1 ingob 926
        else if(motorwert > MAX_GAS)            motorwert = MAX_GAS;
212 dynahenry 927
        if (motorwert < MIN_GAS)            motorwert = MIN_GAS;
1 ingob 928
        Motor_Rechts = motorwert;
929
   // +++++++++++++++++++++++++++++++++++++++++++++++
930
}
931