Subversion Repositories FlightCtrl

Rev

Rev 1134 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1134 Rev 1141
1
/* pitch_neutral.c
1
/* pitch_neutral.c
2
 *
2
 *
3
 * Copyright 2009 Thomas Jachmann
3
 * Copyright 2009 Thomas Jachmann
4
 */
4
 */
5
 
5
 
6
#include "main.h"
6
#include "main.h"
7
#include "parameter.h"
7
#include "parameter.h"
8
#include "fc.h"
8
#include "fc.h"
9
#include "altcon.h"
9
#include "altcon.h"
10
#include "pitch.h"
10
#include "pitch.h"
11
#include "pitch_neutral.h"
11
#include "pitch_neutral.h"
12
 
12
 
13
#define STATE_STARTUP_WAIT              0x00                    // Init-Timeout beim Einschalten abwarten
13
#define STATE_INITIALIZE                0x00                    // Initialisierung nach Einschalten der Motoren
14
#define STATE_STARTUP_INIT              0x01                    // Initialisierung beim Einschalten
14
#define STATE_SETUP                     0x01                    // Kalibrierung des Gas-Sticks
15
#define STATE_BEGIN                     0x02                    // Anfangszustand nach Einschalten der Motoren
15
#define STATE_SETUP1                    0x02                    //
16
#define STATE_INITIALIZING              0x03                    // Initialisierungsphase
16
#define STATE_BEGIN                     0x03                    // Startphase
17
#define STATE_MANUAL                    0x04                    // Manuelle Kontrolle, Höhenregelung in Konfiguration deaktiviert
17
#define STATE_BEGIN1                    0x04                    //
18
#define STATE_INACTIVE                  0x05                    // Manuelle Kontrolle
18
#define STATE_INACTIVE                  0x05                    // Manuelle Kontrolle
19
#define STATE_WAIT                      0x06                    // Warten auf Einschalten der Höhenregelung
19
#define STATE_WAIT                      0x06                    // Warten auf Einschalten der Höhenregelung
20
#define STATE_ACTIVATING                0x07                    // Aktivierung der Höhenregelung
20
#define STATE_ACTIVATING                0x07                    // Aktivierung der Höhenregelung
21
#define STATE_ACTIVE                    0x08                    // Höhenregelung ist aktiv
21
#define STATE_ACTIVE                    0x08                    // Höhenregelung ist aktiv
22
 
22
 
23
 
23
 
24
static int      stickValue              = 0;                            // Aktueller Stick-Wert
24
static int      stickValue              = 0;                            // Aktueller Stick-Wert
25
static int      lastStickValue          = 0;                            // Vorheriger Stick-Wert
25
static int      lastStickValue          = 0;                            // Vorheriger Stick-Wert
26
static int      pitchOffset             = 0;                            // Aktueller Grundgaswert in Neutralstellung
26
static int      pitchOffset             = 0;                            // Aktueller Grundgaswert in Neutralstellung
27
static char     state                   = STATE_STARTUP_WAIT;           // Zustand
27
static char     state;                                                  // Zustand
28
static int      temp;
28
static int      temp;
-
 
29
 
-
 
30
char            pitchNeutralDiff        = 0;
-
 
31
 
29
 
32
 
30
/* Wird verwendet, um das Umschalten auf automatische Höhenregelung
33
/* Wird verwendet, um das Umschalten auf automatische Höhenregelung
31
 * nach Erreichen der Neutralstellung zu verzögern.
34
 * nach Erreichen der Neutralstellung zu verzögern.
32
 */
35
 */
33
static int      pitchNeutralTimer       = PITCH_NEUTRAL_TIMER;
36
static int      pitchNeutralTimer       = PITCH_NEUTRAL_TIMER;
34
 
37
 
-
 
38
 
-
 
39
void pitch_neutral_init( void ) {
-
 
40
        pitchNeutralDiff = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ] );
-
 
41
}
-
 
42
 
35
 
43
 
36
/*
44
/*
37
 * Berechnet den aktuellen Pitch-Wert für die Regelung
45
 * Berechnet den aktuellen Pitch-Wert für die Regelung
38
 *
46
 *
-
 
47
 * Funktionsweise:
-
 
48
 *
-
 
49
 * 1. Vor Verwendung der Pitch-Steuerung muß ein Parameter für den Gas-Stick eingestellt werden. Hierzu
-
 
50
 *    bewegt man den Roll-Stick ganz nach außen und startet die Motoren. Man befindet sich im Setup-Modus
-
 
51
 *    und die Motoren laufen unabhängig vom Gas-Stick im Leerlauf. Im Display auf Seite 12 muß nun der
-
 
52
 *    beste Wert für "StickDiff" gefunden werden. Den Wert ändern kann man mit dem Roll-Stick. Man betätigt
-
 
53
 *    nun den Gas-Stick nach oben und läßt ihn los, so daß er in die Mittelstellung zurückspringt. Der
-
 
54
 *    optimale Wert sorgt dafür, daß das gewollte Loslassen von einer normalen Bewegung unterschieden wird.
-
 
55
 *    Jedesmal, wenn die SW das Loslassen als solches erkannt hat, ertönt ein Signal. Dieses darf jedoch
-
 
56
 *    nicht ertönen, wenn man den Stick mit normaler Geschwindigkeit in die Mittelstellung zurückbewegt.
-
 
57
 *    Wurde ein guter Wert eingestellt, verläßt man den Setup-Modus durch Ausschalten der Motoren. Der
-
 
58
 *    ermittelte Wert wird permanent im EEProm gespeichert und muß nicht neu ermittelt werden.
-
 
59
 *
39
 * Nach dem Einschalten der FC wird der aktuelle Gas-Stick-Wert gelesen und als Kalibrierungswert
60
 * 2. Nach dem Einschalten der FC wird die aktuelle Gas-Stick-Position gemerkt und als Kalibrierungswert
40
 * für die Neutralstellung gespeichert. Somit spielt die korrekte Trimmung des Sticks auf Senderseite
61
 *    für die Neutralstellung gespeichert. Somit spielt die korrekte Trimmung des Sticks auf Senderseite
41
 * keine Rolle.
62
 *    keine Rolle.
42
 *
63
 *
43
 * Nach Einschalten der Motoren geht der Stick in Neutralstellung. Diese Stick-Bewegung wird ignoriert
64
 * 3. Nach Einschalten der Motoren geht der Stick in Neutralstellung. Diese Stick-Bewegung wird ignoriert
44
 * und die Motoren drehen mit dem eingestellten MinGas2. Ausgehend von der Neutralstellung wird nun
65
 *    und die Motoren drehen mit dem eingestellten MinGas2. Ausgehend von der Neutralstellung wird nun
45
 * durch Bewegen des Sticks im oberen Bereich das Gas geregelt.
66
 *    durch Bewegen des Sticks im oberen Bereich das Gas geregelt.
46
 *
67
 *
47
 * Das erstmalige Aktivieren der automatischen Höhenregelung erfolgt durch Loslassen des Sticks im
68
 * 4. Das erstmalige Aktivieren der automatischen Höhenregelung erfolgt durch Loslassen des Sticks im
48
 * Schwebeflug. Der zuvor aktuelle Stick-Wert wird als Wert in Neutralstellung übernommen und die
69
 *    Schwebeflug. Der zuvor aktuelle Stick-Wert wird als Wert in Neutralstellung übernommen und die
49
 * automatische Höhenregelung sofort aktiviert.
70
 *    automatische Höhenregelung sofort aktiviert. Wichtig hierfür ist die unter Punkt 1 vorgenommene
-
 
71
 *    Parameterfindung. Stimmt dieser Wert nicht, führt das zur Wegnahme des Gases und somit zum Sinken.
50
 *
72
 *
51
 * Sobald der Stick die Neutralstellung verläßt, wird die automatische Höhenregelung deaktiviert
73
 * 5. Sobald der Stick die Neutralstellung verläßt, wird die automatische Höhenregelung deaktiviert
52
 * und der vorige Pitch-Wert als Wert der Neutralstellung übernommen. Der Pitch läßt sich nun
74
 *    und der vorige Pitch-Wert als Wert der Neutralstellung übernommen. Der Pitch läßt sich nun
53
 * über den gesamten Stick-Bereich regeln.
75
 *    über den gesamten Stick-Bereich regeln.
54
 *
76
 *
55
 * Erreicht der Stick ein weiteres Mal die Neutralstellung, wird die automatische Höhenregelung
77
 * 6. Erreicht der Stick ein weiteres Mal die Neutralstellung, wird die automatische Höhenregelung
56
 * wieder aktiviert, jetzt jedoch immer mit einer zeitlichen Verzögerung. Nur so ist ein
78
 *    wieder aktiviert, jetzt jedoch immer mit einer zeitlichen Verzögerung. Nur so ist ein
57
 * ungestörtes manuelles Steuern möglich.
79
 *    ungestörtes manuelles Steuern möglich.
58
 *
80
 *
59
 * Der Pitch-Wert ist innerhalb der Regelung durch ein konfigurierbares Minimalgas nach unten begrenzt.
81
 * 7. Der Pitch-Wert ist innerhalb der Regelung durch ein konfigurierbares Minimalgas nach unten begrenzt.
60
 * Dieses Minimalgas kann auf einen sehr niedrigen Wert eingestellt sein. Um im Flug nicht unterhalb
82
 *    Dieses Minimalgas kann auf einen sehr niedrigen Wert eingestellt sein. Um im Flug nicht unterhalb
61
 * eines Wertes zu gelangen, der die Lageregelung außer Funktion setzt, wird ein zweiter Wert für
83
 *    eines Wertes zu gelangen, der die Lageregelung außer Funktion setzt, wird ein zweiter Wert für
62
 * Minimalgas konfiguriert, der greift, sobald erstmalig die automatische Höhenregelung aktiviert wurde.
84
 *    Minimalgas konfiguriert, der greift, sobald erstmalig die automatische Höhenregelung aktiviert wurde.
63
 */
85
 */
64
int pitch_neutral_value( void ) {
86
int pitch_neutral_value( void ) {
65
 
87
 
66
        int register pitchCount = 0;
88
        int register pitchCount = 0;
67
       
89
       
68
        // Sind die Motoren eingeschaltet?
90
        // Sind die Motoren eingeschaltet? Ach ja, im Zustand STATE_SETUP sind die Motoren aus...
69
        if( MotorenEin ) {
91
        if( MotorenEin ) {
70
 
92
 
71
                // Vorigen Stick-Wert merken
93
                // Vorigen Stick-Wert merken
72
                lastStickValue = stickValue;
94
                lastStickValue = stickValue;
73
 
95
 
74
                /* StickValue exponentiell angleichen, da ausgehend von der Neutralstellung
96
                /* StickValue exponentiell angleichen, da ausgehend von der Neutralstellung
75
                 * nur jeweils die halbe Auflösung nach oben und unten zur Verfügung steht. Bei einer
97
                 * nur jeweils die halbe Auflösung nach oben und unten zur Verfügung steht. Bei einer
76
                 * Multiplikation mit 2 ließe sich das Gas im Schwebebereich nicht fein genug einstellen. */
98
                 * Multiplikation mit 2 ließe sich das Gas im Schwebebereich nicht fein genug einstellen. */
77
                temp = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - pitch_stickoffset();
99
                temp = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - pitch_initialStickValue();
78
                if( temp > 0 ) {
100
                if( temp > 0 ) {
79
                        temp = temp + ( ( temp * temp ) / 150 );
101
                        temp = temp + ( ( temp * temp ) / 150 );
80
                } else {
102
                } else {
81
                        temp = temp - ( ( temp * temp ) / 150 );
103
                        temp = temp - ( ( temp * temp ) / 150 );
82
                }
104
                }
83
 
-
 
84
                // Original-Stick-Wert holen und glätten
105
 
85
                stickValue = ( temp + 2 * lastStickValue ) / 3;
106
                stickValue = temp;
86
 
107
               
87
                /* Aktuellen Pitch-Wert berechnen. Der Wert ergibt sich aus dem Pitch-Offset
108
                /* Aktuellen Pitch-Wert berechnen. Der Wert ergibt sich aus dem Pitch-Offset
88
                 * zuzüglich dem Stick-Wert. */
109
                 * zuzüglich dem Stick-Wert. */
89
                pitchCount = stickValue + pitchOffset;
110
                pitchCount = stickValue + pitchOffset;
90
 
111
 
91
                switch( state ) {
112
                switch( state ) {
-
 
113
 
-
 
114
                        /* Entscheidet über Flugbetrieb oder Setup-Betrieb. Für den Setup-Betrieb
-
 
115
                         * muß beim Einschalten der Motoren gleichzeitig der Roll-Stick ganz
-
 
116
                         * betätigt werden (Richtung ist egal).
-
 
117
                         */
-
 
118
                        case STATE_INITIALIZE:
-
 
119
 
-
 
120
                                if( abs( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] ) > 70 ) {
-
 
121
                                        state = STATE_SETUP;
-
 
122
                                } else {
-
 
123
                                        state = STATE_BEGIN;
-
 
124
                                }
-
 
125
                                break;
-
 
126
 
-
 
127
                        case STATE_SETUP:
-
 
128
                                if( stickValue < PARAM_PITCH_STICK_THRESHOLD &&
-
 
129
                                    abs( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] ) < PARAM_PITCH_STICK_THRESHOLD ) {
-
 
130
                                        state = STATE_SETUP1;
-
 
131
                                }
-
 
132
                               
-
 
133
                                // Im Setup immer mit Leerlaufgas
-
 
134
                                pitchCount = 0;
-
 
135
                               
-
 
136
                                break;
-
 
137
                               
-
 
138
                        case STATE_SETUP1:
-
 
139
                       
-
 
140
                                // Roll-Stick nach links
-
 
141
                                if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] < -20 ) {
-
 
142
                                        if( pitchNeutralDiff < 20 ) {
-
 
143
                                                pitchNeutralDiff++;
-
 
144
                                       
-
 
145
                                                // Konfiguration dauerhaft speichern
-
 
146
                                                eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ], pitchNeutralDiff );
-
 
147
                                       
-
 
148
                                                // Signalisieren
-
 
149
                                                beeptime = 500;
-
 
150
                                       
-
 
151
                                                state    = STATE_SETUP;
-
 
152
                                        }
-
 
153
                                }
-
 
154
 
-
 
155
                                // Roll-Stick nach rechts
-
 
156
                                if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] > 20 ) {
-
 
157
                                        if( pitchNeutralDiff > 0 ) {
-
 
158
                                                pitchNeutralDiff--;
-
 
159
 
-
 
160
                                                // Konfiguration dauerhaft speichern
-
 
161
                                                eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ], pitchNeutralDiff );
-
 
162
 
-
 
163
                                                // Signalisieren
-
 
164
                                                beeptime = 500;
-
 
165
                                       
-
 
166
                                                state    = STATE_SETUP;
-
 
167
                                        }
-
 
168
                                }
-
 
169
 
-
 
170
                                if( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) &&
-
 
171
                                    ( lastStickValue - stickValue >= pitchNeutralDiff ) ) {
-
 
172
                                   
-
 
173
                                        state    = STATE_SETUP;
-
 
174
                                       
-
 
175
                                        // Signalisieren
-
 
176
                                        beeptime = 500;
-
 
177
                                }
-
 
178
                               
-
 
179
                                // Im Setup immer mit Leerlaufgas
-
 
180
                                pitchCount = 0;
-
 
181
                               
-
 
182
                                break;
92
               
183
 
93
                        case STATE_BEGIN:
184
                        case STATE_BEGIN:
94
 
185
 
95
                                // Schnelles Bewegen aus dem oberen Bereich des Sticks in Neutralstellung
186
                                // Schnelles Bewegen aus dem oberen Bereich des Sticks in Neutralstellung
96
                                if( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) &&
187
                                if( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) &&
97
                                    ( lastStickValue - stickValue >= PARAM_PITCH_NEUTRAL_DIFF ) ) {
188
                                    ( lastStickValue - stickValue >= pitchNeutralDiff ) ) {
98
 
189
 
99
                                        pitchOffset       = lastStickValue;
190
                                        pitchOffset       = lastStickValue;
100
                                       
191
                                       
101
                                        state             = STATE_INITIALIZING;
192
                                        state             = STATE_BEGIN1;
102
                                        pitchNeutralTimer = PITCH_NEUTRAL_TIMER;
193
                                        pitchNeutralTimer = PITCH_NEUTRAL_TIMER;
103
                                }
194
                                }
104
                                break;
195
                                break;
105
 
196
 
106
                        case STATE_INITIALIZING:
197
                        case STATE_BEGIN1:
107
 
198
 
108
                                // Während der Initialisierung das Gas konstant halten
199
                                // Während der Initialisierung das Gas konstant halten
109
                                pitchCount = pitchOffset;
200
                                pitchCount = pitchOffset;
110
 
201
 
111
                                pitchNeutralTimer--;
202
                                pitchNeutralTimer--;
112
 
203
 
113
                                /* Läuft der Timer ab, bevor der Stick die Neutralstellung erreicht,
204
                                /* Läuft der Timer ab, bevor der Stick die Neutralstellung erreicht,
114
                                 * wird die Aktion nicht als "schnelles Bewegen in Neutralstellung"
205
                                 * wird die Aktion nicht als "schnelles Bewegen in Neutralstellung"
115
                                 * gedeutet. */
206
                                 * gedeutet. */
116
                                if( !pitchNeutralTimer ) {
207
                                if( !pitchNeutralTimer ) {
117
                                        pitchOffset = 0;
208
                                        pitchOffset = 0;
118
                                        state       = STATE_BEGIN;
209
                                        state       = STATE_BEGIN;
119
                                }
210
                                }
120
 
211
 
121
                                // Ist die Neutralstellung erreicht?
212
                                // Ist die Neutralstellung erreicht?
122
                                if( abs( stickValue ) <= PARAM_PITCH_STICK_THRESHOLD ) {
213
                                if( abs( stickValue ) <= PARAM_PITCH_STICK_THRESHOLD ) {
123
 
-
 
124
                                        // Ist die Höhenregelung aktiviert?
-
 
125
                                        if( EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG ) {
-
 
126
                                                state = STATE_ACTIVATING;
214
                                        state = STATE_ACTIVATING;
127
                                        } else {
-
 
128
                                                state = STATE_MANUAL;
-
 
129
                                        }
-
 
130
                                }
-
 
131
                                break;
-
 
132
 
-
 
133
                        /* Wenn die Höhenregelung per Konfiguration deaktiviert ist, verbleibt
-
 
134
                         * die Funktion in diesem Zustand. */
-
 
135
                        case STATE_MANUAL:
-
 
136
                       
-
 
137
                                // Min2-Gas einstellen für Lageregelung bei Minimalgas
-
 
138
                                if( pitchCount < PARAM_PITCH_MIN2 ) {
-
 
139
                                        pitchCount = PARAM_PITCH_MIN2;
-
 
140
                                }
215
                                }
141
                                break;
216
                                break;
142
 
217
 
143
                        /* Die Höhenregelung ist per Konfiguration aktiviert, jedoch befindet
218
                        /* Die Höhenregelung ist per Konfiguration aktiviert, jedoch befindet
144
                         * sich der Stick außerhalb des als Neutralstellung anerkannten
219
                         * sich der Stick außerhalb des als Neutralstellung anerkannten
145
                         * Wertebereiches. Es wird manuell geregelt. */
220
                         * Wertebereiches. Es wird manuell geregelt. */
146
                        case STATE_INACTIVE:
221
                        case STATE_INACTIVE:
147
 
222
 
148
                                // Ist ein Restart zulässig?
223
                                // Ist ein Restart zulässig?
149
                                if( PARAM_PITCH_RESTART_ENABLED ) {
224
                                if( PARAM_PITCH_RESTART_ENABLED ) {
150
                               
225
                               
151
                                        /* Wenn der Gashebel ganz unten steht, Timer für Reduzierung des Minimalgaswertes
226
                                        /* Wenn der Gashebel ganz unten steht, Timer für Reduzierung des Minimalgaswertes
152
                                         * starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */
227
                                         * starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */
153
                                        if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) {
228
                                        if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) {
154
                                                pitchNeutralTimer = PITCH_MIN2_TIMER;
229
                                                pitchNeutralTimer = PITCH_MIN2_TIMER;
155
                                        } else {
230
                                        } else {
156
                                                pitchNeutralTimer--;
231
                                                pitchNeutralTimer--;
157
                                       
232
                                       
158
                                                /* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */
233
                                                /* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */
159
                                                if( !pitchNeutralTimer ) {
234
                                                if( !pitchNeutralTimer ) {
160
                                                        state       = STATE_BEGIN;
235
                                                        state       = STATE_BEGIN;
161
                                                        pitchOffset = 0;
236
                                                        pitchOffset = 0;
162
                                               
237
                                               
163
                                                        // Signalisieren
238
                                                        // Signalisieren
164
                                                        beeptime    = 500;
239
                                                        beeptime    = 500;
165
                                                }
240
                                                }
166
                                        }
241
                                        }
167
                                }
242
                                }
168
                               
243
                               
169
                                // Min2-Gas einstellen für Lageregelung bei Minimalgas
244
                                // Min2-Gas einstellen für Lageregelung bei Minimalgas
170
                                if( pitchCount < PARAM_PITCH_MIN2 ) {
245
                                if( pitchCount < PARAM_PITCH_MIN2 ) {
171
                                        pitchCount = PARAM_PITCH_MIN2;
246
                                        pitchCount = PARAM_PITCH_MIN2;
172
                                }
247
                                }
173
                               
248
                               
174
                                // Stick ist innerhalb der Neutralstellung
249
                                // Stick ist innerhalb der Neutralstellung
175
                                if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD ) {
250
                                if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD ) {
176
                               
251
                               
177
                                        // Timer neu setzen
252
                                        // Timer neu setzen
178
                                        pitchNeutralTimer = PITCH_NEUTRAL_TIMER;
253
                                        pitchNeutralTimer = PITCH_NEUTRAL_TIMER;
179
                                        state             = STATE_WAIT;
254
                                        state             = STATE_WAIT;
180
                                }
255
                                }
181
                                break;
256
                                break;
182
 
257
 
183
                        /* Der Stick ist in den für die Neutralstellung gültigen Wertebereich
258
                        /* Der Stick ist in den für die Neutralstellung gültigen Wertebereich
184
                         * gelangt. Nun darf innerhalb einer bestimmten Zeit keine Stick-Bewegung
259
                         * gelangt. Nun darf innerhalb einer bestimmten Zeit keine Stick-Bewegung
185
                         * erfolgen, um die automatische Höhenregelung zu aktivieren. */
260
                         * erfolgen, um die automatische Höhenregelung zu aktivieren. */
186
                        case STATE_WAIT:
261
                        case STATE_WAIT:
187
 
262
 
188
                                /* Stick ist innerhalb der Neutralstellung und
263
                                /* Stick ist innerhalb der Neutralstellung und
189
                                   Stick-Differenzial ist < 2 */
264
                                   Stick-Differenzial ist < 2 */
190
                                if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD &&
265
                                if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD &&
191
                                    lastStickValue == stickValue ) {
266
                                    lastStickValue == stickValue ) {
192
                               
267
                               
193
                                        pitchNeutralTimer--;
268
                                        pitchNeutralTimer--;
194
                                       
269
                                       
195
                                        if( !pitchNeutralTimer ) {
270
                                        if( !pitchNeutralTimer ) {
196
                                                state = STATE_ACTIVATING;
271
                                                state = STATE_ACTIVATING;
197
                                        }
272
                                        }
198
 
273
 
199
                                // Aktivierungskriterium nicht erfüllt, zurück in INACTIVE
274
                                // Aktivierungskriterium nicht erfüllt, zurück in INACTIVE
200
                                } else {
275
                                } else {
201
                                        state = STATE_INACTIVE;
276
                                        state = STATE_INACTIVE;
202
                                }
277
                                }
203
                                break;
278
                                break;
204
                       
279
                       
205
                        /* Die automatische Höhenregelung wird jetzt aktiviert. Der aktuelle
280
                        /* Die automatische Höhenregelung wird jetzt aktiviert. Der aktuelle
206
                         * Luftdruck wird gespeichert und notwendige Werte für den Regler
281
                         * Luftdruck wird gespeichert und notwendige Werte für den Regler
207
                         * werden initialisiert. */
282
                         * werden initialisiert. */
208
                        case STATE_ACTIVATING:
283
                        case STATE_ACTIVATING:
209
 
284
 
210
                                // Höhenregler starten
285
                                // Höhenregler starten
211
                                altcon_start();
286
                                altcon_start();
212
                               
287
                               
213
                                state = STATE_ACTIVE;
288
                                state = STATE_ACTIVE;
214
                               
289
                               
215
                                break;
290
                                break;
216
 
291
 
217
                        /* Die automatische Höhenregelung ist aktiv. */                
292
                        /* Die automatische Höhenregelung ist aktiv. */                
218
                        case STATE_ACTIVE:
293
                        case STATE_ACTIVE:
219
 
294
 
220
                                // Stick ist außerhalb der Neutralstellung
295
                                // Stick ist außerhalb der Neutralstellung
221
                                if( abs( stickValue ) > PARAM_PITCH_STICK_THRESHOLD ) {
296
                                if( abs( stickValue ) > PARAM_PITCH_STICK_THRESHOLD ) {
222
                                        pitchOffset -= altcon_avgerror() / 4;
297
                                        pitchOffset -= altcon_avgerror() / 4;
223
                                        pitchCount   = stickValue + pitchOffset;
298
                                        pitchCount   = stickValue + pitchOffset;
224
                                       
299
                                       
225
                                        // Höhenregler abschalten
300
                                        // Höhenregler abschalten
226
                                        altcon_stop();
301
                                        altcon_stop();
227
                                       
302
                                       
228
                                        state        = STATE_INACTIVE;
303
                                        state        = STATE_INACTIVE;
229
                                }
304
                                }
230
                                break;
305
                                break;
231
                }
306
                }
232
 
307
 
233
        // Motoren sind aus
308
        // Motoren sind aus
234
        } else {
309
        } else {
235
       
310
       
236
                /* Nach dem Einschalten der Motoren darf pitchOffset keinen hohen Wert haben,
311
                /* Nach dem Einschalten der Motoren darf pitchOffset keinen hohen Wert haben,
237
                 * da der Kopter sonst sofort hochschießen würde.
312
                 * da der Kopter sonst sofort hochschießen würde.
238
                 */
313
                 */
239
                pitchCount  = 0;
314
                pitchCount  = 0;
240
                pitchOffset = 0;
315
                pitchOffset = 0;
241
                stickValue  = 0;
316
                stickValue  = 0;
242
                state       = STATE_BEGIN;
317
                state       = STATE_INITIALIZE;
243
        }
318
        }
244
 
319
 
245
        if( pitchOffset < 0 )
320
        if( pitchOffset < 0 )
246
                pitchOffset = 0;
321
                pitchOffset = 0;
247
               
322
               
248
        // Pitch-Wert darf nicht < 0 sein
323
        // Pitch-Wert darf nicht < 0 sein
249
        if( pitchCount < 0 ) {
324
        if( pitchCount < 0 ) {
250
                pitchCount = 0;
325
                pitchCount = 0;
251
        }
326
        }
252
 
327
 
253
        // pitchCount als Debug-Wert rausschreiben
328
        // pitchCount als Debug-Wert rausschreiben
254
        DebugOut.Analog[26] = stickValue;
329
        DebugOut.Analog[26] = stickValue;
255
        DebugOut.Analog[28] = pitchCount;
330
        DebugOut.Analog[28] = pitchCount;
256
        DebugOut.Analog[29] = pitchOffset;
331
        DebugOut.Analog[29] = pitchOffset;
257
 
332
 
258
        return pitchCount;
333
        return pitchCount;
259
}
334
}
260
 
335