|
发表于 2010-5-10 17:25:21
|
显示全部楼层
我写的软件,数据拟合,然后直接查表就可以了,省去了二分查表的麻烦。
数据拟合功能就是为了干这个用的!
软件在我的资料中自己找,代码写下:
unsigned char Tables[64] = {
0u, //(0.000, 0.054)
0u, //(16.238, 0.228)
1u, //(32.476, 0.567)
1u, //(48.714, 1.057)
2u, //(64.952, 1.683)
2u, //(81.190, 2.422)
3u, //(97.429, 3.254)
4u, //(113.667, 4.154)
5u, //(129.905, 5.100)
6u, //(146.143, 6.069)
7u, //(162.381, 7.043)
8u, //(178.619, 8.003)
9u, //(194.857, 8.934)
10u, //(211.095, 9.824)
11u, //(227.333, 10.665)
11u, //(243.571, 11.449)
12u, //(259.810, 12.174)
13u, //(276.048, 12.839)
13u, //(292.286, 13.445)
14u, //(308.524, 13.997)
14u, //(324.762, 14.500)
15u, //(341.000, 14.961)
15u, //(357.238, 15.389)
16u, //(373.476, 15.793)
16u, //(389.714, 16.183)
17u, //(405.952, 16.568)
17u, //(422.190, 16.960)
17u, //(438.429, 17.366)
18u, //(454.667, 17.796)
18u, //(470.905, 18.257)
19u, //(487.143, 18.757)
19u, //(503.381, 19.301)
20u, //(519.619, 19.894)
21u, //(535.857, 20.537)
21u, //(552.095, 21.234)
22u, //(568.333, 21.984)
23u, //(584.571, 22.786)
24u, //(600.810, 23.639)
25u, //(617.048, 24.539)
25u, //(633.286, 25.483)
26u, //(649.524, 26.466)
27u, //(665.762, 27.483)
29u, //(682.000, 28.530)
30u, //(698.238, 29.601)
31u, //(714.476, 30.693)
32u, //(730.714, 31.801)
33u, //(746.952, 32.922)
34u, //(763.190, 34.054)
35u, //(779.429, 35.196)
36u, //(795.667, 36.348)
38u, //(811.905, 37.510)
39u, //(828.143, 38.685)
40u, //(844.381, 39.876)
41u, //(860.619, 41.087)
42u, //(876.857, 42.320)
44u, //(893.095, 43.579)
45u, //(909.333, 44.866)
46u, //(925.571, 46.180)
48u, //(941.810, 47.518)
49u, //(958.048, 48.870)
50u, //(974.286, 50.223)
52u, //(990.524, 51.552)
53u, //(1006.762, 52.824)
54u, //(1023.000, 53.992)
};
计算:
inline unsigned char GetValue(unsigned int ADC){ //ADC是你的采样值
return Tables[(unsigned char)(ADC>>4)];
}
使用AVR和GCC编译器的话,将上述东西分配到Flash中,并用pgm_read_uchar,这里不具体分析了。 |
|