打印

使用查表法建立变量之间的关系

[复制链接]
1245|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 会笑的星星 于 2020-2-25 19:36 编辑

在程序设计时,我们可能需要建立一个直线方程,以根据输入值产生一个输出值,典型的一个应用就是获取温度传感器的A/D值,然后把A/D值通过直线方程转化为对应的温度(如图所示)。通过直线方程找到两个变量之间的关系看上去很简单,只需要做一个简单的运算就能完成,不少书上也是这么教的,但是如果考虑在单片机中应用就可能有问题。

温度与A/D之间的线性关系

一般而言建立直线方程需要做浮点运算,这对于有些单片机来说是有压力的,即使我们考虑把浮点数转换为整数,也会涉及大整数的乘除运算,同样对有些单片机来说是不合适的。除了考虑单片机的运算效率以外,还有一点更为关键,那就是一不小心造成运算出错,比如数据溢出的问题,一旦出现这样的问题,恐怕找bug都要找死你。因此,只要条件允许,不建议在单片机中通过建立直线方程来建立两个变量之间的关系。那通过什么办法找两个变量之间的关系呢 --- 查表法,下面就对这种方法做一个介绍。

什么是查表法呢,我以上图温度与A/D值的关系为例来说明。我们首先建立一个存储温度的数组,用A/D值做为数组索引,实际温度做为该数组的值,从而将A/D值与温度一一对应。例如A/D值为20时,对应的实际温度是20℃,存储温度的数组是temprature[](temprature的数据类型为const),我们需要确保这个数组在索引20的位置对应的温度为20,也就是temprature[20] = 20,当A/D值是40时,对应温度为40℃,那么temprature[40] = 40,其他温度以此类推。

如上建立温度与A/D值的映射关系,你会发现假如我要测量的温度就只有20-40℃,按照上述的一一映射关系,这个数组的前20个字节不是浪费了吗。的确如此,如果像上述直接映射,好处是十分简单,坏处是会有20个字节浪费,但是考虑该数组一般存储在flash空间,不占用RAM,而flash空间对于很多单片机来说是够用的,即使浪费一点也不需要太担心。

假如你实在不想浪费那多余的二十个字节,也是有办法的,你只要把做为数组索引的A/D值做一个简单的转换就可以。怎么做呢,只要把读取的A/D值-20,让有效温度对应的索引位置从20-40平移到0-20,这样就能节省20个字节的空间。比如A/D值为20,temprature[20-20] = 20,A/D值为40,temprature[40-20]  = 40。

如上方法就是查表法,相比直线方程,查表法只需要根据索引取出对应的值即可,不像直线方程那样涉及到比较复杂的乘除运算。不过查表法有一个麻烦就是需要事先计算出(无法计算时则要估计)每一个A/D值与温度的映射关系,而直线方程不需要这样(只要确定y=ax+b中的a、b后就可以根据x值计算y)。

事实上,假如上述的A/D值与温度的关系并不是直线,而是曲线(如下图),此时采用直线拟合这条曲线可能就不准确了,但如果使用查表法却可以解决这个问题,因为查表法的映射关系是人工一个个准备好的,由此建立的变量关系具有更高的拟合度从而更接近实际情况。

温度与A/D值之间的曲线关系

当然,有时候我们无法事先建立好变量之间的映射关系,可能需要根据外部情况(比如传感器特性)调整一些数据,从而必须建立直线或者曲线方程才能很好的符合实际情况,此时查表法可能就无能无力了。到底使用查表法还是使用方程,需要视情况而定,没有哪一种方法是万能的。


使用特权

评论回复

相关帖子

沙发
会笑的星星|  楼主 | 2020-2-25 19:36 | 只看该作者

使用特权

评论回复
板凳
叶春勇| | 2020-2-25 22:25 | 只看该作者
高精度,查表法。我叫抄母表,复制母表

使用特权

评论回复
地板
airwill| | 2020-2-27 12:30 | 只看该作者
查表,只能应付单调特性的关系

使用特权

评论回复
5
R2D2| | 2020-2-28 08:23 | 只看该作者
楼主这样的玩意儿是不知道地球上还有定点数这个东西的。

使用特权

评论回复
评论
R2D2 2020-2-28 21:28 回复TA
@会笑的星星 :你都用上查表了,你的运算能有多复杂?你的数据范围该有多狭窄?这么简单的东西还能搞溢出你的智商该有多低? 
会笑的星星 2020-2-28 14:23 回复TA
定点数分为定点小数与定点整数。任何一个小数,我们可以把小数点以前的数表示为定点整数,小数点后面的数表示为定点小数,从而把一个小数表示成一个计算机能识别的数。 那请问:使用定点数表示的小数,计算机在计算大整数乘除运算效率能相比其他浮点运算效率高多少? 另外,我再澄清一点,即使你不考虑运算效率,也应该考虑大整数运算更容易出现数据溢出。 
6
会笑的星星|  楼主 | 2020-2-28 13:05 | 只看该作者
airwill 发表于 2020-2-27 12:30
查表,只能应付单调特性的关系

同样能解决非线性的变量关系,只要你事先知道变量之间是如何对应的就可以。

使用特权

评论回复
7
airwill| | 2020-2-28 16:17 | 只看该作者
会笑的星星 发表于 2020-2-28 13:05
同样能解决非线性的变量关系,只要你事先知道变量之间是如何对应的就可以。 ...

没有说线性与否的问题,单调性却是必要的

使用特权

评论回复
8
会笑的星星|  楼主 | 2020-2-29 15:49 | 只看该作者
R2D2 发表于 2020-2-28 08:23
楼主这样的玩意儿是不知道地球上还有定点数这个东西的。

我只能说你除了嘴巴上有本事以外,其他看起来一无是处

使用特权

评论回复
9
R2D2| | 2020-2-29 15:58 | 只看该作者
会笑的星星 发表于 2020-2-29 15:49
我只能说你除了嘴巴上有本事以外,其他看起来一无是处

也比你这种货色强一万倍。

使用特权

评论回复
10
会笑的星星|  楼主 | 2020-2-29 16:01 | 只看该作者
R2D2 发表于 2020-2-29 15:58
也比你这种货色强一万倍。

没错,在无知上的确比我强一万倍

使用特权

评论回复
评论
会笑的星星 2020-2-29 16:35 回复TA
@R2D2 :我不是个什么东西,也不是根葱,如果你不在意我怎么看你,那么请你从现在开始闭嘴。 
R2D2 2020-2-29 16:22 回复TA
@会笑的星星 :别人怎么看我关你p事啊?你算是个什么东西?你也太拿自己当根葱了吧! 
会笑的星星 2020-2-29 16:18 回复TA
@R2D2 :在提醒一下,嘴巴上最好积点德,我真的很想知道你周围的朋友到底怎么看你的 
会笑的星星 2020-2-29 16:16 回复TA
@R2D2 :没错,但看上去你连查表都不会,不然不会看上去这么自大,这么无知 
R2D2 2020-2-29 16:07 回复TA
你这种烂人也就会个查表了。 
11
这热闹的,咋就演变成了骂战了呢,有些传感器,确实不只能用查表,然后计算偏移,相当于分段线性拟合吧,没有说查表就一定是低端的。没这说法嘛

使用特权

评论回复
12
andy520520| | 2020-12-4 15:15 | 只看该作者
你这些都谬论
温度很阻值是有个叫B值,反应这个曲线形态的
可以直接算出来
另外工程上也广泛用分段直线去拟合曲线

使用特权

评论回复
13
广东梁百万| | 2020-12-4 15:28 | 只看该作者
各抒己见,我来学习的

使用特权

评论回复
14
座机呀| | 2020-12-5 23:04 | 只看该作者
想起来以前用台系小单片机,扣扣嗖嗖的,就为了省那么点空间,绞劲脑汁

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

96

帖子

16

粉丝