1、北京科技大学一队技术报告第一届“飞思卡尔”杯全国大学生智能汽车邀请赛技 术 报 告 学 校:北京科技大学队伍名称:北京科技大学一队参赛队员:肖玮 艾宁 谭启寅带队教师:刘立关于技术报告和研究论文使用授权的说明 本人完全了解第一届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。参赛队员签名: 带队教师签名: 日 期: 引言首届飞思卡尔杯全国大学生智能汽车竞赛在清华大学的承办下终于落
2、户中国,本届大赛采用邀请赛的方式,邀请了国内具有控制科学与工程学科博士授予点高校(含港澳)50余所,我们北京科技大学作为参赛方,有幸参加了此次“飞思卡尔智能汽车邀请赛”。这份技术报告中,我们小组通过对整体方案、电路、算法、调试、车辆参数的介绍,详尽地阐述了我们的思想和创意,具体表现在电路的创新设计,以及算法方面的独特想法,而对单片机具体参数的调试也让我们付出了艰辛的劳动。这份报告凝聚着我们的心血和智慧,是我们共同努力后的成果。在准备比赛的过程中,我们小组成员涉猎控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,这次磨练对我们的知识融合和实践动手能力的培养有极大的推动作用,在此首
3、先要感谢清华大学,感谢他们将这项很有意义的科技竞赛引入中国;更要感谢北京科技大学相关学院对此次比赛的关注及投入,我们能有今天这样的成果离不开学院的大力支持及指导老师悉心的教导;还要感谢的是和我们一起协作的队员们,协助,互促,共勉使我们能够走到今天。第一章、方案设计系统采用主办方提供的飞思卡尔16位微控制器MC9S12DB128作为核心控制单元,信号由安装在车前部的光电传感器采集,经过选频,滤波电路传入MCU,MCU对信号进行处理后,由PWM发生模块发出三路PWM波,分别对转向主舵机,电机,伺服电机进行控制,完成智能车的转向,前进,制动的功能。在智能车后轮上安有光电编码器,采集关于车轮转速的脉冲
4、信号,经由MCU进行PID计算后自动调节对电机的PWM波的占空比,控制车速度。图1 系统的总体控制框图第二章、机械部分我们对机械结构的要求是:简单而高效。我们在不断的尝试后确定了以下的设计方案: 图2.1 智能车器件布局图2.1 传感器的设计安装为实现自动行驶中黑色标识线的跟踪,在车体前部安装了一排光电检测装置来判断车体相对于黑线的位置,作为反馈信号提供给控制器;控制器再据此来调整左、右轮转速,使得车体处于黑线正中行进,传感器排列方式见图2.2。比赛的地面是白色的,为了尽可能避免比赛场地的灯光等影响,我们选择的光电传感器是用可见光做光源,对于白色地面和黑线的反射率有明显的区别。传感器排布我们选
5、择主体为“一”字形排布的方法,共用10个传感器,两两距离如图2.2所示。图2.2 传感器布局图实物如图2.3所示。图2.3 传感器成品示意图2.2 制动舵机传动机构设计车以高速进入弯道时容易冲出赛道, PID调速装置与33886的反向制动虽然可以使速度降下来,但还是不理想,所以我们用一个伺服电机进行刹车,如图2.4所示。图2.4 伺服电机位置示意图2.3 光电编码器的安装在车的调试过程中,由于电源等原因,车的实际速度与程序所给的值往往有区别,于是,我们采用了光电编码器。光电编码器的安装如图2.5。通过光电编码器,程序可以调整电机的PWM波来控制车速。图2.5 光电编码器位置示意图2.4 系统电
6、路板的固定和连接在电路板的安装这部分,我们考虑到结构的稳定性,以及规则中对车辆尺寸的限制,最终决定采用高架、立体的搭接方法,用支架把主控板固定在电池正上方,并在底盘的空余地方安放了一个输入参数用的小键盘,这种布局可以在高效利用空间的同时,保证车辆重心不会很高,行驶时更稳定。图2.6电路板的固定及安装第三章、电路设计说明要实现我们的控制思想,硬件设计要满足以下要求:1、满足我们所需要的单片机控制系统。2、满足我们信息采集所需要的各种接口。3、保证我们数据传输时,传输通道的通畅。4、保证我们控制软件做小的改动的情况下,硬件部作改动就可以满足要求,即我们硬件的通用性。5、满足智能车的所有驱动电路。单
7、片机的控制对象最终的都是电机,舵机等机械结构,他们要运动起来的所需的能量,不是单片机系统所能提供的,必须要有外部驱动电路,驱动电路要能够可靠的工作,要有与单片机系统可以相互连接的接口。3.1 主控板的设计3.1.1 电源管理模块图3.1 电源管理模块原理图电源由7.2V电池提供,分别经过以下途径对其它模块进行供电:a经过稳压芯片2940-5稳压后,输出5V电压以驱动单片机工作。b接入33886驱动模块,以对电机进行驱动。c接入传感器,对传感器供电。d接入转向主舵机与伺服电机,驱动舵机进行转向及制动工作。f接入风扇,对33886芯片进行散热。3.1.2 电机驱动模块图3.2 电机驱动模块原理图电
8、机驱动采用主办方提供的33886作为驱动芯片, MCU通过IN1引脚输入PWM波,以调节33886的DNC口的输出电压,调节电机转速的快慢,并且在IN2口输入电压以调节电机的反转和制动功能。3.1.3 控制模块图3.3 控制模块原理图控制模块仅由S12构成, PORTA口作为光电传感器信号的输入口,PORTB口作为键盘驱动口,PWM7和PWM5作为控制电机与舵机的PWM波输出口。3.1.4 接口模块图3.4 接口模块原理图接口模块的作用即外部设备单片机的接口,分别有电机接口,转向主舵机接口,伺服电机接口,光电编码器接口,电源接口。3.1.5 信号采集模块从简洁的设计角度,我们直接从微控制器的电
9、源线上串联上限流电阻,再和光电传感串联使用。限流电阻既在光电传感器检测时起到了上拉电阻的作用。和微控制器共地,便可以省去了光电耦合器,简化了电路结构。图3.5 信号采集模块原理图3.2 传感器电路设计说明作为智能车的“眼睛”,光电传感器对车辆行驶状态的影响很大,经过多次试验,我们设计出一套高效,可行的方案。图3.6 传感器电路原理图在一个高频信号发生器的作用下,产生一路高低频交变的信号电流,然后通过一个三极管放大后供给两路LED灯发光,并用两个电位器分别控制LED灯的光强,最后用一个与信号发生器频率同步的接收管接收光信号,并反馈给单片机。在回路中,我们还添加了另一路LED发光二极管,用来实时检
10、测传感器的工作情况。实际操作过程中,只要发射灯和接收管间距适当,并且离地高度不大时,可以满足智能车循线的需要。第四章、智能车控制软件设计说明智能小车的控制软件采用模块化的程序结构。从结构上看,系统程序主要包括一个主体循环程序,增量式PID速度控制程序,中断服务程序,循线控制算法程序,速度控制算法程序以及其他一些控制程序。涉及到的单片机硬件资源如表4.1所示。表4.1 控制模块说明程序实现的功能使用的模块电机速度控制PWM发生模块舵机转角控制PWM发生模块PID反馈脉冲计数定时器模块,脉冲累加器人机交互SCI串口通信光电传感器信号处理普通I/O端口调试信息记录EETS2K模块4.1 主程序流程图
11、主程序流程图如图4.1所示。系统首先对设备进行初始化,然后选择进入参数修改程序。参数设定完之后打开中断,最后循环执行位置速度控制程序。图4.1 主程序流程图4.2 程序的初始化初始化部分包括参数的读取、PID初始化、定时器和脉冲计数器的初始化、I/O端口的初始化、PWM控制器的初始化和键盘显示控制器7279的初始化。图4.2 初始化程序流程图4.3 位置速度控制程序首先读取前方传感器组的状态来判断赛车和黑线的位置关系,通过该位置关系给出相应的转向舵机的转角和电机的转速。具体程序流程图如图。图4.3 位置速度控制程序4.4 中断处理程序中断处理程序每20毫秒执行一次,中断处理函数的主要目的是定时
12、读取脉冲计数器的值并把该值反馈给PID控制程序,然后调用PID控制程序。图4.4 给出了程序流程图。图4.4 中断处理程序4.5 PID控制程序系统采用增量式的速度PID,具体流程图如图4.5 。图4.5 PID控制程序第五章、开发工具、制作、安装、调试过程说明5.1 开发工具程序的开发是在组委会提供的CodeWarrior IDE下进行的,包括源程序的编写、编译和链接,并最终生成可执行文件。CodeWarrior for S12 是面向以HC1和S12为CPU的单片机嵌入式应用开发软件包。包括集成开发环境IDE、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编
13、器、链接器以及调试器。5.2 调试过程我们使用的单片机的FLASH中预先下载了监控程序,由CodeWarrior生成的可执行文件就是在这个监控程序的引导下,由计算机的串口下载到单片机的FLASH中的。因为这种方法既方便快捷又安全可靠,所以我们选用了这种方法而放弃了用S12特有的BDM方法进行程序的调试。具体的操作方法如下:从MC9SDG128开发板开始,将RS232-232串口线接到PC的串口COM1上。使用WINDOWS下的超级终端通信软件:执行“开始”|“程序”|“附件”|“通信”|“超级终端”命令。将COM1设置成9600波特率,8位、无效验位,1个停止位,不使用硬件流量控制。插上+5V
14、电源,按开发板上的复位按钮,在PC的超级终端上就会显示提示信息。在超级终端内键入E擦除单片机的FLASH,然后键入F将.S19文件下载到单片机的FLASH内。这样,我们编写的程序就能在单片机中运行了。需要说明的是,开机后4秒钟后才会自动运行用户程序。 第六章、模型车的主要技术参数说明6.1 智能车外形参数车长:36cm车宽:17cm车高:7cm车重:约1.5kg6.2 电路部分参数我们小组所改造的智能车采用一块比赛标准7.2V电池供电,电路中共有 16个电容,容量总计142.099F。当模型车全功率开动时,功耗约为50W 。6.3 除了车模原有的驱动电机、舵机之外伺服电机数量 除了车模原有的驱
15、动电机、舵机之外使用了1个伺服电机。6.4 传感器种类及个数我们的智能车上使用光电振荡传感器,由一个振荡管发出高频信号,LED灯就会以很高频率闪烁,再使用配套的接收管接收信号反馈给单片机。我们共使用10个传感器。结论自三月初报名参加“飞思卡尔”杯智能车邀请赛以来,我们小组成员查找资料,设计机构,组装车模,编写程序,分析问题,最后终于完成了最初目标,定下了现在这个方案。在此份技术报告中,我们主要介绍了准备比赛时的基本思路,包括机械,电路,以及最重要的控制算法的创新思想。在机械方面,我们分析了W型,A型,V型等排布方法,考虑到程序的稳定性、简便性,我们最后敲定了一字形排布,并通过反复实践决定了传感
16、器的数量和位置。在电路方面,我们以模块形式分类,在电源管理,电机驱动,接口,控制,信号采集,传感器这六个模块分别设计,在查找资料的基础上各准备了几套方案;然后我们分别实验,最后以报告中所提到的形式决定了我们最终的电路图。在算法方面,我们使用C语言编程,利用比赛推荐的开发工具调试程序,经过小组成员不断讨论、改进,终于设计出一套比较通用的,稳定的程序。在这套算法中,我们结合路况调整车速,做到直线加速,弯道减速,保证在最短时间跑完全程。现在,面对即将到来的大赛,在历时近五个月的充分准备之后,我们有信心在比赛中取得优异成绩。也许我们的知识还不够丰富,考虑问题也不够全面,但是这份技术报告作为我们五个月辛
17、勤汗水来的结晶,凝聚着我们小组每个人的心血和智慧,随着它的诞生,这份经验将永伴我们一生,成为我们最珍贵的回忆。参考文献1 邵贝贝. 嵌入式实时操作系统LCOS-(第2版)M. 北京清华大学出版社20042 邵贝贝. 单片机嵌入式应用的在线开发方法M北京清华大学出版社20043 王晓明. 电动机的单片机控制M北京. 北京航空航天大学出版社2002 4 臧杰,阎岩. 汽车构造M. 北京. 机械工业出版社2005 5 安鹏,马伟S12单片机模块应用及程序调试J. 电子产品世界. 2006第211期 162-1636 童诗白,华成英模拟电子技术基础M北京. 高等教育出版社2000 9 沈长生常用电子元
18、器件使用一读通M北京. 人民邮电出版社2004 10 宗光华机器人的创意设计与实践M北京. 北京航空航天大学出版社2004 11 张伟等Protel DXP高级应用M北京. 人民邮电出版社2002 12 张文春. 汽车理论M北京机械工业出版社2005 附录源程序:main.c#include /* common defines and macros */#include /* derivative information */#include 7279.h#define ERR_OK 1#define ERR_BUSY 2#define ERR_NOTAVAIL 3#define ERR_RA
19、NGE 4#define EEPROMStart 0x0400#define EEPROMEnd 0x1000 #define MASS_ERASE 0x41#define ERASECMD 0x40 #define PROGCMD 0x20 #define SizeMsg 24 /has been changed #define ERROR 0xFF #define NOERROR 0x0uint a,b,c;unsigned int write_data14;unsigned int chuanganqi_data14;/初始化:void EepromInit(void)/INITEE=1
20、7; /asm nop;/MISC=1;ECLKDIV = 94;/擦写:unsigned char EepromErase(unsigned int *pAddress, unsigned char size)if(ECLKDIV_EDIVLD = 1) if(ESTAT_ACCERR = 0) & (ESTAT_PVIOL = 0) while(size) if(ESTAT_CBEIF = 1) *pAddress = 0xFFFF; pAddress += 2; ECMD =ERASECMD; ESTAT_CBEIF = 1; if(ESTAT_ACCERR = 1) | (ESTAT_
21、PVIOL = 1) return ERROR;while (ESTAT_CCIF = 0); size-; return NOERROR; else return ERROR; else return ERROR; unsigned char EepromProgram(unsigned int *pAddress, unsigned int *pData, unsigned char size) if(ECLKDIV_EDIVLD = 1) if(ESTAT_ACCERR = 0) & (ESTAT_PVIOL = 0) while(size) if(ESTAT_CBEIF = 1) *p
22、Address+ = *pData+; ECMD = PROGCMD; ESTAT_CBEIF = 1; if(ESTAT_ACCERR = 1) | (ESTAT_PVIOL = 1) return ERROR;while (ESTAT_CCIF = 0); size-; return NOERROR; else return ERROR;else return ERROR;byte IEE1_GetWord(word Addr,word *Data) if (Addr (EEPROMEnd - 1) /* Is given address out of EEPROM area array
23、? */ return ERR_RANGE; /* If yes then error */ /* Store given address */ *Data = *(volatile word *) Addr; /* Return data from given address */ return ERR_OK; /* OK */static uint state;static uchar flag_zhidong;static uchar flag_kong;static byte flag;static byte key_numbers;static byte flag_change;st
24、atic uint pulse ;static uint speed1_2 ;static uint speed2_1 ;static uint speed23 ;static uint speed3 ;static uint speed34 ;static uint speed4 ;static uint speed45 ;static uint speed5 ;static uint speed0 ;static uint speed_zhidong4 ;static uint speed_zhidong5 ;static uint speed_zhidong0 ;#define turn
25、_right1 9223#define turn_right12 9363#define turn_right21 9363#define turn_right2 9502#define turn_right23 9602#define turn_right3 9702#define turn_right34 9789 #define turn_right4 9876#define turn_right45 10089#define turn_right5 10302#define turn_left1 8946#define turn_left12 8772#define turn_left
26、21 8772#define turn_left2 8598#define turn_left23 8474#define turn_left3 8349#define turn_left34 8240#define turn_left4 8131#define turn_left45 7865#define turn_left5 7598#define turn_mid 9100#define turn_left0 7300#define turn_right0 10600#define VV_KPVALUE 0#define VV_KIVALUE 60#define VV_KDVALUE
27、0#define VV_MAX 24000 /102410 使控制信号扩大,以使过渡平顺#define VV_MIN 0#define VV_DEADLINE 0X02 /速度PID,设置死区范围typedef struct PID /定义数法核心数据 signed int vi_Ref; /速度PID,速度设定值 signed int vi_FeedBack; /速度PID,速度反馈值 signed long vi_PreError; /速度PID,前一次,速度误差,vi_Ref - vi_FeedBack signed long vi_PreDerror; /速度PID,前一次,速度误差之
28、差,d_error-PreDerror; unsigned int v_Kp; /速度PID,Ka = Kp unsigned int v_Ki; /速度PID,Kb = Kp * ( T / Ti ) unsigned int v_Kd; /速度PID, signed long vl_PreU; /电机控制输出值 unsigned long vl_Pre; /电机控制输出值 PID;PID sPID; / PID Control Structurevoid delay_speed(void) sPID.vi_Ref=speed1_2 ;void delay_speed_left1(void)
29、 sPID.vi_Ref=speed1_2;void delay_speed_right1(void) sPID.vi_Ref=speed1_2 ;void delay_speed_right12(void) sPID.vi_Ref=speed1_2;void delay_speed_left12(void) sPID.vi_Ref=speed1_2;void delay_speed_left21(void) sPID.vi_Ref=speed1_2; void delay_speed_right21(void) sPID.vi_Ref=speed1_2;void delay_speed_left2(void) sPID.vi_Ref=speed1_2;void delay_speed_right2(void) sPID.vi_Ref=speed1_2;void delay_speed_right23(void) sPID.vi_Ref=speed23; void delay_speed_left23(void) sPID.vi_Ref=speed23; void delay_speed_left3(void) sPID.vi_Ref=speed3; void delay_speed_right3(void)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1