Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 1139 → Rev 1141

/branches/thjac/V1_11/pitch_md.c
23,18 → 23,18
#define STATE_ACTIVE 0x08 // Höhenregelung ist aktiv
 
 
static int stickValue = 0; // Aktueller Stick-Wert
static int lastStickValue = 0; // Vorheriger Stick-Wert
static int actualPitchCount = 0; // Soll-Pitch-Wert
static int targetPitchCount = 0; // Ist-Pitch-Wert
static int pitchOffset; // Aktueller Grundgaswert in Neutralstellung
static char state; // Zustand
static int stickValue = 0; // Aktueller Stick-Wert
static int lastStickValue = 0; // Vorheriger Stick-Wert
static int actualPitchCount = 0; // Soll-Pitch-Wert
static int targetPitchCount = 0; // Ist-Pitch-Wert
static int pitchOffset; // Aktueller Grundgaswert in Neutralstellung
static char state; // Zustand
static int timer;
static int delay = 0;
static int delayCounter = 0;
static int temp; // Temporäre Werte; wird mehrfach verwendet
static int temp; // Temporäre Werte; wird mehrfach verwendet
 
unsigned char pitchHover = 0; // Standgaswert
unsigned char pitchHover = 0; // Standgaswert
 
 
void pitch_md_init( void ) {
45,30 → 45,31
/*
* Berechnet den aktuellen Pitch-Wert für die Regelung
*
* Nachdem die Motoren eingeschaltet sind, wird der Pitch-Stick losgelassen und damit in Mittelstellung
* gebracht. Die Motoren laufen zu dieser Zeit im Leerlaufgas. Vor dem Abheben müssen die Motoren in
* das Standgas gebracht werden. Dies geschieht durch minimales Gasgeben. Durch weiteres Gasgeben und
* nehmen kann abgehoben und geflogen werden.
* Funktionsweise:
*
* Erreicht der Stick während des Fluges die Neutralstellung und verbleibt dort für ca. 1 Sekunde ohne
* bewegt zu werden, aktiviert sich die Höhenregelung und hält den MK auf der aktuellen Höhe.
* 1. Einmalig muß man das Standgas kalibrieren. Standgas ist ein neuer Parameter.
* Dies tut man durch Beätigen des Roll-Sticks in eine beliebige Richtung (Vollausschlag) und
* Starten der Motoren. Nun gibt man soviel Gas (in der oberen Hälfte des Stick-Bereichs) wie
* der MK gerade noch stabil auf dem Boden steht. Man hält diese Stick-Position solange, bis ein
* Piepen ertönt. Damit wurde der Gaswert als Standgasparameter übernommen und im EEProm dauerhaft gespeichert.
* Diese Kalibrierung muß mit vollem Akku und nach jeder Gewichtsänderung des MK einmal durchgeführt werden.
*
* Sobald der Stick die Neutralstellung verläßt, wird die automatische Höhenregelung deaktiviert
* und der vorige Pitch-Wert als Wert der Neutralstellung übernommen. Der Pitch läßt sich nun
* über den gesamten Stick-Bereich regeln.
* 2. Für den Flug startet man die Motoren und läßt den Stick los. Die Motoren laufen im Leerlaufgas.
*
* Erreicht der Stick ein weiteres Mal die Neutralstellung, wird die automatische Höhenregelung
* wieder aktiviert, jetzt jedoch immer mit einer zeitlichen Verzögerung. Nur so ist ein
* ungestörtes manuelles Steuern möglich.
* 3. Nun schaltet man auf Standgas durch kurzes Antippen des Sticks nach oben. Die Motoren beschleunigen langsam
* bis zum Erreichen des zuvor kalibriertes Standgaswertes.
*
* Der Pitch-Wert ist innerhalb der Regelung durch ein konfigurierbares Minimalgas nach unten begrenzt.
* Dieses Minimalgas kann auf einen sehr niedrigen Wert eingestellt sein. Um im Flug nicht unterhalb
* eines Wertes zu gelangen, der die Lageregelung außer Funktion setzt, wird ein zweiter Wert für
* Minimalgas konfiguriert, der greift, sobald erstmalig die automatische Höhenregelung aktiviert wurde.
* 4. Nun hebt man wie gewohnt ab. Hierzu hat man den oberen Stick-Bereich zur Verfügung. Da der Grundgaswert
* bei Mittelstellung jetzt knapp unterhalb des Schwebegaswertes liegt, kann man im Flug einfach die Höhe halten,
* indem man den Stick in Mittelstellung bewegt. Nach kurzer Zeit (quittiert mit einem Piep) wird die automatische
* Höhenregelung aktiviert und solange gehalten, bis man den Stick wieder bewegt.
*
* 5. Nach der Landung drückt man den Stick ganz nach unten, bis ein Piepen ertönt. Jetzt laufen die Motoren
* wieder im Leerlaufgas. Man kann nun neu Starten (ab Punkt 3) oder die Motoren ausschalten.
*/
int pitch_md_value( void ) {
 
int register rawStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - pitch_stickoffset();
int register rawStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - pitch_initialStickValue();
// Sind die Motoren eingeschaltet?
if( MotorenEin ) {
136,12 → 137,7
// Konfiguration dauerhaft speichern
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ], pitchHover );
/*
WriteParameterSet(
GetActiveParamSetNumber(),
(unsigned char *) &EE_Parameter.Kanalbelegung[0],
STRUCT_PARAM_LAENGE );
*/
 
// Signalisieren
beeptime = 500;
}
213,6 → 209,9
// Stick ist innerhalb der Neutralstellung
if( abs( stickValue ) < PARAM_PITCH_STICK_THRESHOLD ) {
// Ab jetzt gilt eine höhere Pitch-Beschleunigung
delay = PARAM_PITCH_MD_DELAY2;
// Aktuelle Höhe festhalten (aktiviert noch nicht den Regler)
altcon_lock();
 
282,20 → 281,18
state = STATE_INITIALIZE;
}
 
if( !delayCounter ) {
/* Durch die Sollwertvorgabe kann hier eine einstellbare Trägheit auf dem Pitch-Wert
* abgebildet werden. */
int pitchDelta = targetPitchCount - actualPitchCount;
/* Durch die Sollwertvorgabe kann hier eine einstellbare Trägheit auf dem Pitch-Wert
* abgebildet werden. */
int pitchDelta = targetPitchCount - actualPitchCount;
 
if( pitchDelta > 3 )
pitchDelta = 3;
if( pitchDelta < -3 )
pitchDelta = -3;
if( pitchDelta > 3 )
pitchDelta = 3;
if( pitchDelta < -3 )
pitchDelta = -3;
 
if( !delayCounter ) {
actualPitchCount += pitchDelta;
delayCounter = delay + 1;
delayCounter = delay + 1;
}
delayCounter--;