|
发表于 2019-12-6 13:38:34
|
显示全部楼层
本帖最后由 人生之际 于 2019-12-6 14:00 编辑
2分法查表,非常快,比拟合曲线计算要快多了贡献一个从大到小排序的表格的二分法查找函数:
//******************************************************************************
//对半查找法搜索表格,找不到的正好的值,就计算1格范围内的插值
//sSource:排序好的表格,array_size:表格单元数,array0:表格第一个数对应的值
//intvl:表格间隔,1度间隔就是1,10度间隔就是10
//zoom:作为放大倍数(1度的表格需要返回0.1度就为10,需要返回0.01度就为100
//key:需要查找和插值的实际值
//适合表格为从大到小排列的查找,如NTC
static I32 BinSearchB(I32 sSource[], I32 array_size, I32 array0, I32 intvl, I32 zoom, I32 key)
{
I32 l,h,m;
if(key>sSource[0]) //小于数组最小值,返回最小
return array0*zoom;
if(key<sSource[array_size-1]) //大于数组最大值,返回最大
return ((array_size-1)*intvl+array0)*zoom;
//对半查找法
l = 0;
h = array_size-1;
while(l<=h){ //如果没有正好找到,退出时h<l
m = (l+h)>>1; //对半
if(sSource[m]==key) //正好找到
return (m*intvl+array0)*zoom;
if(sSource[m]>key) //太靠前,查找后面
l = m + 1;
else //太靠后,查找前面
h = m - 1;
}//key数据在[h]和[l]中间
m = sSource[h]-key; //实际误差
l = sSource[h]-sSource[l]; //1格误差
h = (h*intvl+array0)*zoom; //下沿整值
h += m*intvl*zoom/l; //+1格内误差插值
return h;
}
用法:
t = BinSearchB(RT_Tab,RT_TABDIM,RT_TABMIN,1,10,R); //欧姆转换为0.1度单位温度值
RT_Tab表格如下样子:
#define RT_TABDIM 121
#define RT_TABMIN -20 //表格第一组值:-20度
//10k 3950电阻值与温度值的对应表,电阻值单位 欧姆
I32 RT_Tab[RT_TABDIM] =
{
97120, //-20
91660, //-19
86540, //-18
81720, //-17
77220, //-16
72980, //-15
69000, //-14
65260, //-13
61760, //-12
58460, //-11
55340, //-10
52420, //-9
49660, //-8
47080, //-7
44640, //-6
42340, //-5
40160, //-4
38120, //-3
36200, //-2
34380, //-1
32660, //0
31040, //1
29500, //2
28060, //3
26680, //4
25400, //5
24180, //6
23020, //7
21920, //8
20880, //9
19900, //10
18970, //11
18290, //12
17260, //13
16460, //14
15710, //15
15000, //16
14320, //17
13680, //18
13070, //19
12490, //20
11940, //21
11420, //22
10920, //23
10450, //24
10000, //25
9574 , //26
9166 , //27
8778 , //28
8480 , //29
8058 , //30
7724 , //31
7404 , //32
7098 , //33
6808 , //34
6532 , //35
6268 , //36
6015 , //37
5776 , //38
5546 , //39
5326 , //40
5118 , //41
4918 , //42
4726 , //43
4544 , //44
4368 , //45
4202 , //46
4042 , //47
3888 , //48
3742 , //49
3602 , //50
3468 ,
3340 ,
3216 ,
3098 ,
2986 , //55
2878 ,
2774 ,
2674 ,
2580 ,
2488 , //60
2400 ,
2316 ,
2234 ,
2158 ,
2082 , //65
2012 ,
1942 ,
1876 ,
1813 ,
1751 , //70
1693 ,
1637 ,
1582 ,
1530 ,
1480 , //75
1432 ,
1385 ,
1341 ,
1298 ,
1256 , //80
1216 ,
1178 ,
1141 ,
1105 ,
1071 , //85
1038 ,
1006 ,
975 ,
945 ,
916 , //90
888 ,
862 ,
836 ,
811 ,
787 , //95
764 ,
741 ,
720 ,
699 , //99
679 , //100
};
|
|