Subversion Repositories FlightCtrl

Rev

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

Rev 766 Rev 800
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;
-
 
21
volatile uint8_t RC_Quality = 0;
Line 21... Line 22...
21
volatile uint8_t SenderOkay = 0;
22
 
22
 
23
 
23
/***************************************************************/
24
/***************************************************************/
24
/*  16bit timer 1 is used to decode the PPM-Signal            */
25
/*  16bit timer 1 is used to decode the PPM-Signal            */
Line 68... Line 69...
68
        // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0)
69
        // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0)
69
        // Disable Overflow Interrupt (bit: TOIE1=0)
70
        // Disable Overflow Interrupt (bit: TOIE1=0)
70
        TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1));
71
        TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1));
71
    TIMSK1 |= (1<<ICIE1);
72
    TIMSK1 |= (1<<ICIE1);
Line -... Line 73...
-
 
73
 
-
 
74
    RC_Quality = 0;
72
 
75
 
73
    SREG = sreg;
76
    SREG = sreg;
Line 74... Line 77...
74
}
77
}
Line 98... Line 101...
98
ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms
101
ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms
99
{
102
{
100
        static uint16_t oldICR1 = 0;
103
        static uint16_t oldICR1 = 0;
101
    int16_t signal = 0, tmp;
104
    int16_t signal = 0, tmp;
102
        static int16_t index;
105
        static int16_t index;
-
 
106
        static int16_t Sum_RC_Quality = 0;
Line 103... Line 107...
103
 
107
 
104
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
108
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
Line 105... Line 109...
105
        // at the time the edge was detected
109
        // at the time the edge was detected
-
 
110
 
-
 
111
        // calculate the time delay to the previous event time which is stored in oldICR1
106
 
112
        // calculatiing the difference of the two uint16_t and converting the result to an int16_t
107
        // calculate the time delay to the previous event time which is stored in oldICR1
113
        // implicit handles a timer overflow 65535 -> 0 the right way.
Line 108... Line 114...
108
        signal = (uint16_t) ICR1 - oldICR1;
114
        signal = (uint16_t) ICR1 - oldICR1;
Line 127... Line 133...
127
            if((signal > 250) && (signal < 687))
133
            if((signal > 250) && (signal < 687))
128
            {
134
            {
129
                                // shift signal to zero symmetric range  -154 to 159
135
                                // shift signal to zero symmetric range  -154 to 159
130
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
136
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
131
                // check for stable signal
137
                // check for stable signal
132
                // the deviation of the current signal level from the average must be less than 6 (aprox. 1%)
-
 
133
                if(abs(signal - PPM_in[index]) < 6)
-
 
134
                {
-
 
135
                                        // a good signal condition increases SenderOkay by 10
-
 
136
                                        // SignalOkay is decremented every 2 ms in main.c
138
                                Sum_RC_Quality -= Sum_RC_Quality/128;
137
                                        // this variable is a level for the average rate of a noiseless rc signal
139
                                Sum_RC_Quality += 200 - abs(signal - PPM_in[index]); // max 200*128 = 25600
138
                                        if(SenderOkay < 200) SenderOkay += 10;
-
 
139
                                }
-
 
140
                                // calculate exponential history for signal
140
                                // calculate exponential history for signal
141
                tmp = (3 * (PPM_in[index]) + signal) / 4;
141
                tmp = (3 * (PPM_in[index]) + signal) / 4;
142
                if(tmp > signal+1) tmp--; else
142
                if(tmp > signal+1) tmp--; else
143
                if(tmp < signal-1) tmp++;
143
                if(tmp < signal-1) tmp++;
144
                // calculate signal difference on good signal level
144
                // calculate signal difference on good signal level
145
                if(SenderOkay >= 195)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction
145
                if(RC_Quality >= 170)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction
146
                else PPM_diff[index] = 0;
146
                else PPM_diff[index] = 0;
147
                PPM_in[index] = tmp; // update channel value
147
                PPM_in[index] = tmp; // update channel value
148
            }
148
            }
-
 
149
            else
-
 
150
            {   // invalid PPM time
-
 
151
                                Sum_RC_Quality -= Sum_RC_Quality/4;
-
 
152
                        }
-
 
153
                        if(Sum_RC_Quality < 0) Sum_RC_Quality = 0;
-
 
154
                        RC_Quality = (uint8_t)(Sum_RC_Quality/128);
149
            index++; // next channel
155
            index++; // next channel
150
            // demux sum signal for channels 5 to 7 to J3, J4, J5
156
            // demux sum signal for channels 5 to 7 to J3, J4, J5
151
                if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5);
157
                if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5);
152
                if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4);
158
                if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4);
153
                if(BoardRelease == 10)
159
                if(BoardRelease == 10)