Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 858 → Rev 887

/branches/MicroMag3_Nick666/trunc/analog.c
7,7 → 7,7
 
#include "main.h"
 
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100;
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_az, UBat = 100;
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0;
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0;
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0;
26,9 → 26,10
void ADC_Init(void)
//#######################################################################################
{
ADMUX = 0;//Referenz ist extern
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);
//Free Running Mode, Division Factor 128, Interrupt on
ADMUX = 0; // Referenz extern, Right Adjust, ADC0
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);
// Single Conversion, Division Factor 128, Interrupt on
// ~12 kSPS
}
 
void SucheLuftruckOffset(void)
57,37 → 58,35
SIGNAL(SIG_ADC)
//#######################################################################################
{
static unsigned char kanal=0,state = 0;
static unsigned char state = 0;
static unsigned int gier1, roll1, nick1;
ANALOG_OFF;
 
switch(state++)
{
case 0:
gier1 = ADC;
kanal = 1;
ADMUX = 1;
ZaehlMessungen++;
break;
case 1:
roll1 = ADC;
kanal = 2;
ADMUX = 2;
break;
case 2:
nick1 = ADC;
kanal = 4;
ADMUX = 4;
break;
case 3:
UBat = (3 * UBat + ADC / 3) / 4;
kanal = 6;
ADMUX = 6;
break;
case 4:
Aktuell_ay = acc_neutral.Y - ADC;
AdWertAccRoll = Aktuell_ay;
kanal = 7;
AdWertAccRoll = acc_neutral.Y - ADC;
ADMUX = 7;
break;
case 5:
Aktuell_ax = ADC - acc_neutral.X;
AdWertAccNick = Aktuell_ax;
kanal = 0;
AdWertAccNick = ADC - acc_neutral.X;
ADMUX = 0;
break;
case 6:
#if (PlatinenVersion == 10)
95,7 → 94,7
#else
AdWertGier = ADC + gier1;
#endif
kanal = 1;
ADMUX = 1;
break;
case 7:
#if (PlatinenVersion == 10)
103,7 → 102,7
#else
AdWertRoll = ADC + roll1;
#endif
kanal = 2;
ADMUX = 2;
break;
case 8:
#if (PlatinenVersion == 10)
111,24 → 110,24
#else
AdWertNick = ADC + nick1;
#endif
kanal = 5;
ADMUX = 5;
break;
case 9:
AdWertAccHoch = (signed int) ADC - acc_neutral.Z;
AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4;
case 9:
AdWertAccHoch = (signed int) ADC - acc_neutral.Z;
AdWertAccHoch += abs(AdWertAccRoll) / 4 + abs(AdWertAccNick) / 4;
if(AdWertAccHoch > 1)
{
if(acc_neutral.Z < 800) acc_neutral.Z+= 0.02;
if(acc_neutral.Z < 800) acc_neutral.Z += 0.02;
}
else if(AdWertAccHoch < -1)
{
if(acc_neutral.Z > 600) acc_neutral.Z-= 0.02;
if(acc_neutral.Z > 600) acc_neutral.Z -= 0.02;
}
messanzahl_AccHoch = 1;
Aktuell_az = ADC;
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen
kanal = 3;
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämpfen
ADMUX = 3;
break;
case 10:
tmpLuftdruck += ADC;
141,14 → 140,13
HoehenWert = StartLuftdruck - Luftdruck;
tmpLuftdruck = 0;
}
kanal = 0;
ADMUX = 0;
state = 0;
break;
default:
kanal = 0;
ADMUX = 0;
state = 0;
break;
}
ADMUX = kanal;
if(state != 0) ANALOG_ON;
}
if (state != 0) ANALOG_ON; // Nach einer kompletten Runde ADC nicht neu starten. Neustart wird in der fc.c initiiert.
}
/branches/MicroMag3_Nick666/trunc/analog.h
5,7 → 5,7
extern volatile int UBat;
extern volatile int AdWertNick, AdWertRoll, AdWertGier;
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch;
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az;
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_az;
extern volatile long Luftdruck;
extern volatile char messanzahl_Druck;
extern volatile unsigned int ZaehlMessungen;
16,9 → 16,11
extern volatile char MessanzahlNick;
 
unsigned int ReadADC(unsigned char adc_input);
void ADC_Init(void);
void ADC_Init(void);
void SucheLuftruckOffset(void);
 
 
#define ANALOG_OFF ADCSRA=0
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE)
//#define ANALOG_OFF ADCSRA=0
//#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE)
 
#define ANALOG_ON ADCSRA |= (1<<ADSC)
/branches/MicroMag3_Nick666/trunc/compass.c
131,9 → 131,9
{
uint8_t tmp_sreg = SREG;
cli();
x_axis = MM3.x_axis;
y_axis = MM3.y_axis;
z_axis = MM3.z_axis;
x_axis = MM3.x_axis;
y_axis = MM3.y_axis;
z_axis = MM3.z_axis;
SREG = tmp_sreg;
if (x_axis > x_max) x_max = x_axis;
190,12 → 190,12
// 16bit-Werte lesen
uint8_t tmp_sreg = SREG;
cli();
mm3_x_axis = MM3.x_axis;
mm3_y_axis = MM3.y_axis;
mm3_z_axis = MM3.z_axis;
mm3_x_axis = MM3.x_axis;
mm3_y_axis = MM3.y_axis;
mm3_z_axis = MM3.z_axis;
SREG = tmp_sreg;
int temp = Aktuell_az-550;
int temp = Aktuell_az - acc_neutral.compass;
// Lage-Berechnung mittels Acc-Messwerte
tilt = atan2_i(temp,AdWertAccNick*64);
sin_nick = sin_i(tilt);
/branches/MicroMag3_Nick666/trunc/fc.c
148,6 → 148,11
acc_neutral.X = 0;
acc_neutral.Y = 0;
acc_neutral.Z = 0;
 
Delay_ms(500);
beeptime = 100;
while (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -100) //Warten, bis Benutzer den Kopter neu ausgerichtet hat
CalibrierMittelwert();
Delay_ms_Mess(100);
CalibrierMittelwert();
155,21 → 160,15
acc_neutral.X = abs(Mittelwert_AccNick) / ACC_AMPLIFY;
acc_neutral.Y = abs(Mittelwert_AccRoll) / ACC_AMPLIFY;
acc_neutral.Z = Aktuell_az;
/*
while (PPM_in_gas > 100) //Warten, bis Benutzer den Kopter neu ausgerichtet hat
{
uint8_t delay=9;
Delay_ms(10);
if (!delay--)
{
delay = 9;
beeptime = 100;
}
}
beeptime = 100;
Delay_ms(500);
beeptime = 100;
while (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -100) //Warten, bis Benutzer den Kopter neu ausgerichtet hat
Delay_ms_Mess(100);
acc_neutral.C = Aktuell_az;
*/
acc_neutral.compass = Aktuell_az;
eeprom_write_block(&acc_neutral,&ee_acc_neutral,sizeof(struct acc_neutral_struct));
}
 
194,9 → 193,9
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();
}
 
AdNeutralNick= AdWertNick;
AdNeutralRoll= AdWertRoll;
AdNeutralGier= AdWertGier;
AdNeutralNick = AdWertNick;
AdNeutralRoll = AdWertRoll;
AdNeutralGier = AdWertGier;
StartNeutralRoll = AdNeutralRoll;
StartNeutralNick = AdNeutralNick;
 
226,19 → 225,25
void Mittelwert(void)
//############################################################################
{
static signed long tmpl,tmpl2;
MesswertGier = (signed int) AdNeutralGier - AdWertGier;
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll;
MesswertNick = (signed int) AdWertNick - AdNeutralNick;
 
static signed long tmpl,tmpl2;
uint8_t tmp_sreg = SREG;
cli();
MesswertGier = (int16_t)AdNeutralGier - AdWertGier;
MesswertRoll = (int16_t)AdWertRoll - AdNeutralRoll;
MesswertNick = (int16_t)AdWertNick - AdNeutralNick;
int16_t AdWertAccNick_temp = AdWertAccNick;
int16_t AdWertAccRoll_temp = AdWertAccRoll;
SREG = tmp_sreg;
//DebugOut.Analog[26] = MesswertNick;
//DebugOut.Analog[28] = MesswertRoll;
 
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L;
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick;
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll;
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick_temp))) / 2L;
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll_temp))) / 2L;
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick_temp;
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll_temp;
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++
Mess_Integral_Gier += MesswertGier;
Mess_Integral_Gier2 += MesswertGier;
332,16 → 337,16
// Messwerte beim Ermitteln der Nullage
void CalibrierMittelwert(void)
//############################################################################
{
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern
ANALOG_OFF;
MesswertNick = AdWertNick;
MesswertRoll = AdWertRoll;
MesswertGier = AdWertGier;
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick;
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll;
// ADC einschalten
ANALOG_ON;
{
uint8_t tmp_sreg = SREG;
cli();
MesswertNick = AdWertNick;
MesswertRoll = AdWertRoll;
MesswertGier = AdWertGier;
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick;
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll;
SREG = tmp_sreg;
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 128 && Poti1 < 255) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 128 && Poti1 > 0) Poti1--;
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 128 && Poti2 < 255) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 128 && Poti2 > 0) Poti2--;
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 128 && Poti3 < 255) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 128 && Poti3 > 0) Poti3--;
446,12 → 451,12
uint8_t tmp_sreg = SREG;
cli();
PPM_in_nick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
PPM_diff_nick = PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]];
PPM_in_roll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
PPM_diff_roll = PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]];
PPM_in_gier = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
PPM_in_gas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];
PPM_in_nick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
PPM_diff_nick = PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]];
PPM_in_roll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
PPM_diff_roll = PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]];
PPM_in_gier = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
PPM_in_gas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];
SREG = tmp_sreg;
 
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
604,7 → 609,7
MaxStickNick = abs(PPM_in_nick); else MaxStickNick--;
if(abs(PPM_in_roll) > MaxStickRoll)
MaxStickRoll = abs(PPM_in_roll); else MaxStickRoll--;
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;}
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;}
 
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0;
IntegralFaktor = ((float)Parameter_Gyro_I) / 44000;
912,7 → 917,7
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Gieren
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(abs(StickGier) > 20)
if(abs(StickGier) > 15)
{
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1;
}
928,9 → 933,9
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)
{
if (!updKompass--) // Aufruf mit ~15 Hz
if (!updKompass--) // Aufruf mit ~20 Hz
{
updKompass = 33;
updKompass = 25;
if ((MaxStickNick < 50) && (MaxStickRoll < 50)) // Bei extremen Flugmanövern keine Kompassauswertung
{
952,8 → 957,8
if(!TimerWerteausgabe--)
{
TimerWerteausgabe = 24;
//DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor;
//DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor;
DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor;
DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor;
DebugOut.Analog[2] = Mittelwert_AccNick;
DebugOut.Analog[3] = Mittelwert_AccRoll;
DebugOut.Analog[4] = MesswertGier;
/branches/MicroMag3_Nick666/trunc/fc.h
55,6 → 55,7
int X;
int Y;
float Z;
int compass;
};
 
extern struct acc_neutral_struct acc_neutral;
/branches/MicroMag3_Nick666/trunc/main.c
197,14 → 197,11
LcdClear();
I2CTimeout = 5000;
while (1)
{
{
if(UpdateMotor) // ReglerIntervall
{
UpdateMotor=0;
//PORTD |= 0x08;
MotorRegler();
 
//PORTD &= ~0x08;
MotorRegler();
SendMotorData();
ROT_OFF;
if(PcZugriff) PcZugriff--;
251,7 → 248,6
}
timer = SetDelay(100);
}
//if(UpdateMotor) DebugOut.Analog[26]++;
}
}
return (1);
/branches/MicroMag3_Nick666/trunc/timer0.h
13,3 → 13,4
extern volatile unsigned int beeptime;
extern uint8_t ServoValue;
extern unsigned int BeepMuster;