Subversion Repositories FlightCtrl

Rev

Rev 1141 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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