智能车竞赛技术报告 | 节能信标组 - 宿迁学院 - MAkkaPakka
时间:2022-09-05 01:30:01
队伍名称:Makka Pakka???
参赛队员:王妙龙 吴子敬 李翔
带队教师:倪亚南 袁静???
第一章 引言
??全全国大学生智能汽车竞赛是一项旨在加强学生实践、创新能力和培养团队精神的创意技术竞赛。到目前为止,已成功举办了15届。在继承和总结前15届比赛实践的基础上,竞赛组委会努力拓展新的竞赛内涵,设计新的竞赛内容,创造新的竞赛模式,进一步发展围绕比赛产生的竞赛生态环境。
??实现比赛"立足培养,注重参与,鼓励探索,追求卓越"的指导思想,竞赛内容设置需要能够面向高校学生和教学内容,同时又能够兼顾当今时代科技发展的新趋势。比赛形式包括两类和创意比赛。比赛包括不同的组别,难度适合不同年级的大学生。在竞赛的基础上,适当增加挑战,形成创意竞赛的内容,适合一些有条件、有能力的本科生、大专生和研究生参加创意竞赛。
??节能信标组是第十六届智能汽车竞赛的新组。其主要任务是从第一个信标开始接收电能,并自行启动到下一个信标。当模型运行到信标时,信标灯切换到下一个信标,但当地信标仍然发送无线电,直到模型离开当地信标灯,当地信标停止发送无线电,下一个信标灯开始发送无线信号。
??在本报告中,我们的小组详细阐述了我们的思想和创造力,具体体现在电路的创新设计和算法的独特想法上,通过介绍汽车设计和制造的整体思路、电路、算法、调试和车辆参数,调试核心板和傻模块的具体参数也让我们付出了艰苦的努力。这份报告体现了我们的努力和智慧,是我们共同努力的结果。
?
第二章 机械设计
??机机械机构是车辆设计的主体框架,是智能车辆设计的基本组成部分。良好的机械结构设计可以使车辆在驾驶过程中更加稳定,有利于信标车辆的加速。
2.1智能汽车机械结构
2.1.1车模简介
??本次比赛由于节能信标组对车模没有限制,因此我们采用了龙邱的自制车模,整车为碳纤维三轮结构。
??车模底盘采用三角形设计,相对稳定。底盘采用碳纤维板,挖空了一些不相关的部件,减轻了整车的重量,使整车更轻、更节能。通过后轮的差速控制,可以控制整车的行驶速度和方向。钕磁铁放在底部灭灯。此外,我们将储电超级电容放在智能汽车的前端,提高了整车在高速行驶过程中的稳定性。
▲ 图2.1 智能车整体结构图
2.2传动部分
??我们用龙邱传动部分LQ25R8V6电机作为整车的驱动力,额定电压为5-8V,额定转速可达600RPM,它可以满足智能汽车的动力要求。电机用电机支架固定。通用轮安装在模具的前部,通过后轮的差速控制可以控制车辆的速度和方向,转向更灵活,也可以避免使用舵机增加功耗。
2.3传感器简介
2.3.1 使用编码器
??为实现对小车速度的闭环控制,我们采用龙邱512线,质量和体积都很小mini编码器准确反馈汽车的实时速度。编码器水平固定在电机一侧,通过传动轴连接。
2.3.2 选择摄像头
??有两种方法可以引导节能信标车灭灯。方案一是接收信标灯发射的高频无线功率信号(200kHz),确定信标灯的位置,智能汽车驱动信标灯完成灭灯任务,即电磁信号引导灭灯。方案二是通过相机检测灯发出的红光,处理光信号,排除杂光,确定灯的位置,完成灭灯任务,即光信号引导灭灯。我们小组采用方案二光信号引导灭灯。
??采用龙邱MT9V034系列摄像头具有自动曝光功能,成像角度广,驱动电压低(3).3V),并支持上位机实时查看和记录智能汽车驾驶过程中的相关数据。MT9V034摄像头模块具有近红外功能,可用于信标组比赛。
??另外,在实际使用过程中,我们发现MT9V034近红外功能不尽如人意,需要在摄像头内加红外遮光片。
▲ 图2.2 LQ_MT9V034MV2摄像头
▲ 图2.3摄像头参数
??安装过程中,镜头与垂直方向的夹角应为60-80°过高会产生不必要的杂光干扰,过低会使检测距离短。检测距离可以通过增加相机的高度来增加,而不会造成杂光干扰。
▲ 图2.4 摄像头安装
2.4 储能电容的选择
??储能电容器是节能信标车行驶过程中的电源。大电容器可以储存更多的电能,但同样的重量也会增加。因此,需要根据车辆的功耗和竞争任务选择合适规格的超级电容器。最后,通过实验室测量和技术水平的限制,我们使用了5个100nf并联电容组用作储能电容。
第三章 系统方案设计
3.1 系统总体方案的选择
??根据竞赛规则的相关规定,智能车系统采用英飞凌公司生产的自制车模TC以264微控制器为核心控制器ADS软件开发是在开发环境中进行的,车辆通过摄像头获取图像,通过图像处理得到车身与目标信标灯的左右偏差和距离。通过编码器测速模块检测速度;电机转速控制采用 PID 控制,通过 PWM 控制 驱动电路调整电机转速,完成智能车速的闭环控制。
3.2系统总体方案的设计
??根据上述系统方案,赛车包括五个模块:TC264主控模块、传感器模块、电源模块、电机驱动模块和速度检测模块。 如下:
??1. TC264 主控模块:作为整个智能汽车的大脑,电感传感器将被收集和编辑 根据控制算法做出控制决策,驱动电机完成智能车辆的信号 控制。
??2. 传感器模块:是智能车的眼睛,可以通过一定的前瞻性提前感觉 了解前方的轨道信息,为智能汽车的大脑做出决策提供必要的依据和足够的反向决策 应时间。
??3. 电源模块:为整个系统提供合适稳定的电源。
??4. 电机驱动模块:驱动电机完成智能汽车的加减速和差速角控制
5. 速度检测模块:检测反馈智能车后轮的转速,用于速度的闭环控制
第四章 电路设计说明
信标节能车电路部分主要的模块包括:单片机最小系统、电源模块、无线充电接收模块、驱动模块以及其他周边调试模块。各模块的总体设计原则是:内阻小, 功耗小,稳定可靠。但根据各模块的不同,又有不同的设计要求,本章对各个 模块的设计进行详细描述。
4.1 主控板、电源的硬件设计
本车模使用TC264为主控芯片,TC264智能车核心板,默认MCU型号为SAK-TC264D-40F200N BC,通过TC264丰富的片上资源以及电路板上的外围电路,可以对TC264处理器的性能资源以及主要外设进行评估和验证。另外,通过扩展接口,可以自行设计外围电路,验证TC264所提供的其它功能。
智能车的调试需要外设来操作、需要独立按键、OLED、编码器接口等。如下图3.1.1所示
各个模块都需要电源供电,一些需要3.3V供电,一些需要5V供电,由于赛车是超级电容作为电源,考虑到电容掉电比较快,使用 LM2575T将电源电容电压稳在5V,再通过LM39100将直流5V电压降为3.3V。该部分电路如下图3.1.2所示
▲ 图3.1.2电源电路图
4.2 充电电路
赛车在放上赛道前是需要将赛车上的电容电量放至0.1V以下,然后再放上赛道,智能车从赛场的信号灯罩下的发射源取电,取得的电储存在超级电容中,用于小车的供电,充电电路采用线圈配上相应的谐振电容再加上全桥整流电路如3.2.1所示
▲ 图3.2.1充电电路原理图
4.3 电机驱动电路
本系统中电机驱动模块为直流电机的驱动。车模行进的速度控制是通过直流电机的驱动完成的。如果电机的控制良好,那么车模的加速和制动能力会有显著的提高。经过考虑,我们最后使用的是DRV8701双路电机驱动模块。通过选用门极驱动芯片DRV8701E+ N-MOS管TPH1R403NL及周边电路完成驱动的搭建。在本系统的硬件设计方案中,驱动电路的电路原理图如下图3.3所示。
▲ 图3.3.1驱动原理图
第五章 智能车控制软件设计说明
5.1 总体框架
在智能车控制系统的软件设计中,程序的主流程是:摄像头通过中断采集程序对赛道信息进行采集,主程序在两次中断的间隙中完成对数据进行处理及计算并给出控制量,采样周期为 16.7ms。其中,主程序主要完成的任务是:单片机初始化、图像采集、图像二值化、信标位置提取、速度控制算法、差速控制算法。另外速度控制输出与pid算法放置定时中断里,更能实现对速度的实时控制。其控制流程如下所示:
5.2 一些算法
5.2.1 提取信标位置算法
一场图像中,当信标灯点亮时,在图像数据中便出现高于阈值的数据,记录高于阈值的数据所在的行数、列数及高于阈值的数据的总的行数R(最大行与最小行的差)、总的列数L(最大列与最小列的差),并将高于阈值(固定值)的数据所在的行数、列数分别相加获得总行数R0和总列数L0,用总行数R0除以总的行数R得到行数作为信标所在行,用总列数L0除以总的列数L得到列数作为信标所在列,从而获得信标的位置。
5.2.2 pid算法
PID 控制器系统原理框图如图所示:
▲ 图 5.7 PID 控制原理
简单说来, PID 控制器各个环节的作用如下:
- 比例环节:及时成比例地反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。
- 积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数,越大,积分作用越弱,反之则越强。
- 微分环节:能反映偏差信号的变化趋势(变化速率),并能在该偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。
数字 PID 控制算法通常分为位置式 PID 控制算法和增量式 PID 控制算法。位置式 PID 中,由于计算机输出的 u (k) 直接去控制执行机构(如阀门),u(k)的值和执行机构的位置。位置式 PID 控制算法的缺点是:由于全量输出, 所以每次输出均与过去的状态有关,计算时要对过去 e(k)进行累加,计算机工作量大;而且因为计算机输出的 u(k)对应的是执行机构的实际位置,如计算机出现故障,u(k)的大幅度变化,会引起执行机构位置的大幅度变化,不适合电机控制。因而产生了增量式 PID 控制的控制算法,所谓增量式 PID 是指数字控制器的输出只是控制量的增量。本小组采用增量式 PID 对电机进行控制。
- 增量式 PID 具有以下优点:
由于计算机输出增量,所以误动作时影响小,必要时可用逻辑判断的方法关掉。
手动/自动切换时冲击小,便于实现无扰动切换。此外,当计算机发生故障时, 由于输出通道或执行装置具有信号的锁存作用,故能保持原值。
算式中不需要累加。控制增量Δu(k)的确定仅与最近 k 次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。但增量式 PID 也有其不足之处:积分截断效应大,有静态误差;溢出的影响大。使用时,常选择带死区、积分分离等改进 PID 控制算法。
第六章 总结
6.1模型车技术参数说明
-
赛组 节能信标
-
车模尺寸(长宽高)(mm) 320185390
-
电路功耗(VA) 9.48
-
电路电容总量(μF) 3334
-
传感器种类及个数 摄像头×1 光电编码器×2
-
伺服电机 0
6.2总结
自报名参加“恩智浦”杯智能汽车竞赛以来,我们小组成员从查找资料、设计机构、组装车模、编写程序、画 PCB 板一步一步地有序相互分工配合进行,最后终于完成了目标,定下了现在这个只属于我们自己的设计方案。
准备初始阶段,由于自身知识积累不够,我们遇到很多困难,也犯了不少错误。由于是第一次参加智能车比赛,对于智能车的软件,硬件的了解都十分欠缺。经过一段时间的学习,我们初步掌握了智能车大体的结构。在智能车大赛中,侥幸进入了国赛,得到了与全国各地的大神交流学习的机会。这离不开在调试的几个月中那些支持我们的人。是您们让我们有了前进的动力,是您们让我们的制作调试过程有了保障。
在经历了近半年的努力后,我们终于完成了智能车的制作,实现了预定目标。首先,感谢主办方和恩智浦公司为我们提供的展示平台。感谢上海理工大学为我们提供的资金和场地支持。感谢哈尔滨工程大学的志愿者们辛劳的为我们的比赛提供帮助。同时,我们真诚的向在这个过程中帮助过我们的老师同学表示深深地谢意。正是有你们的支持和帮助,使我们能够顺利完成比赛。谢谢!最后,感谢本次大赛的各位评委在百忙中抽出宝贵时间,对我们的技术方案进行评定并提出宝贵的改进建议。
附录
■ 部分源代码
i
nt core0_main (void) { char txt[16]; uint16 cnt=0; // 关闭CPU总中断 IfxCpu_disableInterrupts(); // 关闭看门狗,如果不设置看门狗喂狗需要关闭 IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword()); IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword()); // 读取总线频率 g_AppCpu0.info.pllFreq = IfxScuCcu_getPllFrequency(); g_AppCpu0.info.cpuFreq = IfxScuCcu_getCpuFrequency(IfxCpu_getCoreIndex()); g_AppCpu0.info.sysFreq = IfxScuCcu_getSpbFrequency(); g_AppCpu0.info.stmFreq = IfxStm_getFrequency(&MODULE_STM0); TFTSPI_Init(0); // TFT1.8初始化0:横屏 1:竖屏 TFTSPI_CLS(u16BLACK); // 清屏 // 按键初始化 GPIO_KEY_Init(); // LED灯所用P10.6和P10.5初始化 GPIO_LED_Init(); // 串口P14.0管脚输出,P14.1输入,波特率115200 UART_InitConfig(UART0_RX_P14_1,UART0_TX_P14_0, 115200); // 开启CPU总中断 IfxCpu_enableInterrupts(); // 通知CPU1,CPU0初始化完成 IfxCpu_releaseMutex(&mutexCpu0InitIsOk); // 切记CPU0,CPU1...不可以同时开启屏幕显示,否则冲突不显示 mutexCpu0TFTIsOk=0;// CPU1: 0占用/1释放 TFT while (1) //主循环 { if(KEY_Read(KEY1)) { if(batchargeflg) { TFTSPI_P8X16Str(0, 2, "Charging...", u16WHITE, u16RED); // 充电提示 sprintf(txt, "Bat:%02d.%02dV ", batvoltage / 100, batvoltage % 100);// x/4095*3.3*100*5.7 TFTSPI_P8X16Str(0, 3, txt, u16WHITE, u16BLUE); // 字符串显示当前电池电压 sprintf(txt, "WLV:%02d.0%02dV ", chargevoltage / 100, chargevoltage % 100);// x/4095*3.3*100*11 TFTSPI_P8X16Str(0, 4, txt, u16WHITE, u16BLUE); // 字符串显示充电电压 } else { sprintf(txt, "Lamp(%02d,%03d)", sumhang, sumlie); TFTSPI_P8X16Str(0, 0, txt, u16RED, u16BLUE); // 显示红外信标灯在屏幕上的偏差参数 sprintf(txt, "%02d.%02dV %02d.%02dV", batvoltage / 100, batvoltage % 100, chargevoltage / 100, chargevoltage % 100); TFTSPI_P8X16Str(0, 3, txt, u16WHITE, u16BLUE); // 字符串显示当前电池电压 // 电机和舵机参数显示 sprintf(txt, "M2:%04d, M1:%04d ", MotorDuty2, MotorDuty1); TFTSPI_P8X16Str(0, 4, txt, u16RED, u16BLUE); // 电机1-2数值 sprintf(txt, "E2:%04d, E1:%04d ", ECPULSE2, ECPULSE1); TFTSPI_P8X16Str(0, 5, txt, u16RED, u16BLUE); // 编码器1-2数值 sprintf(txt, "EPT:%03f :%03f", EPTDPULSE2,EPTDPULSE1); TFTSPI_P8X16Str(0, 6, txt, u16RED, u16BLUE); // IR灯的均值和期望差值 } } else //按下K0键 { TFTSPI_ShowBeacon();//显示赛道画面 sprintf(txt, "thrd:%03d :%03d", Threshold,lqv); TFTSPI_P6X8Str(0, 15, txt, u16RED, u16BLUE); // 编码器1-2数值 } if(++cnt>1) // 防止按键太快 { cnt=0; if(0==KEY_Read(KEY0)) { if(lqv>1) lqv--; // 阈值减一 } else if(0==KEY_Read(KEY2)) { if(lqv<100) lqv++; // 阈值加一 } } //delayms(2); } } int core1_main (void) { // 开启CPU总中断 IfxCpu_enableInterrupts(); // 关闭看门狗 IfxScuWdt_disableCpuWatchdog (IfxScuWdt_getCpuWatchdogPassword ()); // 等待CPU0 初始化完成 while(!IfxCpu_acquireMutex(&mutexCpu0InitIsOk)); PIN_InitConfig(BEEPp, PIN_MODE_OUTPUT, 1); // 蜂鸣器初始化,响起 //电感及电池电压 ADC采集初始化 ADC_InitConfig(ADC7, 10000);//初始化 如果使用龙邱母板 则测分压后的电池电压,具体可以看母板原理图 ADC_InitConfig(ADC0, 10000);//初始化 如果使用龙邱母板 则测分压后的电池电压,具体可以看母板原理图 // 切记CPU0,CPU1...不可以同时开启屏幕显示,否则冲突不显示 mutexCpu0TFTIsOk=1; // CPU1: 0占用/1释放 TFT // //电机、舵机,编码器初始化 MotorInit(); // 电机 ServoInit(); // 舵机 EncInit(); // 编码器 PidInit(&pid_param_t2,20.00,0.03,0.000000000000000000000000000000000001); //pid算法初始化 PidInit(&pid_param_t1,20.00,0.03,0.000000000000000000000000000000000001); //需要用到不止一个pid算法 PidInit(&pid_param_t3,0.04,0.0,0.000000000000000000001); /*MotorDuty1 = MtTargetDuty; MotorDuty2 = MtTargetDuty;*/ // 摄像头初始化 CAMERA_Init(50); // 定时器初始化,原始中断函数在CCU6.C中 */ CCU6_InitConfig(CCU61, CCU6_Channel0, 50000);// 50ms MotorCtrl(0,0); // 关闭电机,开始充电 PIN_Write(BEEPp,0); // 蜂鸣器关闭,开始确认是否需要充电 while(batvoltage<900)// 充电没有达到10V以上,则等待充电 { // 无线充电接收电压检测,确认是否可以进入充电状态 chargevoltage= ADC_ReadAverage(ADC0,50) * 22 / 25; // x/4095*3.3*100*11 // 电池电压检测 batvoltage= ADC_ReadAverage(ADC7,50) * 11 / 25; // x/4095*3.3*100*5.7 EPTDPULSE2=0; EPTDPULSE1=0; if(KEY_Read(KEY1)==0) break; } LQ_STM_Timer (); batchargeflg=0; while(1)//主循环 { // 切记CPU0,CPU1...不可以同时开启屏幕显示,否则冲突不显示 LED_Ctrl(LED1, RVS); // LED闪烁 指示程序运行状态 if (Camera_Flag == 2) // 20ms检测一次,灯闪是100ms { Camera_Flag = 0; // 清除摄像头采集完成标志位 如果不清除,则不会再次采集数据 Get_Use_Image(); // 取出赛道及显示所需图像数据 Get_Bin_Image(1); // 转换为01格式数据,0、1原图;2、3边沿提取 Seek_Beacon(); // 通过边沿提取找到灯的重心点 if(dotcnt) // 发现有白斑 { { if(sumhang<100){ EP=7;if(batvoltage<650)EP=5;pid_param_t1.kp=20;pid_param_t2.kp=28;} if(sumhang>85){ EP=2;pid_param_t1.kp=25;pid_param_t2.kp=30;}} error1=(float)(93-sumlie); EPTDPULSE2=EP+error1*0.09; EPTDPULSE1=EP-error1*0.09; beaconFlashCnt=0; } else // 没有发现有白斑 { beaconFlashCnt++; // 每次(20ms)没有发现灯则加1,2021取消闪烁检测 if(beaconFlashCnt<12) // 五次以上6*20=120ms没有发现灯,避开闪烁灭灯时间,则全速原地打转 // 双电机全速原地打转,寻找信标灯方位 { EPTDPULSE2=2; EPTDPULSE1=2; } else { EPTDPULSE2=2; EPTDPULSE1=-2; } } } // 检查电压 // 无线充电接收电压检测,确认是否可以进入充电状态 chargevoltage= ADC_ReadAverage(ADC0,50) * 22 / 25; // x/4095*3.3*100*11 // 电池电压检测 batvoltage= ADC_ReadAverage(ADC7,50) * 11 / 25; // x/4095*3.3*100*5.7 // 补充电操作 if((batvoltage<650)&&(chargevoltage>batvoltage)) // 电池电压低于6.5V且充电电压大约6.55V,则开始补充电 { batchargeflg=1;// 开始充电标志置1 MotorCtrl( 0 , 0 ); while((batvoltage<850)&&(chargevoltage>500)) // 充电没有达到8V以上,则等待充电 { EPTDPULSE2=0; EPTDPULSE1=0; // if(batvoltage<800) batchargeflg=1; // else batchargeflg=0; // 无线充电接收电压检测,确认是否可以进入充电状态 chargevoltage= ADC_ReadAverage(ADC0,50) * 22 / 25; // x/4095*3.3*100*11 // 电池电压检测 batvoltage= ADC_ReadAverage(ADC7,50) * 11 / 25; // x/4095*3.3*100*5.7 PIN_Reverse(BEEPp); // 蜂鸣器提示充电 delayms(10); } batchargeflg=0; // 充电结束标志清零 PIN_Write(BEEPp,0); // 补电结束,蜂鸣器关闭 元器件数据手册
、IC替代型号,打造电子元器件IC百科大全!