18,7 → 18,7 |
volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame |
volatile int16_t PPM_diff[15]; |
volatile uint8_t NewPpmData = 1; |
volatile uint8_t RC_Quality = 0; |
volatile int16_t RC_Quality = 0; |
|
|
/***************************************************************/ |
104,6 → 104,7 |
int16_t signal = 0, tmp; |
static int16_t index; |
static int16_t Sum_RC_Quality = 0; |
int16_t Noise; |
|
// 16bit Input Capture Register ICR1 contains the timer value TCNT1 |
// at the time the edge was detected |
135,8 → 136,17 |
// shift signal to zero symmetric range -154 to 159 |
signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms) |
// check for stable signal |
Sum_RC_Quality -= Sum_RC_Quality/128; |
Sum_RC_Quality += 200 - abs(signal - PPM_in[index]); // max 200*128 = 25600 |
Noise = abs(signal - PPM_in[index]); |
if((Noise/16) > (200-RC_Quality)) // spike detector |
{ |
Sum_RC_Quality -= 3*RC_Quality; |
Sum_RC_Quality += 3*(200 - Noise); |
} |
else |
{ |
Sum_RC_Quality -= RC_Quality; |
Sum_RC_Quality += 200 - Noise; |
} |
// calculate exponential history for signal |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
151,7 → 161,7 |
Sum_RC_Quality -= Sum_RC_Quality/4; |
} |
if(Sum_RC_Quality < 0) Sum_RC_Quality = 0; |
RC_Quality = (uint8_t)(Sum_RC_Quality/128); |
RC_Quality = Sum_RC_Quality/128; |
index++; // next channel |
// demux sum signal for channels 5 to 7 to J3, J4, J5 |
if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5); |