|
本帖最后由 jialinx 于 2015-9-14 18:42 编辑
使用电阻的触摸屏时,ADC采集的信号往往有误差,这个时候就需要点击触摸屏一次 ADC就采集多次 (比如 采集10次) 然而 一般来说就是取 这10个数的平均值 作为信号的值 但是 经过试验 这是非常不可靠的.例如 某次采集的 信号是 53 52 54 53 52 51 55 4095 0 1105 3321 4095 对于这样的结果如果直接把这些数取平均值 那样的话太不可靠了 我们观察数据 显然ADC采样的正确的值 应该是 52 左右 . 为什么呢? 因为观察发现 53 52 54 53 52 51 这5个数差异不大 ,后面的5个数 显然差异太大了... 对的信号往往是在某个范围内变化的(范围越大 精度越小 可信度不高) 显然前面的5个AD值的变化范围是 可信的.
然而 怎么样让计算机 知道正确的信号呢?
对于这10个信号 我假设 正确的 值为 X 我定义一个可以接受的范围 N 假如说着10个数中 落在 X-N 到X+N 的范围内的数 最多那么 此时的X的值 就是正确的信号 ( 也就落在是 落在X的N领域中的数最多 )
- typedef unsigned char uint8_t;
- #define N 3 //定于可以接受的范围
- uint8_t LB(uint8_t *arr , uint8_t Length)
- {
- uint8_t Max = 0 , Number = 0 ;//保存最多出现的次数 和 该值
- uint8_t i , j ;
- uint8_t cc;// 差
- uint8_t Count=0;// 计数器
- for( i = 0 ; i < Length ; i++ )
- {
- for(j=0;j<Length;j++)
- {
- if( i == j )
- continue;
- /* 求两个数的差的绝对值 */
- if( arr[i] > arr[j] )
- cc = arr[i] - arr[j] ;
- else
- cc = arr[j] - arr[i] ;
- /* 如果差在范围内 */
- if( cc<= N )
- Count++;
- }
-
- if( Count > Max )
- {
-
- Max = Count;
-
- Number = arr[i];
- }
- Count=0;
- }
- printf("Num=%d\tMax=%d\n",Number,Max);
- }
复制代码
|
|