ATmage32L驱动的智能寻迹小车设计与红外循迹原理

需积分: 20 4 下载量 68 浏览量 更新于2024-07-29 收藏 560KB DOC 举报
自动寻迹小车设计原理是一种智能化的机器人技术,主要应用于教育、科研和娱乐等领域,通过集成多种电子元件来实现车辆的自主导航和路径追踪。本文的核心组件包括: 1. **硬件结构**: - 车架:采用有机玻璃作为轻便且坚固的基础,提供了车辆的整体支撑。 - 控制核心:ATmage32L单片机,作为系统的运算和决策中心,负责接收指令、处理数据并驱动其他部件。 - 电动驱动系统:直流电机用于提供动力,驱动小车移动;可能还包括伺服电机,确保精确的转向控制。 - 光电传感器:RPR220型光电对管用于检测白色导轨线,通过光线反射判断小车与轨迹的距离,实现寻迹功能。 - 电源与电源电路:保证系统的稳定供电,可能包含电池和稳压电路。 - 其他电路:可能存在红外火焰传感器,用于辅助路径追踪,例如识别火源或热源。 2. **系统工作流程**: - MCUs(微控制器)通过IO口(输入/输出接口)控制小车的前进、后退、左转和右转,实现了车辆的基本行驶功能。 - 小车通过红外探测法来感知白线,即利用红外光在白色导轨上的高反射率与黑色地面形成对比,以此判断行驶方向。 - 在遇到弯路时,通过程序逻辑判断,使小车能够灵活地按照预设路径拐弯。 - 完成任务后,车辆能自动返回起点,并具备倒车入库的能力。 3. **附加功能**: - 语音广播系统(如Sunplus SCM)用于实时传达车辆状态信息,增强人机交互。 - 数据传输模块(DF)用于远程监控和控制,将车辆状态发送至远程控制台。 - 显示设备:OCMJ4X8CLCD显示屏幕和两个控制键,用于启动和操作小车。 4. **设计目标**: - 安全启动:确保小车在预设的安全区域内开始运行。 - 自主导航:根据预定路线自动行驶,识别直线和弯路,执行灵活的移动和转向。 - 自动返回:任务完成后,能自动回到初始位置并入库。 自动寻迹小车设计原理着重于硬件配置、传感器技术、控制系统和智能决策,旨在打造一个能在指定环境中自主导航的高效、可靠的机器人平台。
2014-03-24 上传
#include #include "qudong.h" #include "duankou.h" #include "lcd1602.h" #include "celv.h" #define uchar unsigned char #define uint unsigned int #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //****************************************************************************** //全局变量 //****************************************************************************** float voltage=6.0; //实际电压值 int RS1=100; int LS1=100; int RS0=100; int LS0=100; char heixian=0x03; //不等于0x03表示检测到信号,等于0x03表示没检测到信号 char ji_shu=0; //表示第几次检测到黑线 char youxinhao=0; //=1表示检测到信号,=0表示没有检测到信号 uint total_time_count=0;//时间相关变量 uint start_low_speed=0; uint end_low_speed=0; uint end_all=0; uint start_all=0; uint LM_cap_new=0; //测速相关变量 uint LM_cap_old=0; uint LM_cap_count=0; uint LM_mai_kuai=0; float real_LM_speed=0.0; float top_speed=0; float average_speed=0; uint RM_cap_new=0; uint RM_cap_old=0; uint RM_cap_count=0; uint RM_mai_kuai=0; float real_RM_speed=0.0; float total_distance=0; //测量值转化为实际值相关变量 float dis1=0; float dis0=0; uint low_speed_time=0; uint total_time=0; //****************************************************************************** //系统时钟初始化,aclk=32768k,mclk=XT2,SMCLK = XT2。 //****************************************************************************** void Init_clock(void) { DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO数字晶振最高频率 BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL选择高速晶振最高频率 BCSCTL2 |=SELM_2+SELS; //MCLK=8M,SMCLK = XT2,系统主时钟选择高速晶振 do //清除振荡器失效标志,等振荡器稳定。 { IFG1&=~OFIFG; for(unsigned int i=0XFF;i>0;i--); } while((IFG1&OFIFG)!=0); } #pragma vector=ADC_VECTOR //ADC12 interrupt service routine __interrupt void ADC12_ISR (void) { if(ADC12MEM0<2816)P6OUT&=~BIT3; //欠压指示灯亮 else P6OUT|=BIT3; } //*************************