Subversion Repositories FlightCtrl

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
440 Nick666 1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
// + Copyright (c) 04.2007 Holger Buss
3
// + only for non-profit use
4
// + www.MikroKopter.com
5
// + see the File "License.txt" for further Informations
6
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7
 
8
#include "main.h"
9
 
10
volatile int  Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100;
11
volatile int  AccumulateNick = 0, AccumulateRoll = 0, AccumulateGier = 0;
12
volatile int  accumulate_AccRoll = 0,accumulate_AccNick = 0,accumulate_AccHoch = 0;
13
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0;
14
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0;
15
volatile long Luftdruck = 32000;
16
volatile int  StartLuftdruck;
17
volatile unsigned int  MessLuftdruck = 1023;
18
unsigned char DruckOffsetSetting;
19
volatile int HoeheD = 0;
20
volatile char messanzahl_Druck;
21
volatile int  tmpLuftdruck;
22
volatile unsigned int ZaehlMessungen = 0;
23
 
24
//#######################################################################################
25
//
26
void ADC_Init(void)
27
//#######################################################################################
28
{
29
    ADMUX = 0;//Referenz ist extern
30
    ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);
31
    //Free Running Mode, Division Factor 128, Interrupt on
32
}
33
 
34
void SucheLuftruckOffset(void)
35
{
36
 unsigned int off;
453 Nick666 37
 off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]);
38
 if(off > 20) off -= 10;
39
 OCR0A = off;
40
 Delay_ms_Mess(100);
41
 if(MessLuftdruck < 850) off = 0;
42
 for(; off < 250;off++)
440 Nick666 43
  {
44
  OCR0A = off;
453 Nick666 45
  Delay_ms_Mess(50);
440 Nick666 46
  printf(".");  
47
  if(MessLuftdruck < 900) break;
48
  }
453 Nick666 49
 eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off);
50
 DruckOffsetSetting = off;
51
 Delay_ms_Mess(300);
440 Nick666 52
}
53
 
54
 
453 Nick666 55
 
440 Nick666 56
//#######################################################################################
57
//
58
SIGNAL(SIG_ADC)
59
//#######################################################################################
60
{
61
    static unsigned char kanal=0,state = 0;
62
    signed int wert;   
63
    ANALOG_OFF;
64
    switch(state++)
65
        {
66
        case 0:
67
            wert = (signed int) AdNeutralGier - ADC;
68
            AccumulateGier += wert;     //
69
            MessanzahlGier++;
70
            Mess_Integral_Gier += wert;// / 16;
71
            Mess_Integral_Gier2 += wert;
72
            kanal = 1;
73
            ZaehlMessungen++;
74
            break;
75
        case 1:
76
            wert = (signed int) ADC - AdNeutralRoll;
77
            Mess_IntegralRoll += wert;
78
            Mess_IntegralRoll2 += wert;
79
            if(ADC < 10)   wert = -700;
80
            if(ADC > 1000) wert = +700;
81
            AccumulateRoll += wert;
82
            MessanzahlRoll++;
83
            kanal = 2;
84
            break;
85
        case 2:
86
            wert = (signed int) ADC - AdNeutralNick;
87
            Mess_IntegralNick += wert;
88
            Mess_IntegralNick2 += wert;
89
            if(ADC < 10)   wert = -700;
90
            if(ADC > 1000) wert = +700;
91
            AccumulateNick += wert;
92
            MessanzahlNick++;
93
            kanal = 4;
94
            break;
95
        case 3:
96
            UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19)  / 2;
97
            kanal = 6;
98
            break;
99
        case 4:
100
            Aktuell_ay = acc_neutral.Y - ADC;
101
            accumulate_AccRoll += Aktuell_ay;
102
            messanzahl_AccRoll++;
103
            kanal = 7;
104
            break;
105
        case 5:
106
            Aktuell_ax = ADC - acc_neutral.X;
107
            accumulate_AccNick +=  Aktuell_ax;
108
            messanzahl_AccNick++;
109
                    kanal = 5;
110
                    state = 6;
111
            break;
112
        case 6:
113
            accumulate_AccHoch =  (signed int) ADC - acc_neutral.Z;
114
            accumulate_AccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4;
115
            if(accumulate_AccHoch > 1)
116
             {
117
              if(acc_neutral.Z < 800) acc_neutral.Z+= 0.02;
118
             }  
119
             else if(accumulate_AccHoch < -1)
120
             {
121
              if(acc_neutral.Z > 600) acc_neutral.Z-= 0.02;
122
             }
123
            messanzahl_AccHoch = 1;
124
            Aktuell_az = ADC;
125
            Mess_Integral_Hoch += accumulate_AccHoch;      // Integrieren
126
            Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen
127
//            Mess_Integral_Hoch -= Mess_Integral_Hoch / 512; // dämfen
128
 /*           if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)
129
             {
130
                      kanal = 3;
131
                      state = 7;
132
             }
133
            else  
134
             {
135
                      kanal = 0;
136
                      state = 0;
137
             }*/
138
                      kanal = 3;
139
                      state = 7;
140
            break;
141
        case 7:
142
            tmpLuftdruck += ADC;
143
            if(++messanzahl_Druck >= 5)
144
                {
145
                MessLuftdruck = ADC;
146
                messanzahl_Druck = 0;
147
                                HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert);  // D-Anteil = neuerWert - AlterWert
148
                Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4;
149
                HoehenWert = StartLuftdruck - Luftdruck;
150
                tmpLuftdruck = 0;
151
                }
152
            kanal = 0;
153
            state = 0;
154
            break;
155
        default:
156
            kanal = 0;
157
            state = 0;
158
            break;
159
        }
160
    ADMUX = kanal;
161
    ANALOG_ON;
162
}