避障机器人红外测距模块设计与调试一、实训目的1、了解模数转换器的基本功能;2、了解红外测距模块的基本功能及技术规格;3、掌握红外传感器工作原理。二、实训设备1硬件:HOST机一台、基于机器人项目驱动的嵌入式教学实训平台一套;2软件:SiliconlabIDE开发环境、调试器。三、实训原理红外距离感应模块是专为机器人设计的测障传感器,如图所示。它通过发射红外线并测量红外线被反射的强度来输出反映和物体距离的电压信号,有效距离10~80厘米。红外测距传感器红外测距功能编号名称/功能1VCC电源线2GND地线3Vo输出信号线4发射管5接收管红外传感器基于三角测量原理。红外发射器按照一定的角度发射红外光束,当遇到物体以后,光束会反射回来,如图所示。反射回来的红外光线被CCD检测器检测到以后,会获得一个偏移值L,利用三角关系,在知道了发射角度a,偏移距L,中心矩X,以及滤镜的焦距f以后,传感器到物体的距离D就可以通过几何关系计算出来了。四、实训步骤1、正确连接PC机、调试器和嵌入式教学实训平台,连接红外测距模块;2、打开嵌入式教学实训平台电源;3、打开工程,编译、链接、进入调试、运行程序,观察lcd屏上显示的测量值,移动机器人,观察lcd屏上测量值的变化(思考测量值的变化的原理)4、测量传感器的输出特性曲线。在实验中需要中的函数及功能说明函数名:unsignedcharGetIR_Distance(unsignedcharchannle)函数说明:获取红外传感器感测距离函数名:voidADC_PortInit()函数说明:ADC引脚初始化函数名:voidADC_Init()函数说明:ADC初始化函数名:unsignedcharADC_DistanceGet(unsignedcharAD_port)函数说明:获取AD_port端口红外传感器的值函数名:voidADC_ConvertStart()函数说明:AD转换启动函数名:voidAD_PortSelection(AD_port)函数说明:AD转换端口配置函数名:unsignedintADC_AvrDataGet(unsignedint*AD_data)函数说明:获取平均值函数名:doubleSensorDistanceProcess(doublex)函数说明:ADC值距离转换#includeSensor_AD.h#defineAD_NUM10/*************************************************************//!函数名:unsignedcharGetIR_Distance(unsignedcharchannle)//!函数说明:获取红外传感器感测距离*************************************************************/unsignedcharGetIR_Distance(unsignedcharchannle){xdataunsignedintucIRDisValue=0;if(channle0||channle10){return0;}ucIRDisValue=ADC_DistanceGet(channle);ucIRDisValue=((int)SensorDistanceProcess(ucIRDisValue));if(ucIRDisValue255){ucIRDisValue=255;}return(char)ucIRDisValue;}unsignedintGetIRDistance(unsignedcharchannle){xdataunsignedintucIRDisValue=0;if(channle0||channle10){return0;}ucIRDisValue=ADC_DistanceGet(channle);returnucIRDisValue;}/*************************************************************//!函数名:unsignedcharGetIRCol(unsignedcharAD_Point)//!函数说明:获取灰度传感器感测灰度值*************************************************************/unsignedintGetIRCol(unsignedcharad_channle){xdataunsignedintucGreyValue;if(ad_channle0||ad_channle9){return0;}ucGreyValue=ADC_DistanceGet(ad_channle);return(ucGreyValue);}/************************************************************//!函数名:voidADC_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*************************************************************/voidADC_PortInit(){unsignedcharSFRPAGE_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;}/*************************************************************//!函数名:voidADC_Init()//!函数说明:ADC初始化*************************************************************/voidADC_Init(){unsignedcharSFRPAGE_save=SFRPAGE;ADC_PortInit();SFRPAGE=CONFIG_PAGE;ADC0CN=0xC0;//跟踪模式,开启转换ADC0CF=(SYSCLOCK/3000000-1)3;ADC0CF&=~0x04;//右端对齐EIE1&=~0x08;//禁止ADC中断//AD0EN=1;REF0CN=0x08;SFRPAGE=SFRPAGE_save;}/*************************************************************//!函数名:unsignedcharADC_DistanceGet(unsignedcharAD_port)//!函数说明:获取AD_port端口红外传感器的值*************************************************************/unsignedintADC_DistanceGet(unsignedcharAD_port){xdataunsignedcharAD_counter=0;xdataunsignedchari=0;xdataunsignedcharadc0_h,adc0_l;xdataunsignedintad_test;xdataunsignedintADC_DataStore[10]={0,0,0,0,0,0,0,0,0,0};if(AD_port0x0A){return0xFF;}AD_PortSelection(AD_port);ADC_ConvertStart();for(AD_counter=0;AD_counter10;AD_counter++){while(!AD0INT);adc0_h=ADC0H;adc0_h&=0x03;adc0_l=ADC0L;ADC_DataStore[AD_counter]=((unsignedint)(adc0_h)8)+(unsignedint)adc0_l;//ADC_DataStore[AD_counter]=(unsignedint)(adc0_l);AD0INT=0;ADC_ConvertStart();i++;}//ADC_FlagClear();//ADC_DataStore[0]=ADC_AvrDataGet(ADC_DataStore);//returnSensorData[AD_port][0];ad_test=ADC_AvrDataGet(ADC_DataStore);//ad_test++;//return(ADC_AvrDataGet(ADC_DataStore));return(ad_test);}/*************************************************************//!函数名:voidADC_ConvertStart()//!函数说明:AD转换启动*************************************************************/voidADC_ConvertStart(){unsignedcharSFRPAGE_save=SFRPAGE;SFRPAGE=CONFIG_PAGE;AD0EN=1;//EA=0;AD0INT=0;AD0BUSY=1;SFRPAGE=SFRPAGE_save;}/*************************************************************//!函数名:voidAD_PortSelection(AD_port)//!函数说明:AD转换端口配置*************************************************************/voidAD_PortSelection(unsignedcharport_unm){unsignedcharSFRPAGE_save=SFRPAGE;SFRPAGE=CONFIG_PAGE;switch(port_unm){case0x01:AMX0P=0x07;break;case0x02:AMX0P=0x08;break;case0x03:A