|
本帖最后由 jialinx 于 2015-9-14 18:42 編輯
使用電阻的觸摸屏?xí)r,ADC采集的信號(hào)往往有誤差,這個(gè)時(shí)候就需要點(diǎn)擊觸摸屏一次 ADC就采集多次 (比如 采集10次) 然而 一般來(lái)說(shuō)就是取 這10個(gè)數(shù)的平均值 作為信號(hào)的值 但是 經(jīng)過(guò)試驗(yàn) 這是非常不可靠的.例如 某次采集的 信號(hào)是 53 52 54 53 52 51 55 4095 0 1105 3321 4095 對(duì)于這樣的結(jié)果如果直接把這些數(shù)取平均值 那樣的話(huà)太不可靠了 我們觀察數(shù)據(jù) 顯然ADC采樣的正確的值 應(yīng)該是 52 左右 . 為什么呢? 因?yàn)橛^察發(fā)現(xiàn) 53 52 54 53 52 51 這5個(gè)數(shù)差異不大 ,后面的5個(gè)數(shù) 顯然差異太大了... 對(duì)的信號(hào)往往是在某個(gè)范圍內(nèi)變化的(范圍越大 精度越小 可信度不高) 顯然前面的5個(gè)AD值的變化范圍是 可信的.
然而 怎么樣讓計(jì)算機(jī) 知道正確的信號(hào)呢?
對(duì)于這10個(gè)信號(hào) 我假設(shè) 正確的 值為 X 我定義一個(gè)可以接受的范圍 N 假如說(shuō)著10個(gè)數(shù)中 落在 X-N 到X+N 的范圍內(nèi)的數(shù) 最多那么 此時(shí)的X的值 就是正確的信號(hào) ( 也就落在是 落在X的N領(lǐng)域中的數(shù)最多 )
- typedef unsigned char uint8_t;
- #define N 3 //定于可以接受的范圍
- uint8_t LB(uint8_t *arr , uint8_t Length)
- {
- uint8_t Max = 0 , Number = 0 ;//保存最多出現(xiàn)的次數(shù) 和 該值
- uint8_t i , j ;
- uint8_t cc;// 差
- uint8_t Count=0;// 計(jì)數(shù)器
- for( i = 0 ; i < Length ; i++ )
- {
- for(j=0;j<Length;j++)
- {
- if( i == j )
- continue;
- /* 求兩個(gè)數(shù)的差的絕對(duì)值 */
- if( arr[i] > arr[j] )
- cc = arr[i] - arr[j] ;
- else
- cc = arr[j] - arr[i] ;
- /* 如果差在范圍內(nèi) */
- if( cc<= N )
- Count++;
- }
-
- if( Count > Max )
- {
-
- Max = Count;
-
- Number = arr[i];
- }
- Count=0;
- }
- printf("Num=%d\tMax=%d\n",Number,Max);
- }
復(fù)制代碼
|
|