最近对于AD采样滤波处理有了个新的思路更加方便,其实说白了就是体育比赛的
积分规则,10个裁判,去掉最高分和最低分,剩下的8个裁判的分取平均值
代码如下
BYTE ad_data;
BYTE ad_sample_cnt;
BYTE ad_value_min;
BYTE ad_value_max;
WORD ad_value_sum;
void GetAdData(void)
{
AD_START = 1;
WAIT1 AD_START;
ad_data = ADCR;
}
void ad_proc(void)
{
GetAdData(); // 首先得到AD的数值,平台不同而不同
if (ad_sample_cnt ==0) // 判断是不是第一,是的话设置最大最小值
{
ad_value_min = ad_data;
ad_value_max = ad_data;
}
if (ad_data < ad_value_min){ // 对比看是否比最小值小则保存
ad_value_min = ad_data;
}
if (ad_data > ad_value_max){ // 同上,找最大值
ad_value_max = ad_data;
}
ad_value_sum += ad_data; // 所有的数据累加起来
ad_sample_cnt++;
if (ad_sample_cnt >9) // 采样10个数据
{
// sub max and min
ad_value_sum -= ad_value_min; // 去掉最大最小值
ad_value_sum -= ad_value_max;
ad_value_sum >>= 3; // 剩下的8个数据的和,然后除以8,右移3位就是除以8了,避免做除法。ad_value_sum/8
// ad_value_sum 里面放的就是结果了。
// init
ad_sample_cnt = 0;
ad_value_min = 0;
ad_value_max = 0;
ad_value_sum = 0;
}
}
|