当前位置:首页 > 避障机器人红外测距模块设计与调试讲解
避障机器人红外测距模块设计与调试
一、实训目的
1、了解模数转换器的基本功能;
2、了解红外测距模块的基本功能及技术规格; 3、掌握红外传感器工作原理。
二、实训设备
1 硬件:HOST机一台、基于机器人项目驱动的嵌入式教学实训平台一套; 2 软件:Siliconlab IDE开发环境、调试器。
三、实训原理
红外距离感应模块是专为机器人设计的测障传感器,如图所示。它通过发射红外线并测量红外线被反射的强度来输出反映和物体距离的电压信号,有效距离 10~80厘米。
红外测距传感器
红外测距功能
编号 1 2 名称/功能 VCC 电源线 GND 地线 3 4 5 Vo 输出信号线 发射管 接收管 红外传感器基于三角测量原理。红外发射器按照一定的角度发射红外光束,当遇到物体以后,光束会反射回来,如图所示。反射回来的红外光线被CCD检测器检测到以后,会获得一个偏移值L,利用三角关系,在知道了发射角度a,偏移距L,中心矩X,以及滤镜的焦距f以后,传感器到物体的距离D就可以通过几何关系计算出来了。
四、实训步骤
1、正确连接PC 机、调试器和嵌入式教学实训平台,连接红外测距模块; 2、打开嵌入式教学实训平台电源;
3、打开工程,编译、链接、进入调试、运行程序,观察lcd屏上显示的测量值,移动机器人,观察lcd屏上测量值的变化(思考测量值的变化的原理) 4、测量传感器的输出特性曲线。 在实验中需要中的函数及功能说明
函数名:unsigned char GetIR_Distance(unsigned char channle) 函数说明:获取红外传感器感测距离 函数名:void ADC_PortInit() 函数说明:ADC引脚初始化 函数名:void ADC_Init() 函数说明:ADC初始化
函数名:unsigned char ADC_DistanceGet(unsigned char AD_port) 函数说明:获取AD_port端口红外传感器的值 函数名:void ADC_ConvertStart() 函数说明:AD转换启动
函数名:void AD_PortSelection(AD_port) 函数说明:AD转换端口配置
函数名:unsigned int ADC_AvrDataGet(unsigned int *AD_data) 函数说明:获取平均值
函数名:double SensorDistanceProcess(double x ) 函数说明:ADC值距离转换
#include \
#define AD_NUM 10
/************************************************************* //! 函数名:unsigned char GetIR_Distance(unsigned char channle) //! 函数说明:获取红外传感器感测距离
*************************************************************/
unsigned char GetIR_Distance(unsigned char channle) { xdata unsigned int ucIRDisValue = 0; if(channle<0 || channle>10) { return 0; } ucIRDisValue = ADC_DistanceGet(channle); ucIRDisValue = ((int)SensorDistanceProcess(ucIRDisValue)); if(ucIRDisValue>255) { ucIRDisValue = 255; }
return (char)ucIRDisValue; }
unsigned int GetIRDistance(unsigned char channle) { xdata unsigned int ucIRDisValue = 0; if(channle<0 || channle>10) { return 0; } ucIRDisValue = ADC_DistanceGet(channle); return ucIRDisValue; }
/************************************************************* //! 函数名:unsigned char GetIRCol(unsigned char AD_Point) //! 函数说明:获取灰度传感器感测灰度值
*************************************************************/ unsigned int GetIRCol(unsigned char ad_channle) { xdata unsigned int ucGreyValue; if(ad_channle<0 || ad_channle>9) { return 0; } ucGreyValue = ADC_DistanceGet(ad_channle); return (ucGreyValue); }
/************************************************************ //! 函数名:void ADC_PortInit() //! 函数说明:ADC引脚初始化
//!---------------------------------------------------------- //! 引脚图:
//!----------------------------------------------------------
//! 引脚 端口 AMX0P //!
//! AD0--------------P1.7--------------0x07 //! AD1--------------P2.0--------------0x08 //! AD2--------------P2.1--------------0x09 //! AD3--------------P2.2--------------0x0A //! AD4--------------P2.3--------------0x0B //! AD5--------------P2.4--------------0x0C //! AD6--------------P2.5--------------0x0D //! AD7--------------P2.6--------------0x0E //! AD8--------------P2.7--------------0x0F //! AD9--------------P3.0--------------0x10
*************************************************************/ void ADC_PortInit() { unsigned char SFRPAGE_save = SFRPAGE; SFRPAGE = CONFIG_PAGE; //当有语音的时候,P1口不能AD初始化 P1MDIN &= ~0x80; //P1.7模拟输入 P1SKIP |= 0x80; //交叉开关跳过模拟引脚 P2MDIN = 0x00; //P2模拟输入 P2SKIP = 0xFF; //交叉开关跳过模拟引脚 //P3MDIN &= ~0x01; //P3.0模拟输入
//P3SKIP |= 0x01; //交叉开关跳过模拟引脚 XBR1 = 0x40; //交叉开关使能 SFRPAGE = SFRPAGE_save; }
/*************************************************************
共分享92篇相关文档