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) |