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 |