如何在大型值列表中搜索值

时间:2019-07-16 18:08:26

标签: c microcontroller

我的程序中有一个电阻输出。现在我想将其转换为温度。因此,我有一个电阻值列表及其对应的温度,该列表具有400个值。我正在为我的AVR微控制器在Embedded C中对其进行编程。

我当时想用for循环创建一个函数,但是值的数量非常大,所以不是一个好主意。

我希望如果我给电阻设置为70欧姆,那么该功能或程序应在该列表中检查70欧姆的温度。

4 个答案:

答案 0 :(得分:2)

我将获取您拥有的400个数据点,将其放入您选择的excel /程序中,并生成一个回归函数(如果是耐温度的,则可能是线性的)。

如果您担心速度,AVR有时会具有用于L / S,MUL和ADD的管道,因此计算它可能比查找它更快。

答案 1 :(得分:1)

做到这一点的最佳方法可能是使用字典,但是C本身没有字典,因此您需要自己实现一个字典。也许看看这里:Quick Way to Implement Dictionary in C

400并不是很多,所以即使对其进行迭代也应该很好。

答案 2 :(得分:1)

因此,您正在使用查找表将电阻转换为温度。您有一个包含400个条目的表。您可以使用最近邻算法,只需编写一个for循环,然后查找电阻值与所测电阻值最接近的表条目,然后报告存储在该表条目中的温度。

但是,您可以做得更好。如果按电阻对查找表进行排序,则可以使用linear interpolation提供更准确的转换。这意味着您将找到两个介于测量电阻之间的条目。然后,您可以在这些条目之间进行插值(使用算术运算按比例计算表条目之间的温度),以获得更准确的温度转换。

这是How to build a lookup table in C (SDCC compiler) with linear interpolation中线性插值的示例。

答案 3 :(得分:1)

x值相等的表经常用于嵌入式系统。

如果表的当前电阻值(x)不等距,请使用台式计算机计算/内插等距电阻值的温度值(y)。

然后,您可以使用简单的温度值数组,并根据电阻计算指数。

示例表,假设您的电阻范围是80到110,相应的温度范围是0到100。

resistance temperature (corresponding table index)
80         0           0
82         1           1
84         2           2
86         4           3
88         7           4
...        ...
108        99          29
110        100         30

然后您可以使用像这样的数组

int temp_table[] = { 0, 1, 2, 4, 7, /* ... */ 99, 100 };

并像这样计算温度:

const int rmin = 80;
const int rmax = 110;
int r; /* assuming this is the measures resistance */
int temp;
int index;

if(r < rmin) {
   /* error min */
} else if(r > rmax) {
   /* error max */
} else {
   /* This calculates the table index for the highest resistance value 
      from the table not greater than r.   Check your resistance range
      and factor and divider to  make sure you don't get an overflow here. */
   index = ( (r - rmin) * (sizeof(temp_table) / sizeof(temp_table[0])) ) / (rmax - rmin);
   temp = temp_table(index);
}

如果表点较少,则可能希望通过线性(或其他)插值扩展此简单的表搜索。