今天看到同事写的一个算法,在这里和大家分享一下:
针对压力传感器的零点漂移,AD采样值在零点附近来回波动,这样的AD值根本没办法使用,但是如果直接限制幅度,会造成正压起始点和负压起始点抬高,又要显示从0开始,这就需要在限制幅度的基础上增加AD值平均分散法(自己乱命名的)。
优点:解决显示和输出非常稳定。(将波动值限制了,基本上用户用不到这样靠近零点的压力)
缺点:被做了算法的这段压力段与实际压力有微小的差异,接着看。
假如:输入压力的AD值范围是-1000~1000 , 但是在 -50<0<50这一段非常不稳定,其他的段就是线性的;然后-200<0<200是客户不用的(要用也没关系)。
int Display_number;
if(-200<ADC_Value<200)
{
if(-50<ADC_Value<50) Display_number = 0; // 1
if(50<=ADC_Value<100)Display_number=ADC_Value-50; // 2
if(-50<=ADC_Value<-100)Display_number=ADC_Value+50; // 3
if(100<=ADC_Value<200)Display_number=ADC_Value*X+Y; // 4
if(-100<=ADC_Value<-200)Display_number=ADC_Value*X+Y; // 5
}
第一句 就是将跳动的ADC值-50<ADC_Value<50直接不要,丢掉。
第二句 就是往正压方向的<100的ADC值范围50-100的显示为0-50
第三句 就是往负压方向的<-100的ADC值范围-500~-100显示为0~-50
第四句和第五句就是关键了;先讲第四句,第五句和第四句差不多。 简单屡一下就是输入量ADC_Value是100~<200,输出量就是Display_number是60~200,这里觉得有点迷糊的同学自己先屡屡;现在列出二元一次方程:
100X+Y=60;
200X+Y=200;
我们用代入消元法,将第一句变形 Y= 60 -100X;带入第二句:
200X + 60 - 100X = 200; X=1.4; 将X带入第一句,得出Y= -80;
这样子就在200的时候输入和输出对应上了。
就相当于把<50的设为0 , 把50-<100的设为0-<50 , 把100-<200的设为60-<200 ;
把最后一段的压力100个点平均分散给140个点,是不是AD值平均分散法。还可以将这个总数个数拉长或缩短,视情况而定。