Subversion Repositories FlightCtrl

Rev

Rev 800 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 800 Rev 801
Line 16... Line 16...
16
#include "main.h"
16
#include "main.h"
Line 17... Line 17...
17
 
17
 
18
volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame
18
volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame
19
volatile int16_t PPM_diff[15];
19
volatile int16_t PPM_diff[15];
20
volatile uint8_t NewPpmData = 1;
20
volatile uint8_t NewPpmData = 1;
Line 21... Line 21...
21
volatile uint8_t RC_Quality = 0;
21
volatile int16_t RC_Quality = 0;
22
 
22
 
23
 
23
 
Line 102... Line 102...
102
{
102
{
103
        static uint16_t oldICR1 = 0;
103
        static uint16_t oldICR1 = 0;
104
    int16_t signal = 0, tmp;
104
    int16_t signal = 0, tmp;
105
        static int16_t index;
105
        static int16_t index;
106
        static int16_t Sum_RC_Quality = 0;
106
        static int16_t Sum_RC_Quality = 0;
-
 
107
        int16_t Noise;
Line 107... Line 108...
107
 
108
 
108
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
109
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
Line 109... Line 110...
109
        // at the time the edge was detected
110
        // at the time the edge was detected
Line 133... Line 134...
133
            if((signal > 250) && (signal < 687))
134
            if((signal > 250) && (signal < 687))
134
            {
135
            {
135
                                // shift signal to zero symmetric range  -154 to 159
136
                                // shift signal to zero symmetric range  -154 to 159
136
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
137
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
137
                // check for stable signal
138
                // check for stable signal
-
 
139
                Noise = abs(signal - PPM_in[index]);
-
 
140
                                if((Noise/16) > (200-RC_Quality)) // spike detector
-
 
141
                                {
138
                                Sum_RC_Quality -= Sum_RC_Quality/128;
142
                                        Sum_RC_Quality -= 3*RC_Quality;
139
                                Sum_RC_Quality += 200 - abs(signal - PPM_in[index]); // max 200*128 = 25600
143
                                        Sum_RC_Quality += 3*(200 - Noise);
-
 
144
                                }
-
 
145
                                else
-
 
146
                                {
-
 
147
                                        Sum_RC_Quality -= RC_Quality;
-
 
148
                                        Sum_RC_Quality += 200 - Noise;
-
 
149
                                }
140
                                // calculate exponential history for signal
150
                                // calculate exponential history for signal
141
                tmp = (3 * (PPM_in[index]) + signal) / 4;
151
                tmp = (3 * (PPM_in[index]) + signal) / 4;
142
                if(tmp > signal+1) tmp--; else
152
                if(tmp > signal+1) tmp--; else
143
                if(tmp < signal-1) tmp++;
153
                if(tmp < signal-1) tmp++;
144
                // calculate signal difference on good signal level
154
                // calculate signal difference on good signal level
Line 149... Line 159...
149
            else
159
            else
150
            {   // invalid PPM time
160
            {   // invalid PPM time
151
                                Sum_RC_Quality -= Sum_RC_Quality/4;
161
                                Sum_RC_Quality -= Sum_RC_Quality/4;
152
                        }
162
                        }
153
                        if(Sum_RC_Quality < 0) Sum_RC_Quality = 0;
163
                        if(Sum_RC_Quality < 0) Sum_RC_Quality = 0;
154
                        RC_Quality = (uint8_t)(Sum_RC_Quality/128);
164
                        RC_Quality = Sum_RC_Quality/128;
155
            index++; // next channel
165
            index++; // next channel
156
            // demux sum signal for channels 5 to 7 to J3, J4, J5
166
            // demux sum signal for channels 5 to 7 to J3, J4, J5
157
                if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5);
167
                if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5);
158
                if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4);
168
                if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4);
159
                if(BoardRelease == 10)
169
                if(BoardRelease == 10)