工业控制中查表法算法剖析

工业控制中的查表法

在工业控制中,有许多控制参数都是通过查表法来进行估计的,比如温度,是无法确切获取真实温度值的。
在这之前我们先看看工业中是如何获得温度信息的,目前最简单、性价比最高的方法就是使用感温包,感温包实际上就是一个电阻,只不过电阻的阻值会根据温度的变化而变化,感温包分为NTC和PTC,NTC就是温度和阻值负相关,温度越高,阻值越低,而PTC刚好相反,温度和阻值正相关,温度越高,阻值也越大。
知道了感温包的特性,我们就想,如果我知道了感温包的阻值的信息,不就可以知道温度信息了吗,而获取阻值的方式很简单,就是把感温包和其他恒定电阻串联,施加一个电压,这样感温包上就会有一个电压,通过采样电路就可以获取感温包上的电压,知道电压求感温包的阻值也就很容易了。知道感温包的阻值后,通过查找感温包的温度阻值对照表,我们就能得到温度信息。而我们都知道,感温包的温度阻值表一般是-30摄氏度到几百摄氏度,每1摄氏度对应一个阻值,工业控制很少会维护表中的所有值,原因是维护所有的值,很占存储空间,没必要,另一个是一般会根据产品的应用场景来进行维护,比如产品应用场景在0~80℃,就没有必要维护温度在 120 ~200℃的电阻值。
另外需要强调的是,按照常规的程序员想法,我们需要维护温度和阻值两个表,才能查找对应关系,但是实际上只需要维护温度一个表,在结合对应的估算方法,我们就可以估算对应的温度值。也就是说把一个二维表可以通过一些处理方式,变成一个一维表。
而本文的目的就是阐明如何从原始的温度阻值对照表中获取温度对照表以及如何通过温度对照表估算出对应的温度。下表是常见的感温包的温度阻值对照表。
|

数据抽取算法(matlab语言)

温度测量电路

温度测量电路
实际的运用中,由于我们施加的电压是确定的,所以我们一般是维护感温包的温度和电压(或者电压AD值)值对照表。常见的温度测量电路如下图所示:
在这里插入图片描述

根据实际电路获取温度电压对照表

通过感温包阻值对照表,我们可以计算出对应的温度电压值对照表,假如R=100K,则我们可以得出下表:
在这里插入图片描述

表中数据的抽取

  1. matlab代码

上表中有330个数据,实际中我们不可能存储所有的数据,所以我们需要提取我们需要的数据。实现的matlab代码如下:

function re=get_T(vin,table1,table_T,table_len)  %
for i=1:1:table_len
    if(vin <= table1(i) && vin > table1(i+1))   %table1和table_T负相关
    %if(vin >= table1(i) && vin < table1(i+1))   %table1和table_T正相关
        break;
    end
end
re= (vin-table1(i))/(table1(i+1)-table1(i))*(table_T(i+1)-table_T(i))+ table_T(i);
end

上面函数的名称为get_T,返回值为re,re对应的是提取的温度值,输入参数有5个,vin是电压输入值,比如我要提取输入为2.001V时,就输入2001(一般会扩大1000倍输入,化为整数处理),table1是电压对应的表,table_T是温度对照的表,这两个表是等长的,而table_len是这两个表的长度。通过上面公式可以得到任意电压下的对应温度值。
**注意,输入的电压不能超出table1中的电压值范围,不能是300℃对应的电压值,因为会越界。
至于从什么时候开始维护温度表及每隔多少mv计算温度值,取决于你的产品应用场景及温度估算精度要求。

  1. 例子
    假如我要抽取电压在2.760~0.321之间的温度值,而且是每隔100mv抽取一个,则我们先算出0.321 ~ 2.760之间最大有多少个100mv,通常为了处理方便,通常我们会将所有数据都化为整数处理,如下表,把电压×1000,然后四舍五入。
    在这里插入图片描述
    通过计算,0.321 ~ 2.760到之间最多有25个值:
    321
    421
    521
    621
    721
    821
    921
    1021
    1121
    1221
    1321
    1421
    1521
    1621
    1721
    1821
    1921
    2021
    2121
    2221
    2321
    2421
    2521
    2621
    2721
    我们可以看一下对照表,2721大概对应的是-20℃,如果该温度值不满足应用需求,可以在增加一个数据2821=2721+100,在这里我们假设可以满足应用需求,则我们的输入vin就是这25个电压数据,输出就是我们需要维护的温度表,另外我们需要记住输入电压的最大值2721及最小值321,这个在以后查表法估算温度中有用。通过上面的代码,我们可以得到我们需要的温度表,如下:
    在这里插入图片描述
    在程序里我们只需要维护温度表T,看看数据小了多少。

**思考:这里请思考为什么要每隔等长抽取一个数据???不懂的可以私聊我。

查表法算法

通过数据表T计算任意输入电压下的温度值
通过以下matlab函数,可以计算任意电压下的温度值。

function result = calOut(vin,table,len)

vmin = 321;    %电压表中的输入最小值
vmax = 2721;  %电压表中的输入最大值
if(vin < vmax)
outint = floor((vin-vmin)/(vmax-vmin)*(len-1));
outfrac = (vin-vmin)/(vmax-vmin)*(len-1) - outint;
out1 = table(outint+1);
out2 = table(outint+2);  %为什么是+1和+2,因为下标从1开始
result =out1 + ((out2-out1)*outfrac);
else
    result = table(len);
end
end

上述matlab函数calOut中,result为返回值,为需要计算的温度值,vin是采集得到的电压值,table是温度表T,len是温度表的长度。

  1. 估算的精度如何
    我们可以通过matlab来测试一下估算的精度如何,且看下图:
    在这里插入图片描述

其中蓝色的是原始的电压温度对照表,总共331个数据,橙色的是测试数据,321:20:2721,是从321开始,每隔20mv取一个数据,然年作为输入,得到的结果就是估算出的温度数据,从曲线中我们可以看出,两个曲线几乎是重合的,精度不差,具体的精度其实也是可以推到出来的,但是没必要。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值