锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

智能车竞赛技术报告 | 专科基础组 - 哈尔滨铁道职业技术学院 - 智能车勇创协会

时间:2022-12-29 22:00:00 智能电容器实物

学 校:哈尔滨铁路职业技术学院
队伍名称:智能车勇创协会
参赛队员:刘宝、张聪策、薛闯
带队教师:崔妍、张晓萌

第一章


??为实现十六届全国大学生智能汽车竞赛"立足培养、重在参与、鼓励探索、追求卓越"指导思想和竞赛内容的设置需要能够面向大学生和教学内容,同时兼顾当今科技发展的新趋势。比赛形式包括两类:赛车比赛和创意比赛。赛车比赛包括不同的组,难度适合不同年级的大学生。

??在本次比赛中,哈尔滨铁路职业技术学院是一个专业的基础小组,通过感应轨道中央交变电流产生的磁场,制造一辆四轮智能汽车。模型由竞赛组委会提供C型车模,并根据官方要求,使用STC具体型号为系列单片机STC8G2K64S4.车模由安装在车头的工字电感和电容组成LC谐振电路为电源信号20KHz满足谐振要求,获得最大感应电压,用于程序调制,实现智能汽车的自动跟踪功能。智能汽车通过编写和优化算法,包括岔路口、坡道、环岛、十字路口等不同的轨道元素。旨在在有限的时间(三分钟)内获得更高的比赛分数。

第二章 计算任务和要求


??第二组是专业基础组,具体设计任务是设计智能跟踪汽车感应轨道交变电流磁场变化,通过程序控制实现汽车从规定区域,沿规定轨道,在满足准确性要求的基础上,组委会要求赛道任务点尽可能多:出发-1分、叉口-5分、坡道-5分、环岛-5分、十字路口-2分。

??具体要求包括:

??1、必须使用竞赛秘书处指定的竞赛车模套件
??2.使用指定类型的单片机(STC系列);
??3.除单片机最小系统外,所有电路模块均独立设计制造,包括接收轨道磁场变化并放大的运输模块;采集

??用单片机处理轨道信号,并做出控制舵机角度、改变小车速度等相应指令的主板模块;响应主板控制,驱动智能汽车电机MOS驱动模块。

第三章 总体方案设计和方案选择


3.1 硬件部分

??可分为运放模块、主板模块、驱动模块三个模块。

3.1.1运放模块

??赛道信号源20kHz交流电流,汽车可以通过收集和分析导线产生的电磁场来判断当前位置,从而控制汽车沿预定的轨道方向完成比赛。根据麦克斯韦电磁场理论,交变电流周围会产生交变电磁场。电线周围的电磁场按一定规律分布,轨道宽度远小于电磁波的波长λ,电磁场辐射能量很小,所以能感知到的电磁波能量很小。因此,我们可以近似地将导线周围变化的磁场视为缓变磁场。根据这一特点,我们可以采集磁场周围的磁场分布、强度和方向来判断测试点与导线之间的距离,从而得到车辆在轨道上的位置。

??我们用的是LC谐振电路通过不断调整电感电容值,感应周围轨道磁场的变化,使电路在20kHz实现谐振,获得最大的感应电压。为了更好地测量轨道在不同方向的感应磁场大小,我们采用一左一右对称LC谐振电路,并通过横杆支撑在智能汽车上方,如图所示:

▲ 图3.1 对称式LC谐振电路

??根据对基本设计原理的分析,我们知道在通电导线周围有一个定期的磁场,使用电感作为检测导线的传感器。如果在通电导线两侧对称水平放置一对感应线圈,可以获得一对感应磁场的感应电势,从而获得磁场的强度。此时,感应磁场信号仍然相对较小,因此使用OPA2350放大信号,并将滑动变阻器分离到输出端,以调整放大后的信号值;因为它是一对对称的感应线圈,一对感应线圈理论上是相同的。

??当对称的一对感应线圈检测到不同的感应电势时,比较感应线圈检测到的电势。根据基本设计原理,检测到较大值的感应线圈更接近导线,车辆位置偏移。应控制两台电机的转速,导致差速,达到转弯效果,使车辆位置回到轨道中间。上述直接转弯,以及更复杂的指令和轨道元素判断,应移交主板模块。

3.1.2主板模块

??主板上配备有STC8G2K64S4单片机最小系统,与运输模块和双片机MOS驱动模块连接的插头;为了更好地调试后续程序,主板还配备了LCD1602液晶显示屏用于显示从运输反馈到单片机的左右电感值。设计师通过观察电感值的大小来比较左右电感值的差异,并使用它PID(比例-微分-积分)算法控制汽车左侧/右转以及加/减速,具体执行时将通过单片机I/O控制舵机的角度和输出PWM波控制电机转速。

3.1.3驱动模块

??其主要功能是响应主板控制,驱动智能汽车电机MOS驱动模块HIP4082 H桥式驱动模块为双侧电机提供稳定动力,保证汽车稳定直行。设计采用左右对称模式,目的是确保左右轮转速尽可能一致。

3.2 软件部分

??此系统采用STC8G2K64S4单片机,根据硬件连接,通过相应的程序完成信号数据和分析,然后控制汽车的运行状态,具体分为:

  • 跟踪模块程序

??通过LC由谐振电路组成的传感器获取轨道信息,并输给单片机,然后通过特定算法实现相应的功能;

??通过编写程序控制两台电机的的转速和舵机的角度,实现前进、后退、左转、右转、停车等功能。完成这些基本功能后,根据实际轨道情况编写的复杂程序,驱动汽车通过口、岛屿和坡道。

第四章 路板与智能车组装


font face="黑体" color="#7a37ab">4.1 PCB绘制

  在分析整个智能车所需模块后,我们将整个电路划分为三块板,包括运放电路、主板电路以及双MOS驱动电路,PCB绘制所使用的软件为Altium Designer21,队员在PCB过程中购买相关书籍以及观看网课进行自学。绘制PCB主要分为以下四个文件:原理图库(.SchLib)、原理图(.SchDoc)、PCB库(.PcbLib)、PCB图(.PcbDoc),并用工程文件(PrjPcb)将各文件关联起来;其中,原理图库是采用几何方法绘制元器件模型,其目的是直观的显示元器件的重要信息,如:引脚、位号、名称等;

▲ 图4.1 电路原理图库

  原理图是调用原理图库中的模型,实现各元器件之间的电器连接;

▲ 图4.2 电路原理图库电路原理图

  PCB库是将元器件与其实际所需的封装一一对应;

▲ 图4.3 电路原理图库电路原理图电路PCB库

  PCB图是绘制实际打板所需的电路工艺图,其中包括所有元器件对应的封装与布局,以及绘制电路走线,实现与原理图相对应的电器连接功能。

▲ 图4.4 电路原理图库电路原理图电路PCB库电路PCB图

  PCB布线出于对电路性能的考虑,对线宽,各器件间距等有特殊要求,出于篇幅考虑,此处不予赘述

4.2 PCB打板

  绘制好PCB后,下一步是将其发给板厂打板。在这个步骤之前,我们还需生成打板所需的gerber文件,也就是制造输出以及装配输出;在这个过程中,除了可以生成CAM文件包用于打板之外,还可以生成ASM文件用于装配以及生成BOM报表用于采购。

▲ 4.5 PCB打板所需文件

  目前国内常见的PCB板厂有:嘉立创、凡亿PCB等等,其提供的服务除打板之外还包括SMT贴片,本次智能车比赛我们选取的方式是自行购买零件,手动焊接的方式。

4.3 PCB贴片与焊接

  本次采用手工焊接方式,使用焊锡与恒温电烙铁进行贴片操作,其缺点是焊点大小不一,焊接时间长短不一,电路性能可能不稳定;优点是节约成本,以及锻炼我们的动手实践能力,学习一项新技能。

▲ 图4.6 PCB贴片与焊接

4.4 智能车组装

  本次比赛我们采用c型车模,通过打孔与使用铜柱将电路板固定。

▲ 图4.7 车模打孔与固定

  电路板之间通过排线相连,电池通过绷带固定在车模底座。

▲ 图4.7 车模打孔与固定图4.8 各模块之间的连接

  组装后的智能车模长300mm180mm135mm,电机型号为DC7.2V最大功率19.25w,舵机型号FutabaS3010,车模整体都不含有无线通讯模块,符合比赛要求。采集信号部分为两套对称安装的LC谐振电路,即在20kHz交流信号下谐振,从而感应到最大电压值。

 

第五章 设赛道与程序调试


5.1 铺设赛道

  如图,分别是本次比赛我们自主设计的赛道CAD图以及铺设的实物图,赛道中间为漆包线,采用20kHz赛道信号发生源驱动。赛道规格与标准符合赛事要求。

▲ 图5.1 赛道CAD图与实物图

5.2 程序编写与调试

  程序编写方面我们使用软件为MDK Keil Version5,这是一个专门使用单片机语言进行编程的软件,烧录软件使用的是STC-isp系列软件,可以与单片机很好的进行串口通信,单片机为STC8G2K64S4,频率选为33.1776MHz。下面将展示涉及控制小车循迹的PID算法以及环岛、岔口等关键算法。

▲ 图5.2 PID算法图

  其中,适当增大P的值可以使得小车转弯更加灵敏,减小P的值或增大D的值可以减小小车直道上的抖动。下图是小车启动以及优化小车在直路弯路上的行驶,主要思想如下:在小车发车从车库出发时,需要控制小车在一定时间内(startnum<652)不受循迹控制,即先直行,再右转,进入赛道,最后发车结束才控制小车进行循迹(LeftRightSub=LeftRightSub5)。考虑到小车在直路上需要较快速度以便通过坡道和节约时间,并且在弯道时需控制低俗以防止小车冲出赛道,因此,单纯的给小车提速或降速效果都不会很理想,对此我们自主研发了一种差速算法,即在小车正常循迹的前提下,通过比较左右磁场感应值,其差值在一定范围,即认为是直路,此时给两侧电机一个较大的PWM波获得较快速度;而当差值大于一定范围时即认定小车即将进入弯道,此时小车减速。此时整体效果就是小车在直路加速,弯路减速,以保证小车的最佳运行状态。

▲ 图5.3 小车出库与小车速度优化程序

  • 岔口实现与坡道实现

  岔口元素的要求为,当小车行驶至岔口之前电感感应到特定值时,需强制小车打角进行左转右转,即两圈中需分别走岔口左右路;环岛元素的要求为当感应值到特定值时,小车先直走一段,进而右转进入环岛,同时不能再次判断进入环岛条件(否则小车会在环岛一直转圈)。由于在之前的比赛要求中具有停车环节,因此赛道上具有磁铁元素,即我们可以通过干簧管来监测磁铁信号,来判断小车运行的圈数,进而判断该圈小车在岔口需左转或右转,同时对环岛计时参数以及判断进入环岛的参数进行复位,来保证程序的正常运行。但随着赛制的改变,磁铁与干簧管不再被允许,对圈数的判断需要另寻他路,比如采用摄像头、红外感应之类的模块。

  以上方法无一不使得电路变得纷繁复杂,虽然在设计程序的逻辑上进行了简化,但是硬件上增大了很大的困难。为了解决这个问题,我们经过了长时间的思考,最终提出一种互补式的闭环判断方法:即每经过岔口的判定条件时,使得环岛参数与使能复位;在每经过环岛时,计圈数加一,并采用除2取余法if(圈数%2)进行判断当圈数为0、2、4、6。。。时为0(非)执行左转,当圈数为1、3、5、7。。。时为1(真)直行右转,从而实现了环岛元素,交替通过岔口元素。其源程序如下图:

▲ 图5.4 岔口程序图

▲ 图5.4 岔口程序图图5.5 环岛程序图

  在整个程序都写好之后,后续工作便是根据实际赛道,小车行驶过程中的表现,对各个赛道元素的判断阈值、小车舵机打角大小、打角时间、小车车速等进行不断的更改和优化。在实际操作过程中,我们发现小车在直路运行时两个轮子速度不一样,与采用对称双MOS即两侧车轮同PWM值同速的预期不一样,我们对此问题进行了解决,解决方法为使用电流表测试小车正常直路行驶时驱动处的电压大小,如图:

▲ 图5.4 岔口程序图图5.5 环岛程序图图5.6 小车不同车轮速度校正

  通过不断的更改调试赋予两侧电机不同的PWM波,控制得到两侧电机相近的电压值,此时小车两轮车速校正完毕,可以在直路上平稳行驶。

  后续我们还针对小车转弯时不够稳定容易冲出赛道的问题提出一种解决方法,即:小车左转时(左电感值>右电感值)右轮速度>左轮速度,小车右转时左轮速度>右轮速度,结果使得小车在弯道同样有较好的表现,至此小车成功的实现了全部赛道元素,并且直道/弯道全部优化完毕。

 

第六章 结与致谢


  尔滨铁道职业技术学院此次完成的智能循迹小车的设计需要涉及到许多方面,在小车设计过程中,传感器的设计和单片机的处理关系至关重要。本技术报告主要阐述了一种以STC8G2K64S4单片机为控制核心、电磁传感器为基础的智能小车循迹系统。在小车中,单片机根据传感器输出信号来控制小车的行驶路径,减小了车的抖动,实现了小车能够平稳地循着轨迹正常行驶并完成多项任务点(三岔路口、坡道、环岛、十字路口等)的功能。经过多次试验并在参赛中结果显示,本次智能循迹小车具有较强的运行能力,并能够很好的控制小车的运行过程。

  通过此次制作并完成智能循迹小车收获颇丰,首先感谢崔妍、张筱萌两位指导老师提供给我们本次学习及成长的机会,在我们遇到困难时提供给我们很多建议,让我们少走了很多弯路,她们对科研上负责认真的态度值得我们学习。宝贵的是我们学会了如何在团队中和组员进行高效的沟通,同时极大丰富了实践经验及动手能力,为以后的学习打下坚实的基础。本次的智能循迹小车从无到有,虽然在整个过程中出现了很多各种各样的意外,但在小组成员通力合作最终解决一个又一个的问题,并一直把它作为一件神圣的事情去做,最后取得了成绩,让我们受益终生。

 

考文献与资料


  [1] 蒋宗祥, 林乐彬, 彭晓旭,等. 采用模糊控制的电磁循迹三轮小车[J]. 科技创新与生产力, 2018, 000(007)😛.93-96.
[2] 肖玉萌, 程登良, 杨文俊. 电磁循迹智能小车设计[J]. 湖北汽车工业学院学报, 35(1):6.
[3] 秦磊, 王佳宇, 黄名扬,等. 基于单片机的电磁循迹智能车系统的设计[J]. 物联网技术, 2018.
[4] 罗茜, 唐鼎明. 基于电感的智能小车电磁循迹方案[J]. 中小企业管理与科技(17):2.
[5] 程智. 自动电磁循迹小车设计与实现[J]. 电子测试, 2019, 000(009):11-13.
[6] 周新,《从零开始学Altium Designer电路设计与PCB制板》,2020.

■ 附录A 程序源代码

主程序#include "include.h"
//11.0592M PWM0C = 0x02FE;0x02AB右极限,0x029E为左极限  13
//33.1776M PWM0C = 0x08DF;0x07E2右极限,0x07BC为左极限,0x07CF为中值 38
u16 xdata ad0=0,ad5=0,startnum=0,startflag=1;//定义电感数据变量
void  main(void)
{ 
        
P0M0 = 0x00; 
P0M1 = 0x00; 
P1M0 = 0x00; 
P1M1 = 0x00; 
P2M0 = 0x00; 
P2M1 = 0x00; 
P3M0 = 0x00; 
P3M1 = 0x00; 
P4M0 = 0x00; 
P4M1 = 0x00; 
P5M0 = 0x00; 
P5M1 = 0x00;  
Uart1_Init_Timer1_P30P31(115200); //串口初始化
/*舵机初始化*/
PWMSET = 0x01;
P_SW2 |= 0x80;  
PWM0CKS |= 0x10;
PWM0C = 0x047F;  
AUXR |= 0x04; 
T2L = 0xE0;
T2H = 0xFE;
AUXR |= 0x10;
PWM07T1= 0x0000; 
PWM07T2= 0x0370;
PWM07CR= 0x80; 
P_SW2 = 0x00; 
PWMCFG01 = 0x01;  
/*舵机初始化结束*/
/*电机初始化*/
PWM2_Init(0, 10000, 1150);//初始化PWM2的0脚,即P20为PWM,频率10000hz,占空比为1500/FTM0_PRECISON
PWM2_Init(1, 10000, 0);//初始化PWM2的1脚,即P21为PWM,频率10000hz,占空比为0/FTM0_PRECISON
PWM2_Init(2, 10000, 1900);//初始化PWM2的2脚,即P22为PWM,频率10000hz,占空比为1500/FTM0_PRECISON
PWM2_Init(3, 10000, 0);//初始化PWM2的3脚,即P23为PWM,频率10000hz,占空比为0/FTM0_PRECISON
/*电机初始化结束*/
OLED_Init();  //OLED初始化
/*ADC初始化*/
ADC_Channel_Init(1);//选择 ADC1 , 即 P11
ADC_Channel_Init(2);//选择 ADC2 , 即 P12 
ADC_Init();//初始化10位 ADC 
/*ADC初始化结束*/ 
EA = 1; //开总中断
while(1)
{ 
         
ad0 = ADC_convert(2);//采集AD,电感0的数据
ad5 = ADC_convert(1);//采集AD,电感5的数据  
//Delay_ms(100);///延时100ms
LED_PrintValueUI(5, 1, ad0);  //显示屏显示电感0的数据
LED_PrintValueUI(5, 3, ad5);//显示屏显示电感5的数据
LED_PrintValueF(5, 5,LeftRightSub,3);  //显示屏显示控制偏差
Data_processing();  //电感数据处理
if(startflag==1)
{ 
        
startnum++;
}
if(startnum<430)
{ 
        
P_SW2 |= 0x80;
PWM07T2=0x0370; 
P_SW2 &= 0x7F; //改变舵机占空比  
}
if((startnum>430)&&(startnum<650))
{ 
        
  P_SW2 |= 0x80;
  PWM07T2=0x0382; 
P_SW2 &= 0x7F; //改变舵机占空比  
}
if((startnum>650)&&(startnum<652))
{ 
        
 startflag=0;
 startnum=0;
}
if(startflag==0)
{ 
        
  Steer_Pd();  //舵机控制
if(ad0<300&&ad0>200&&ad5<300&&ad5>200)//岔口前减速
{ 
        
PWM2_SetDuty(2,0);
PWM2_SetDuty(0,0);
}
else
{ 
        
 if(((ad0-ad5<118)||(ad5-ad0<118)))//左右电感差在一定范围内,认为是直道,加速
{ 
        
PWM2_SetDuty(0,1650);//1.21
PWM2_SetDuty(2,2400);//1.23
}
else
{ 
        
if(ad0>ad5)//left
{ 
        
PWM2_SetDuty(2,1650);
PWM2_SetDuty(0,800);
}
if(ad0<ad5)//right
{ 
        
PWM2_SetDuty(2,1550);
PWM2_SetDuty(0,1300);
}
//PWM2_SetDuty(2,1550);左右轮一样快0.65
//PWM2_SetDuty(0,900);
}
}
}
}
}
赛道元素实现与舵机电机控制程序
#include "Conduct.h"
uint16 xdata ad0_0=0,ad0_1=0,ad0_2=0,ad0_3=0,ad0_4=0,ad0_5=0,ad5_0=0,ad5_1=0,ad5_2=0,ad5_3=0,ad5_4=0,ad5_5=0;
uint8 xdata LYH0=0,LYH1=0,LYH2=0,RYH0=0,RYH1=0,RYH2=0,chakou=0,chakoudelay=0;
float xdata LeftRightSub=0,LeftRightSub5=0;
int xdata cha;
int xdata huandaotime=0,huandaoEN=1,chakouflag=0;
void Data_processing(void)
{ 
        
//存储6次数据量
ad0_5=ad0_4;ad5_5=ad5_4;
ad0_4=ad0_3;ad5_4=ad5_3;  
ad0_3=ad0_2;ad5_3=ad5_2;
ad0_2=ad0_1;ad5_2=ad5_1;  
ad0_1=ad0_0;ad5_1=ad5_0;
ad0_0=ad0;ad5_0=ad5;
if(ad0-ad5>5000) //判断是不是负数
cha=-(~(ad0-ad5)+1);//负数取补码
else cha=ad0-ad5;
LeftRightSub5=(float)cha/(ad0+ad5);  //求偏差值
LeftRightSub=LeftRightSub5;
//岔口
if(ad0<300&&ad0>200&&ad5<300&&ad5>200&&(ad0_0<ad0_2)&&(ad0_1<ad0_3)&&(ad5_0<ad5_2)&&(ad5_1<ad5_3))
{ 
        
chakou=1;
huandaoEN=1;
}
if(chakou==1)
{ 
        
chakoudelay++;
}
if((!(chakouflag%2))&&(chakou==1))
{ 
        
LeftRightSub= 50;  //ad0_0*0.0096;
}
if((chakouflag%2)&&(chakou==1))
{ 
        
LeftRightSub= -50;  //ad0_0*(-0.0096);
}
if(ad0>300&&ad5>300)
chakou=0;
if((ad0<100||ad5<100)&&(chakoudelay>130))
{ 
        
chakou=0;
chakoudelay=0;
LeftRightSub=LeftRightSub5;
}
//右圆环&&ad5_0>ad0_0&&(ad0_0>ad0_2)&&(ad0_1>ad0_3)&&(ad5_0>ad5_2)&&(ad5_1>ad5_3)
if(ad5_0>600&&ad0_0>600&&huandaoEN)//ad5_0>820&&ad0_0>750
{ 
        
RYH0=1;
}
if(RYH0==1)
{ 
        
huandaotime++;
}
if((RYH0==1)&&(huandaotime<225))
{ 
        
LeftRightSub=0.14;
}
if((RYH0==1)&&(huandaotime>225)&&(huandaotime<410))
{ 
        
LeftRightSub=-50;
}
 if((RYH0==1)&&(huandaotime>410))
{ 
        
LeftRightSub=LeftRightSub5;
huandaoEN=0;
RYH0=0;
huandaotime=0;
chakouflag++;
}
if((huandaoEN==0))
{ 
        
if(ad5>900&&ad0>400)
LeftRightSub=0;
else 
LeftRightSub=LeftRightSub5;
}
}
int xdata Steer_Left=0x035C; //舵机打角左极限
int xdata Steer_Right=0x0382;//舵机打角右极限
int xdata Steer_Middle=0x0370;  //舵机打角中值
//舵机PD参数
float Steer_Kp=-30,Steer_Kd=0;  //如果舵机弯转不过来可以增加P值,如果直道抖动厉害,可以适当增加D值或者减小P值
int xdata Steer_Angle;
float xdata Out_Kp,Out_Kd;
 

相关文章