Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 800 → Rev 801

/branches/V0.68d Code Redesign killagreg/rc.c
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);