1、GP2Y0A21传感器说明书简
根据上述技术手册可分析得知,该款传感器信号输出类型为电压模拟量,且与测量距离的输出关系呈类反比的非线性关系。
测量距离为6CM左右时输出电压值最大,大致为3.1V;
测量距离在80CM左右时,输出变化已经很小了,大致0.5V附近。通过上述对数据手册的解读可知,理论应该显示的最大值为: int(1024 * 3.1 / 5) = 635
2、测量距离和电压的关系曲线拟合
(1)提取曲线,得到离散的坐标值(可以利用caxa软件或者是autocad软件跟踪草绘,,把直角坐标放到软件的坐标系原点,然后状态栏会实现显示鼠标的测量坐标值,而不用都标注这么麻烦。测试的时候,利用caxa2015软件,根据数据手册,利用样条曲线,描多个采样点,描线之后,利用坐标标注的自动列表功能,得到每个采样点的坐标值,为了和数据手册的坐标系数据一致,需要横轴和纵轴各自乘以一个放大或者缩放的系数,这个步骤,利用exexl得到,将自动列表的数据坐标,)
(2)将离散坐标值在matlab或者excel中拟合,得到曲线方程。
本例子,在excel中执行,在实际操作发现,caxa2015表格不能复制粘贴,需要自己打数据到excel中,然后根据缩放系数,进行修正,再选择数据,绘制图表,再添加趋势图,并且选择显示公式,此处,选择5阶方程作为拟合。得到公式:
y = -5.9768x5 + 59.457x4 - 229.9x3 + 435.8x2 - 419.25x + 186.03
约等于
Y=-6x5+59.46x4-230x3+435.8x2-419.25x+186.03
坐标x是电压,坐标y是距离,单位cm。
(3)当测量得到的数据,转换为电压值,然后用上面的公式进行计算,得到具体的距离值。
也可以利用查表算法
建立电压表格,距离表格,然后,利用分段式计算,将测量数据和数组数据对比,得到是具体电压数据的范围,得到电压区间之后,再根据表格,利用三段拟合式,算得实际的距离。
这种方法需要的计算量比较多,对于51单片机负担较大,因此利用stm32的时候,可以进行尝试。
本测试,采用是6项多项式拟合曲线,得到电压v和距离d的关系,
通过ad转换,距离和ad转换数值有关系,得到对应的电压vx,然后,根据多项式,算出对应的距离。
具体程序如下:
/*
Õâ¸ö³ÌÐò£¬ÊÊÓÃÓÚÏÄÆյĺìÍ⼤¹â²â¾à£¬±¾³ÌÐò
²âÁ¿¾àÀë²»ÄÜСÓÚ6cm¡£ÒòΪ¸ù¾ÝÊÖ²áÖÐ6cm³öµçѹ×î´ó£¬¸ù¾ÝÕâ¸öΪÆðµã½øÐÐÊý¾Ý²É¼¯µÄ¡£ËùÒÔ²»ÄÜСÓÚ6cm£¬
½¨ÒéÔÚ7cmÔ¶²âÁ¿£»
*/
//*******************************/
#include “STC15W4K.h”
#include “intrins.h”
#include “oled.h”
#include “AD_STC15.h”
//
//********º¯ÊýÉùÃ÷
void delay4us_t(int us);
void delay_20us();
/
void port_mode() // ¶Ë¿Úģʽ
{
P0M1=0x00; P0M0=0xff;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
}
void delay_tms(unsigned int ms0) //@11.0592MHz–11-190-766us;11-195–785us;20–x--1000
{ //
unsigned char i, j;
unsigned int tms;
for(tms=ms0;tms>0;tms–)
for(i=20;i>0;i–)
for(j=136;j>0;j–);
}
/********************************************************/
int main(void)
{
unsigned long int buff0=123;
double buf0;
double dis;
port_mode();
delay_tms(5);
OLED_Init(); //³õʼ»¯OLED
delay_tms(5);
OLED_Clear();
delay_tms(5);
ADC_Init();
delay_tms(5);
IE=0xa0;//ʹÄÜADCÖÐ¶Ï 1010 0000£»
OLED_ShowString(0,4, “Dis(cm)=”);
while(1) //³ÌÐòÑ»·
{
//IE=0x00;
buff0=ADC_Value(0);//ͨµÀ0
// AD²âÁ¿=1024µçѹ0.2
buf0=(double)buff05.2/1024;
//y = 4.77x6 - 55.061x5 + 256.49x4 - 619.69x3 + 830.43x2 - 609.93x + 219.99
dis=4.77buf0buf0buf0buf0buf0buf0+256.49buf0buf0buf0buf0-619.69buf0buf0buf0+830.43buf0buf0-609.93buf0+220.0-55.06buf0buf0buf0buf0buf0;
OLED_ShowFloatii(0,5,dis,32);
// IE=0xa0;
OLED_ShowNum(0,6,buff0,5,12);//ADÊý×ÖÁ¿
OLED_ShowFloatii(8,6,buf0,32); //Êý×ÖÁ¿×ª»»ÎªµçѹÁ¿ÏÔʾ
}
}
可以自己根据手册,再加上稳压基准电路,实际的数值,列表,拟合曲线。(自己计算,会准确多少???)