智能车竞赛技术报告 | 节能信标组 - 宿迁学院 - MAkkaPakka
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能车竞赛技术报告 | 节能信标组 - 宿迁学院 - MAkkaPakka相关的知识,希望对你有一定的参考价值。
队伍名称:Makka Pakka
参赛队员:王妙龙 吴子敬 李翔
带队教师:倪亚南 袁静
第一章 引言
全国大学生智能车竞赛是旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛,至今已经成功举办了十五届。在继承和总结前十五届比赛实践的基础上,竞赛组委会努力拓展新的竞赛内涵,设计新的竞赛内容,创造新的比赛模式,使得围绕该比赛所产生的竞赛生态环境得到进一步的发展。
为了实现竞赛的"立足培养、重在参与、鼓励探索、追求卓越"的指导思想,竞赛内容设置需要能够面向高校学生和教学内容,同时又能够兼顾当今时代科技发展的新趋势。比赛形式包括有竞速比赛与创意比赛两大类。竞速比赛中包含不同的组别,难度适合高校不同年级学生参赛。在竞速赛基础上,适当增加挑战性,形成创意比赛的内容,适合部分有条件、能力强的本科、专科生和研究生参加创意比赛。
节能信标组为第十六届智能车竞赛的新组别,其主要任务是比赛时,车模从第一个信标开始接受电能,自行启动去往下一个信标。当车模运行到信标上之后,信标的灯便切换到下一个信标,但本地的信标依然发送无线电能,直到车模离开本地的信标灯,本地信标停止发送无线电能,下一个信标灯开始发送无线信号。
在这份报告中,我们小组通过对小车设计制作整体思路、电路、算法、调试、车辆参数的介绍,详尽地阐述了我们的思想和创意,具体表现在电路的创新设计,以及算法方面的独特想法,而对核心板及傻充模块具体参数的调试也让我们付出了艰辛的劳动。这份报告凝聚着我们的心血和智慧,是我们共同努力后的成果。
第二章 机械设计
机械机构是整车设计的主体框架,是智能车设计的基础部分,好的机械结构设计可以让整车在行驶过程中更加平稳,有利于信标车的提速。
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 系统总体方案的的选定
根据竞赛规则相关规定,智能车系统采用自制车模,以英飞凌公司生产的TC264微控制器作为核心控制器,在ADS开发环境中进行软件开发,小车由摄像头获取图像,在通过图像处理得到当前车身与目标信标灯的左右偏差及距离。通过编码器测速模块来检测车速;电机转速控制采用 PID 控制,通过 PWM 控制 驱动电路调整电机的转速,完成智能车速度的闭环控制。
3.2系统总体方案的设计
根据以上系统方案设计,赛车共包括5大模块: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); // 补电结束,蜂鸣器关闭
}
if(chargevoltage<200) batchargeflg=0; // 充电结束标志清零
}
}
void STM1_CH1_IRQHandler(void)
{
/* 开启CPU中断 否则中断不可嵌套 以上是关于智能车竞赛技术报告 | 节能信标组 - 宿迁学院 - MAkkaPakka的主要内容,如果未能解决你的问题,请参考以下文章
智能车竞赛技术报告 | 节能信标组 - 洛阳理工学院 - Since 2021
智能车竞赛技术报告 | 节能信标组组 - 内蒙古大学创业学院 - 骄阳一队
智能车竞赛技术报告 | 节能信标组 - 北京科技大学节能信标组
智能车竞赛技术报告 | 节能信标组 - 合肥工业大学 - 烂虾队