开始找K型热电偶的分度表 在网上下载了一个 北京中航科仪测控技术有限公司提供 JJG-351-84标准 的 XXXXXXXXXXXXXXX/350296/2012010517073556.pdf
首先检查数据 转到excel 然后每个点和周围点的平均值进行对比 发现许多明显的误差点
检查原文档 明显有误
我不断挑出误差较大的点 问题是很多的 大概有10来20个 大多数是录入错误吧 比如6和8 3和5混淆 直到误差点校正成这样
一般如果直接用这种数据做查表插值 问题是比较大的 有的地方甚至都不能保证数据递增 有没有办法避免呢
我建议需要查表的计算 都不要直接用原始表 首先数据可能有零星错误 其次往往查表插值最准确的地方是有原始值的点 而中间需要插值的点 其实从整体误差来看 这种插值法并非最优方案
比分说这个K型热电偶分度表 我需要按10度分度 不会简单按每10度抽取 则会对每10个数据先用最小二乘法拟合 求出截距和斜率 再重新生成数据点 然后才抽取作为MCU使用的表 这样做的好处有
避免了单个数据点有误又正好被抽用
插值后 所有点误差的平方和最小 (别的要求则用别的拟合方式) 比仅仅两端的点误差为0更有意义
我对比了使用拟合后数据抽取做表的插值误差(蓝色点) 和原始数据抽取做表插值(插值算法一样)的误差(橙色点) 显然和我预料的一样 尽管橙色点总会在0误差处出现 但是整体而言 还是蓝色点的误差分布范围最小
这里有些很有意思的事 我注意到有几段数据是纯线性无误差的 比如从350度到380度 我猜 这段数据是不是就没有测量值 也是靠线性插值蒙出来的 就是不知道这些数据是公司提供的 还是官方的 是不是和其他的一样 我暂时找不到其他分度表数据来源 (关键是其他的下载都要钱)
...................
因为是输入电压求温度 最终根据电压进行分组分度 为了减法乘法除法 使用256uV进行分度 最小二乘法求出每段的参数 然后生成分度点上的温度 并且为了提高精度 以1/32度进行整数表达
数据得到后 写出代码 表长度没超过256个 相邻温度都也都小于250 可以仅用一次16位乘法 需要的可以拿去参考 可以省去反向查表的麻烦 而且来源数据经过初步校正 且拟合优化
// a table of uV/256 => Temp*32 , in Celsius degree __code u16 K_temp32[]={ 0, 207, 412, 616, 819, 1021, 1221, 1421, 1620, 1818, 2016, 2214, 2411, 2608, 2806, 3003, 3201, 3399, 3598, 3797, 3997, 4198, 4400, 4602, 4805, 5009, 5214, 5418, 5623, 5829, 6034, 6239, 6444, 6650, 6853, 7058, 7261, 7464, 7666, 7869, 8070, 8270, 8471, 8670, 8869, 9068, 9266, 9464, 9662, 9860, 10057, 10253, 10450, 10646, 10842, 11038, 11234, 11429, 11624, 11819, 12014, 12209, 12403, 12597, 12791, 12985, 13179, 13373, 13566, 13760, 13953, 14146, 14339, 14532, 14724, 14917, 15110, 15303, 15495, 15687, 15880, 16072, 16264, 16456, 16649, 16840, 17033, 17225, 17417, 17609, 17801, 17993, 18186, 18378, 18570, 18763, 18955, 19148, 19340, 19533, 19726, 19919, 20112, 20305, 20499, 20692, 20886, 21080, 21274, 21468, 21662, 21858, 22052, 22247, 22443, 22638, 22834, 23030, 23226, 23422, 23619, 23816, 24014, 24211, 24409, 24607, 24806, 25004, 25203, 25403, 25602, 25802, 26003, 26204, 26404, 26605, 26807, 27009, 27211, 27413, 27617, 27820, 28023, 28227, 28432, 28636, 28841, 29047, 29252, 29458, 29664, 29871, 30078, 30285, 30493, 30701, 30909, 31118, 31327, 31536, 31746, 31957, 32167, 32378, 32589, 32801, 33013, 33226, 33439, 33652, 33865, 34079, 34294, 34508, 34724, 34940, 35155, 35372, 35590, 35807, 36025, 36244, 36463, 36682, 36903, 37123, 37344, 37567, 37789, 38012, 38235, 38459, 38684, 38910, 39137, 39364, 39591, 39820, 40049, 40279, 40510, 40741, 40973, 41207, 41440, 41675, 41910, 42146, 42383, 42621, 42859, 43098, 43337, 43578, 43818, 44059 }; // get temperature in Celsius degree of K-thermocouple with input in uV u16 K_temp(u16 uv) { u8 t; if (uv>55000) return 0xffff; t=uv>>8; return ((((K_temp32[t+1]-K_temp32[t])*(u16)(u8)uv)>>8)+K_temp32[t])>>5; }
下面这图是表的温度间隔 可以看到非线性现象 (如果线性的 每段的间隔应该是相同的)
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |