#define ADC_BUFFER_NUM 6
int adc_value_buf[ADC_BUFFER_NUM];
int adc_index_count;
bool adc_buf_initialized;
static int get_adcvalue(struct ics_proximity_data *ics)
{
int i = 0;
int j = 0;
unsigned int adc_total = 0;
int adc_avr_value =0;
unsigned int adc_index = 0;
unsigned int adc_max = 0;
unsigned int adc_min = 0;
int value = 0;
value = get_adc_value();
adc_index = (adc_index_count++) % ADC_BUFFER_NUM;
if (!ics->adc_buf_initialized) {
ics->adc_buf_initialized = true;
for (j = 0; j < ADC_BUFFER_NUM; j++)
adc_value_buf[j] = value;
} else
ics->adc_value_buf[adc_index] = value;
adc_max = adc_value_buf[0];
adc_min = adc_value_buf[0];
for (i = 0; i < ADC_BUFFER_NUM; i++) {
adc_total += adc_value_buf[i];
if (adc_max < adc_value_buf[i])
adc_max = adc_value_buf[i];
if (adc_min > adc_value_buf[i])
adc_min = adc_value_buf[i];
}
adc_avr_value = (adc_total-(adc_max+adc_min))/(ADC_BUFFER_NUM-2);
if (adc_index_count == ADC_BUFFER_NUM-1)
adc_index_count = 0;
printk(KERN_INFO "proximity adc=%d",adc_avr_value);
return adc_avr_value;
}
主要算法:
1.用第一次的ADC值来填充所有的buf
2.取得最大和最小值
3.舍去最大值和最小值,并求平均值
4.buf下标用求余来填充相应的下标值