/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,11 → 110,11 |
#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; |
AdWertAccHoch += abs(AdWertAccRoll) / 4 + abs(AdWertAccNick) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(acc_neutral.Z < 800) acc_neutral.Z+= 0.02; |
127,8 → 126,8 |
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; |
20,5 → 20,7 |
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 |
---|
195,7 → 195,7 |
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; |
} |
} |
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)); |
} |
227,18 → 226,24 |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
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; |
333,15 → 338,15 |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
uint8_t tmp_sreg = SREG; |
cli(); |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
// ADC einschalten |
ANALOG_ON; |
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--; |
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 |
---|
201,10 → 201,7 |
if(UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
//PORTD |= 0x08; |
MotorRegler(); |
//PORTD &= ~0x08; |
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; |