Subversion Repositories FlightCtrl

Rev

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

Rev 1139 Rev 1141
Line 21... Line 21...
21
#define STATE_WAIT                      0x06                    // Warten auf Einschalten der Höhenregelung
21
#define STATE_WAIT                      0x06                    // Warten auf Einschalten der Höhenregelung
22
#define STATE_ACTIVATING                0x07                    // Aktivierung der Höhenregelung
22
#define STATE_ACTIVATING                0x07                    // Aktivierung der Höhenregelung
23
#define STATE_ACTIVE                    0x08                    // Höhenregelung ist aktiv
23
#define STATE_ACTIVE                    0x08                    // Höhenregelung ist aktiv
Line 24... Line 24...
24
 
24
 
25
 
25
 
26
static int              stickValue              = 0;            // Aktueller Stick-Wert
26
static int      stickValue              = 0;                    // Aktueller Stick-Wert
27
static int              lastStickValue          = 0;            // Vorheriger Stick-Wert
27
static int      lastStickValue          = 0;                    // Vorheriger Stick-Wert
28
static int              actualPitchCount = 0;                   // Soll-Pitch-Wert
28
static int      actualPitchCount = 0;                           // Soll-Pitch-Wert
29
static int              targetPitchCount = 0;                   // Ist-Pitch-Wert
29
static int      targetPitchCount = 0;                           // Ist-Pitch-Wert
30
static int              pitchOffset;                            // Aktueller Grundgaswert in Neutralstellung
30
static int      pitchOffset;                                    // Aktueller Grundgaswert in Neutralstellung
31
static char             state;                                  // Zustand
31
static char     state;                                          // Zustand
32
static int      timer;
32
static int      timer;
33
static int      delay                   = 0;
33
static int      delay                   = 0;
Line 34... Line 34...
34
static int      delayCounter            = 0;
34
static int      delayCounter            = 0;
Line 35... Line 35...
35
static int              temp;                                   // Temporäre Werte; wird mehrfach verwendet
35
static int      temp;                                           // Temporäre Werte; wird mehrfach verwendet
36
 
36
 
37
unsigned char           pitchHover = 0;                         // Standgaswert
37
unsigned char   pitchHover = 0;                                 // Standgaswert
Line 38... Line 38...
38
 
38
 
39
 
39
 
40
void pitch_md_init( void ) {
40
void pitch_md_init( void ) {
41
        pitchHover = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ] );
-
 
42
}
-
 
43
 
-
 
44
 
41
        pitchHover = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ] );
45
/*
42
}
-
 
43
 
-
 
44
 
46
 * Berechnet den aktuellen Pitch-Wert für die Regelung
45
/*
47
 *
46
 * Berechnet den aktuellen Pitch-Wert für die Regelung
-
 
47
 *
-
 
48
 * Funktionsweise:
48
 * Nachdem die Motoren eingeschaltet sind, wird der Pitch-Stick losgelassen und damit in Mittelstellung
49
 *
49
 * gebracht. Die Motoren laufen zu dieser Zeit im Leerlaufgas. Vor dem Abheben müssen die Motoren in
50
 * 1. Einmalig muß man das Standgas kalibrieren. Standgas ist ein neuer Parameter.
50
 * das Standgas gebracht werden. Dies geschieht durch minimales Gasgeben. Durch weiteres Gasgeben und
-
 
51
 * nehmen kann abgehoben und geflogen werden.
-
 
52
 *
51
 *    Dies tut man durch Beätigen des Roll-Sticks in eine beliebige Richtung (Vollausschlag) und
53
 * Erreicht der Stick während des Fluges die Neutralstellung und verbleibt dort für ca. 1 Sekunde ohne
52
 *    Starten der Motoren. Nun gibt man soviel Gas (in der oberen Hälfte des Stick-Bereichs) wie
54
 * bewegt zu werden, aktiviert sich die Höhenregelung und hält den MK auf der aktuellen Höhe.
53
 *    der MK gerade noch stabil auf dem Boden steht. Man hält diese Stick-Position solange, bis ein
55
 *
-
 
56
 * Sobald der Stick die Neutralstellung verläßt, wird die automatische Höhenregelung deaktiviert
54
 *    Piepen ertönt. Damit wurde der Gaswert als Standgasparameter übernommen und im EEProm dauerhaft gespeichert.
57
 * und der vorige Pitch-Wert als Wert der Neutralstellung übernommen. Der Pitch läßt sich nun
55
 *    Diese Kalibrierung muß mit vollem Akku und nach jeder Gewichtsänderung des MK einmal durchgeführt werden.
58
 * über den gesamten Stick-Bereich regeln.
56
 *
-
 
57
 * 2. Für den Flug startet man die Motoren und läßt den Stick los. Die Motoren laufen im Leerlaufgas.
59
 *
58
 *
-
 
59
 * 3. Nun schaltet man auf Standgas durch kurzes Antippen des Sticks nach oben. Die Motoren beschleunigen langsam
60
 * Erreicht der Stick ein weiteres Mal die Neutralstellung, wird die automatische Höhenregelung
60
 *    bis zum Erreichen des zuvor kalibriertes Standgaswertes.
-
 
61
 *
61
 * wieder aktiviert, jetzt jedoch immer mit einer zeitlichen Verzögerung. Nur so ist ein
62
 * 4. Nun hebt man wie gewohnt ab. Hierzu hat man den oberen Stick-Bereich zur Verfügung. Da der Grundgaswert
62
 * ungestörtes manuelles Steuern möglich.
63
 *    bei Mittelstellung jetzt knapp unterhalb des Schwebegaswertes liegt, kann man im Flug einfach die Höhe halten,
Line 63... Line 64...
63
 *
64
 *    indem man den Stick in Mittelstellung bewegt. Nach kurzer Zeit (quittiert mit einem Piep) wird die automatische
Line 64... Line 65...
64
 * Der Pitch-Wert ist innerhalb der Regelung durch ein konfigurierbares Minimalgas nach unten begrenzt.
65
 *    Höhenregelung aktiviert und solange gehalten, bis man den Stick wieder bewegt.
65
 * Dieses Minimalgas kann auf einen sehr niedrigen Wert eingestellt sein. Um im Flug nicht unterhalb
66
 *
Line 66... Line 67...
66
 * eines Wertes zu gelangen, der die Lageregelung außer Funktion setzt, wird ein zweiter Wert für
67
 * 5. Nach der Landung drückt man den Stick ganz nach unten, bis ein Piepen ertönt. Jetzt laufen die Motoren
Line 134... Line 135...
134
                                                // Aktuellen Pitch-Wert in Konfiguration übernehmen
135
                                                // Aktuellen Pitch-Wert in Konfiguration übernehmen
135
                                                pitchHover = actualPitchCount;
136
                                                pitchHover = actualPitchCount;
Line 136... Line 137...
136
                                               
137
                                               
137
                                                // Konfiguration dauerhaft speichern
138
                                                // Konfiguration dauerhaft speichern
138
                                                eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ], pitchHover );
-
 
139
/*                                             
-
 
140
                                                WriteParameterSet(
-
 
141
                                                        GetActiveParamSetNumber(),
-
 
142
                                                        (unsigned char *) &EE_Parameter.Kanalbelegung[0],
-
 
143
                                                        STRUCT_PARAM_LAENGE );
139
                                                eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ], pitchHover );
144
*/
140
 
145
                                                // Signalisieren
141
                                                // Signalisieren
146
                                                beeptime = 500;
142
                                                beeptime = 500;
147
                                        }
143
                                        }
148
                                }
144
                                }
Line 211... Line 207...
211
                                }
207
                                }
Line 212... Line 208...
212
                               
208
                               
213
                                // Stick ist innerhalb der Neutralstellung
209
                                // Stick ist innerhalb der Neutralstellung
Line -... Line 210...
-
 
210
                                if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD ) {
-
 
211
                               
-
 
212
                                        // Ab jetzt gilt eine höhere Pitch-Beschleunigung
214
                                if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD ) {
213
                                        delay = PARAM_PITCH_MD_DELAY2;
215
                               
214
                               
Line 216... Line 215...
216
                                        // Aktuelle Höhe festhalten (aktiviert noch nicht den Regler)
215
                                        // Aktuelle Höhe festhalten (aktiviert noch nicht den Regler)
217
                                        altcon_lock();
216
                                        altcon_lock();
Line 280... Line 279...
280
                pitchOffset      = 0;
279
                pitchOffset      = 0;
281
                stickValue       = 0;
280
                stickValue       = 0;
282
                state            = STATE_INITIALIZE;
281
                state            = STATE_INITIALIZE;
283
        }
282
        }
Line 284... Line -...
284
 
-
 
285
        if( !delayCounter ) {
-
 
286
       
283
 
287
                /* Durch die Sollwertvorgabe kann hier eine einstellbare Trägheit auf dem Pitch-Wert
284
        /* Durch die Sollwertvorgabe kann hier eine einstellbare Trägheit auf dem Pitch-Wert
288
                 * abgebildet werden. */
285
         * abgebildet werden. */
289
                int pitchDelta = targetPitchCount - actualPitchCount;
286
        int pitchDelta = targetPitchCount - actualPitchCount;
290
 
287
 
291
                if( pitchDelta > 3 )
288
        if( pitchDelta > 3 )
292
                        pitchDelta = 3;
289
                pitchDelta = 3;
293
                if( pitchDelta < -3 )
290
        if( pitchDelta < -3 )
Line -... Line 291...
-
 
291
                pitchDelta = -3;
294
                        pitchDelta = -3;
292
 
295
 
-
 
296
                actualPitchCount += pitchDelta;
293
        if( !delayCounter ) {
297
               
294
                actualPitchCount += pitchDelta;
Line 298... Line 295...
298
                delayCounter = delay + 1;
295
                delayCounter      = delay + 1;
Line 299... Line 296...
299
        }
296
        }