Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 2366 → Rev 2367

/trunk/analog.c
68,8 → 68,14
volatile unsigned int ZaehlMessungen = 0;
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115;
volatile unsigned char AdReady = 1;
unsigned int BaroStep = 500;
long ExpandBaroStep = 0;
volatile long HoehenWertF = 0;
 
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
unsigned char CalAthmospheare = 16;
#endif
 
//#######################################################################################
void ADC_Init(void)
//#######################################################################################
78,58 → 84,49
ANALOG_ON;
}
 
#define DESIRED_H_ADC 800
#define DESIRED_H_ADC 850
 
void CalcExpandBaroStep(void)
{
if(ACC_AltitudeControl) ExpandBaroStep = BaroStep * (long)ExpandBaro;
else ExpandBaroStep = (16 * BaroStep) * (long)ExpandBaro - 4;
}
 
void SucheLuftruckOffset(void)
{
unsigned int off;
ExpandBaro = 0;
 
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
{
unsigned char off2;
OCR0A = 150;
off2 = GetParamByte(PID_PRESSURE_OFFSET);
if(off2 < 230) off2 += 10;
OCR0B = off2;
Delay_ms_Mess(100);
if(MessLuftdruck > DESIRED_H_ADC) off2 = 240;
for(; off2 >= 5; off2 -= 5)
{
OCR0B = off2;
Delay_ms_Mess(50);
printf("*");
if(MessLuftdruck > DESIRED_H_ADC) break;
}
SetParamByte(PID_PRESSURE_OFFSET, off2);
if(off2 >= 15) off = 140; else off = 0;
for(; off < 250;off++)
{
OCR0A = off;
Delay_ms_Mess(50);
printf(".");
if(MessLuftdruck < DESIRED_H_ADC) break;
}
DruckOffsetSetting = off;
}
#else
CalcExpandBaroStep();
off = GetParamByte(PID_PRESSURE_OFFSET);
if(off > 20) off -= 10;
OCR0A = off;
Delay_ms_Mess(100);
OCR0B = 255-off;
Delay_ms_Mess(150);
if(MessLuftdruck < DESIRED_H_ADC) off = 0;
for(; off < 250;off++)
{
OCR0A = off;
Delay_ms_Mess(50);
OCR0B = 255-off;
Delay_ms_Mess(100);
printf(".");
if(MessLuftdruck < DESIRED_H_ADC) break;
}
DruckOffsetSetting = off;
SetParamByte(PID_PRESSURE_OFFSET, off);
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && (DruckOffsetSetting < 5 || DruckOffsetSetting >= 245)) VersionInfo.HardwareError[0] |= FC_ERROR0_PRESSURE;
 
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + correction of the altitude error in higher altitudes
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CalAthmospheare = 16;
if(ACC_AltitudeControl)
{
if(PlatinenVersion < 23) { if(off < 140) CalAthmospheare += (160 - off) / 26; }
else { if(off < 170) CalAthmospheare += (188 - off) / 19; }
}
Luftdruck = MessLuftdruck * CalAthmospheare;
#endif
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && (DruckOffsetSetting < 10 || DruckOffsetSetting >= 245)) VersionInfo.HardwareError[0] |= FC_ERROR0_PRESSURE;
OCR0A = off;
Delay_ms_Mess(300);
}
 
347,8 → 344,10
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
if(ACC_AltitudeControl)
{
tmpLuftdruck = MessLuftdruck - 523 * (long)ExpandBaro; // -523 counts per offset step
Luftdruck -= Luftdruck/16;
// ExpandBaroStep = BaroStep * (long)ExpandBaro; // wird in fc.c aufgerufen
// tmpLuftdruck = MessLuftdruck - BaroStep * (long)ExpandBaro; // -523 counts per offset step
tmpLuftdruck = MessLuftdruck - ExpandBaroStep; // -523 counts per offset step
Luftdruck -= Luftdruck / CalAthmospheare; // 16
Luftdruck += tmpLuftdruck;
HoehenWert = StartLuftdruck - Luftdruck; // cm
}
359,7 → 358,9
if(++messanzahl_Druck >= 16) // war bis 0.86 "18"
{
signed int tmp;
Luftdruck = (7 * Luftdruck + tmpLuftdruck - (16 * 523) * (long)ExpandBaro + 4) / 8; // -523.19 counts per 10 counts offset step
// Luftdruck = (7 * Luftdruck + tmpLuftdruck - (16 * BaroStep) * (long)ExpandBaro + 4) / 8; // -523.19 counts per 10 counts offset step
// ExpandBaroStep = (16 * BaroStep) * (long)ExpandBaro - 4; // wird in fc.c aufgerufen
Luftdruck = (7 * Luftdruck + tmpLuftdruck - ExpandBaroStep) / 8; // -523.19 counts per 10 counts offset step
HoehenWert = StartLuftdruck - Luftdruck;
SummenHoehe -= SummenHoehe/SM_FILTER;
SummenHoehe += HoehenWert;
/trunk/analog.h
25,12 → 25,13
extern volatile char MessanzahlNick;
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier;
extern volatile unsigned char AdReady;
extern unsigned int BaroStep;
volatile long HoehenWertF;
 
unsigned int ReadADC(unsigned char adc_input);
void ADC_Init(void);
void SucheLuftruckOffset(void);
void SucheGyroOffset(void);
void CalcExpandBaroStep(void);
 
#define AD_GIER 0
#define AD_ROLL 1
/trunk/fc.c
183,6 → 183,12
signed int CosAttitude; // for projection of hoover gas
unsigned char ACC_AltitudeControl = 0;
 
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
#define OPA_OFFSET_STEP 5
#else
#define OPA_OFFSET_STEP 10
#endif
 
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Debugwerte zuordnen
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
193,7 → 199,7
DebugOut.Analog[2] = Mittelwert_AccNick / 4;
DebugOut.Analog[3] = Mittelwert_AccRoll / 4;
DebugOut.Analog[4] = (signed int) AdNeutralGier - AdWertGier;
DebugOut.Analog[5] = HoehenWert/10;
DebugOut.Analog[5] = HoehenWert/10;
DebugOut.Analog[6] = Aktuell_az;//AdWertAccHoch;//(Mess_Integral_Hoch / 512);
DebugOut.Analog[8] = KompassValue;
DebugOut.Analog[9] = UBat;
279,7 → 285,7
//############################################################################
{
unsigned char i, sucess = 1;
unsigned int gier_neutral = 0, nick_neutral = 0, roll_neutral = 0, acc_z_neutral = 0;
unsigned int gier_neutral = 0, nick_neutral = 0, roll_neutral = 0, acc_z_neutral = 0, barotest;
VersionInfo.HardwareError[0] = 0;
// HEF4017Reset_ON;
NeutralAccX = 0;
303,9 → 309,13
 
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert?
{
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
if((MessLuftdruck > 950) || (MessLuftdruck < 750) || ExpandBaro) SucheLuftruckOffset();
}
barotest = MessLuftdruck;
#define NEUTRAL_FILTER 32
OCR0A += OPA_OFFSET_STEP;
OCR0B = 255 - OCR0A;
for(i=0; i<NEUTRAL_FILTER; i++)
{
Delay_ms_Mess(10);
314,6 → 324,9
roll_neutral += AdWertRoll;
acc_z_neutral += Aktuell_az;
}
if(MessLuftdruck < 1010 && MessLuftdruck > 20) BaroStep = barotest - MessLuftdruck;
OCR0A -= OPA_OFFSET_STEP;
OCR0B = 255 - OCR0A;
AdNeutralNick = (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8);
AdNeutralRoll = (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8);
AdNeutralGier = (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER);
349,7 → 362,7
MesswertNick = 0;
MesswertRoll = 0;
MesswertGier = 0;
Delay_ms_Mess(100);
Delay_ms_Mess(200);
Mittelwert_AccNick = ACC_AMPLIFY * AdWertAccNick;
Mittelwert_AccRoll = ACC_AMPLIFY * AdWertAccRoll;
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick;
357,9 → 370,6
Mess_IntegralNick = IntegralNick;
Mess_IntegralRoll = IntegralRoll;
Mess_Integral_Gier = 0;
StartLuftdruck = Luftdruck;
VarioMeter = 0;
SummenHoehe = 0; Mess_Integral_Hoch = 0;
KompassSollWert = KompassValue;
KompassSignalSchlecht = 100;
beeptime = 50;
414,6 → 424,10
LIBFC_HoTT_Clear();
ACC_AltitudeFusion(2); // initalisation
#endif
StartLuftdruck = Luftdruck;
VarioMeter = 0;
SummenHoehe = 0; Mess_Integral_Hoch = 0;
CalcExpandBaroStep();
return(sucess);
}
 
992,13 → 1006,15
// Einschalten
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(CalibrationDone) FC_StatusFlags |= FC_STATUS_START;
 
StartLuftdruck = Luftdruck;
HoehenWertF = 0;
HoehenWert = 0;
SummenHoehe = 0;
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -100 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 100) && EE_Parameter.MotorSafetySwitch == 0) delay_einschalten = 0;
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -100 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 100) && EE_Parameter.MotorSafetySwitch == 0) delay_einschalten = 0;
if(++delay_einschalten > 253)
{
if((abs(MesswertGier) > 32 || abs(MesswertNick) > 20) || abs(MesswertRoll) > 20) CalibrationDone = 0; // dann ist der Gyro defekt, schlecht kalibriert oder der MK dreht sich
delay_einschalten = 0;
if(!VersionInfo.HardwareError[0] && CalibrationDone && !NC_ErrorCode)
{
1567,18 → 1583,11
#define HOVER_GAS_AVERAGE 16384L // 16384 * 2ms = 32s averaging
#define HC_GAS_AVERAGE 4 // 4 * 2ms= 8ms averaging
 
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
#define OPA_OFFSET_STEP 15
#else
#define OPA_OFFSET_STEP 10
#endif
int HCGas, GasReduction = 0;
static int HeightTrimming = 0; // rate for change of height setpoint
static int HeightDeviation = 0, FilterHCGas = 0;
static unsigned long HoverGasFilter = 0;
static unsigned char delay = 100, BaroAtUpperLimit = 0, BaroAtLowerLimit = 0;
 
 
// Expand the measurement
// measurement of air pressure close to upper limit and no overflow in correction of the new OCR0A value occurs
if(!BaroExpandActive)
1589,8 → 1598,10
{
ExpandBaro -= 1;
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // increase offset to shift ADC down
OCR0B = 255 - OCR0A;
beeptime = 300;
BaroExpandActive = 350;
CalcExpandBaroStep();
}
else
{
1605,8 → 1616,10
{
ExpandBaro += 1;
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // decrease offset to shift ADC up
OCR0B = 255 - OCR0A;
beeptime = 300;
BaroExpandActive = 350;
CalcExpandBaroStep();
}
else
{
/trunk/fc.h
146,5 → 146,6
extern unsigned char Parameter_ExtraConfig;
extern signed char MixerTable[MAX_MOTORS][4];
extern const signed char sintab[31];
 
#endif //_FC_H
 
/trunk/libfc1284.a
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/libfc644.a
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/main.c
132,7 → 132,7
}
else
{
PlatinenVersion = 23; ACC_AltitudeControl = 1;
PlatinenVersion = 25; ACC_AltitudeControl = 1;
}
#else
if(PINB & 0x01)
/trunk/main.h
11,8 → 11,8
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion >= 20)) PORTB &=~0x01; else PORTB |= 0x01;}
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion >= 20)) PORTB |= 0x01; else PORTB &=~0x01;}
#define ROT_FLASH PORTB ^= 0x01
#define GRN_OFF {if((PlatinenVersion < 12) || PlatinenVersion == 23) PORTB &=~0x02; else PORTB |= 0x02;}
#define GRN_ON {if((PlatinenVersion < 12) || PlatinenVersion == 23) PORTB |= 0x02; else PORTB &=~0x02;}
#define GRN_OFF {if((PlatinenVersion < 12) || PlatinenVersion == 25) PORTB &=~0x02; else PORTB |= 0x02;}
#define GRN_ON {if((PlatinenVersion < 12) || PlatinenVersion == 25) PORTB |= 0x02; else PORTB &=~0x02;}
#define GRN_FLASH PORTB ^= 0x02
 
#define SYSCLK F_CPU
/trunk/menu.c
127,7 → 127,7
LCD_printfxy(0,2,"Pressure:%5i",MessLuftdruck);
LCD_printfxy(0,3,"Offset: %5i",OCR0A);
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
if(ACC_AltitudeControl) LCD_printfxy(17,3,"(A)",OCR0A);
if(ACC_AltitudeControl) LCD_printfxy(17,2,"(A)");
#endif
}
else
208,6 → 208,7
for(i=0;i<4;i++) LCD_printfxy(0,i,"Poti%i: %3i",i+5,Poti[i+4]);
break;
case 12:
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
LCD_printfxy(0,0,"Servo " );
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl);
LCD_printfxy(0,2,"Position: %3i",ServoNickValue/4);
220,6 → 221,7
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config);
break;
*/
#endif
case 13:
LCD_printfxy(0,0,"BL-Ctrl Errors " );
for(i=0;i<3;i++)
/trunk/timer0.c
235,9 → 235,10
{
tim_main = SetDelay(10);
TCCR0B = CK8;
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM
OCR0A = 0;
OCR0B = 180;
// TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(1<<COM0B0)|3;//fast PWM
OCR0B = 255;
OCR0A = 180;
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload
//OCR1 = 0x00;
TIMSK0 |= _BV(TOIE0);
/trunk/version.txt
620,5 → 620,10
- some changes in ACC-Altitude hold to reduce climbing in fast foreward fly
- UserParameter1 > 100 disables camera nick control (for BL-Gimbals with self-alignments)
- Beep at motor off (1sek)
 
2.00c
- Do not start if MK is moving
- Full Range of altitude measure expansion (3000m flight instead of 950m)
- compensation of the atmospheric altitude error