压力曲线

前言:
  解决的问题:
  1.探究了如何去实现压力曲线的转换用于单片机输出相应的频率。
  2.介绍了如何考虑使用的传感器压敏特性生成最合适的压力曲线。
  3.介绍了一种压力曲线的理论拟合方法,将计算转化过程大大简化。

  1.协议要求的压力曲线(压力等级——频率)是无法直接用于单片机输出的,需要有一个转化关系(单片机无法直接获取压力等级,直接得到的是电压值即采样值。频率的输出是对应定时器的设置值,也需要一个转换关系)。
  2.不同的压力传感器有其自己的压敏特性(不能通用,更换压力传感器时需要重新设置曲线),需要将具体使用的压敏特性考虑进曲线中。压敏特性即克重——电压曲线(我们一般用的压力传感器是压力引起电压变化)。
  3.单片机的运算性能较差,特别像主动笔这样的低功耗产品,需要考虑使用理论又将理论简化用于单片机运算(避免引入高次方、对数、幂运算,避免程序引入math库。将曲线拟合为多项式,总之就是减少计算量)。

  单片机软件开发过程中我们常常会接触很多曲线,要求输入与输出按照一定曲线规律。比如要求克重和输出压力等级呈现一定曲线关系。克重并非软件直接能采集到的,即使通过ADC采样值转换也并非一条简单的直线。压力等级和频率呈现一定曲线关系,而频率和单片机定时器设置值呈现一定曲线关系。
  类似这样的,协议规定了输入和输出呈现一定曲线关系,但对于软件来说输入和输出并非软件的直接输入和输出。层层转换,中间涉及到多条曲线关系。如何让很好的转换为软件的直接输入和输出的曲线关系,并且简化单片机的计算量是可以值得探究的问题。

1 协议的要求,克重和压力等级的曲线关系

Protocol line.png

  如上图,横坐标是克重,纵坐标是压力等级,该协议要求克重和压力等级呈现一定的曲线关系(形状类似对数函数曲线),你可能已经想到了,直接用Matlab或Origin软件拟合出曲线公式即可,没错,中间蓝色曲线拟合公式为:

Ideal formula.png

  拟合度达到了1!,说明协议的意图这实际就是一条对数函数曲线。
  但单片机直接采集到的并不是克重,ADC的采样值(电压),输出的压力等级最终需要转换为定时器的设置值。我们寻求克重和采样值的曲线关系,这条曲线与我们的产品结构和硬件相关,所以需要实际产品测试选取。以下是我测试的4件样品的采样值和克重的对应关系图。

Sample gram.png

  实际多测几件产品,曲线最终选取代表性的一条或求每个各种的采样值平均值。最后得到一条曲线(我一般取平均),可以看到克重和采样值的曲线关系也是一条对数函数曲线,我们一般喜欢输入作为横轴,所以交换下坐标轴变为指数函数曲线(互为反函数):

Sample gram2.png

  可以看到拟合出来的曲线公式,拟合度达到了0.99642。
  现在已经有两个曲线公式,将采样值转换为克重,克重转换为压力等级。
  剩下就要考虑把压力等级转换为频率输出了。根据协议压力等级和频率也有一个曲线关系,曲线拟合出来为(协议给的是256个离散的点):

Pressure frq.png

Pressure level.png

  频率和定时器设置值是正比直线关系,比较容易写出曲线公式。
  最后把这些的曲线公式相互套入得到最终公式为:

Sample cnt.png

  为了减少误差不建议在中间推算曲线过程中看到公式复杂就急着拟合为简单的曲线公式,最后才做一次结果曲线的拟合最好。

Final line.png

  转化关系流程图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
flowchat
st=>start: 开始
e=>end: 结束
opGram=>operation: 克重
opSampleValue=>operation: 采样值
opSensorCurve=>operation: 传感器压敏曲线(Curve1)
opProtocolCurve=>operation: 协议要求的压力曲线(Curve 2)
opPressureLv=>operation: 压力等级
opPressureFrq=>operation: 压力频率曲线(Curve 3)
opFrq=>operation: 频率
opTimerCfg=>operation: 单片机定时器配置和频率曲线对应曲线(Curve 4)
opTimerSetValue=>operation: 定时器设置值
cond=>condition

st->opSampleValue
opSampleValue->opSensorCurve
opSensorCurve->opGram
opGram->opProtocolCurve
opProtocolCurve->opPressureLv
opPressureLv->opPressureFrq
opPressureFrq->opFrq
opFrq->opTimerCfg
opTimerCfg->opTimerSetValue
opTimerSetValue->e

最终拟合曲线:

1
2
3
4
5
6
7
8
9
10
11
flowchat
st=>start
e=>end
opSampleValue=>operation: 采样值
opFitCurve=>operation: 最终拟合曲线(Curve 5
opTimerSetValue=>operation: 定时器设置值

st->opSampleValue
opSampleValue->opFitCurve
opFitCurve->opTimerSetValue
opTimerSetValue->e

  总结:最后得到的曲线运算量并不大,虽然前后推了很多公式,但套入后得到一个总的公式,虽然这个公式复杂,但进行一次多项式拟合后就可用于单片机计算,又不用引入math库。