/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 |