压力曲线
前言:单片机软件开发过程中我们常常会接触很多曲线,要求输入与输出按照一定曲线规律。比如要求克重和输出压力等级呈现一定曲线关系。克重并非软件直接能采集到的,即使通过ADC采样值转换也并非一条简单的直线。压力等级和频率呈现一定曲线关系,而频率和单片机定时器设置值呈现一定曲线关系。
类似这样的,协议规定了输入和输出呈现一定曲线关系,但对于软件来说输入和输出并非软件的直接输入和输出。层层转换,中间涉及到多条曲线关系。如何让很好的转换为软件的直接输入和输出的曲线关系,并且简化单片机的计算量是可以值得探究的问题。
协议的要求,克重和压力等级的曲线关系
如上图,横坐标是克重,纵坐标是压力等级,该协议要求克重和压力等级呈现一定的曲线关系(形状类似对数函数曲线),你可能已经想到了,直接用Matlab或Origin软件拟合出曲线公式即可,没错,中间蓝色曲线拟合公式为:
拟合度达到了1!,说明协议的意图这实际就是一条对数函数曲线。
但单片机直接采集到的并不是克重,ADC的采样值(电压),输出的压力等级最终需要转换为定时器的设置值。我们寻求克重和采样值的曲线关系,这条曲线与我们的产品结构和硬件相关,所以需要实际产品测试选取。以下是我测试的4件样品的采样值和克重的对应关系图。
实际多测几件产品,曲线最终选取代表性的一条或求每个各种的采样值平均值。最后得到一条曲线(我一般取平均),可以看到克重和采样值的曲线关系也是一条对数函数曲线,我们一般喜欢输入作为横轴,所以交换下坐标轴变为指数函数曲线(互为反函数):
可以看到拟合出来的曲线公式,拟合度达到了0.99642。
现在已经有两个曲线公式,将采样值转换为克重,克重转换为压力等级。
剩下就要考虑把压力等级转换为频率输出了。根据协议压力等级和频率也有一个曲线关系,曲线拟合出来为(协议给的是256个离散的点):
频率和定时器设置值是正比直线关系,比较容易写出曲线公式。
最后把这些的曲线公式相互套入得到最终公式为:
为了减少误差不建议在中间推算曲线过程中看到公式复杂就急着拟合为简单的曲线公式,最后才做一次结果曲线的拟合最好。
总结:最后得到的曲线运算量并不大,虽然前后推了很多公式,但套入后得到一个总的公式,虽然这个公式复杂,但进行一次多项式拟合后就可用于单片机计算,又不用引入math库。
进行一次多项式拟合后就可用于单片机计算,又不用引入math库。