我是靠谱客的博主 冷傲小虾米,最近开发中收集的这篇文章主要介绍智能车竞赛技术报告 | 双车接力组 - 大连海事大学 - 同舟拾贰队 第一章 方案设计 第二章 机械结构设计 第三章 电路设计说明 第四章 智能车控制软件设计说明 第五章 开发工具、制作、安装说明 第六章 结语及车模各项技术参数 第七章 参考文献 附录 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

学 校:大连海事大学
队伍名称:同舟拾贰队 
参赛队员:王彤    
刘原驰   
卓可越   
朱宇飞   
带队教师:薛征宇   
朱景伟   

 

第一章 案设计


  章将简要地介绍智能车系统总体设计思路,在后面的章节中将整个系统分为机械结构、控制模块、控制算法等三部分对智能车控制系统进行深入的介绍分析。

1.1系统总体方案的设计

  双车接力组智能车系统采用大赛组委会统一提供的D、F两款型车模,在原车模基础上加以改良设计。以上海灵动微电子股份有限公司生产的32位MCU MM32F3277G9P作为核心控制器,在KEIL开发环境中进行软件开发。三轮车主要采用摄像头,辅助采用电磁、陀螺仪传感器采集赛道信息输入到控制核心,用于赛车的运动控制决策。通过编码器测速模块来检测车速,并采用控制器的输入捕捉功能进行脉冲计数计算速度和路程;电机转速控制采用PID控制,通过 PWM 控制驱动电路调整电机的转速,完成智能车速度的闭环控制。直立车主要采用电磁,辅助采用陀螺仪传感采集赛道信息输入到控制核心,用于赛车的运动控制决策。传感器通过两电机差速、陀螺仪回值PID拟合控制转向。此外,还增加了键盘和OLED作为输入输出设备,便于智能车的参数调试。

▲ 图 1.1 三轮车整体布局

▲ 图 1.1 三轮车整体布局

▲ 图 1.1 三轮车整体布局图

▲ 图 1.1 三轮车整体布局图

1.2控制流程图

▲ 图 1.3 三轮车系统总体方框图

▲ 图 1.3 三轮车系统总体方框图

▲ 图 1.3 三轮车系统总体方框图

▲ 图 1.3 三轮车系统总体方框图

  直立赛车共包括七大模块:MM32F3277G9P主控模块、传感器模块、电源模块、电机驱动模块、速度检测模块、辅助调试模块。各模块的作用如下:MM32F3277G9P主控模块,将采集传感器的信号,根据控制算法做出决策,驱动直流电机完成对智能车的控制。传感器模块,可以通过一定的前瞻性,提前感知前方的赛道信息,为主控模块做出决策提供必要的依据和充足的反应时间。电源模块,为整个系统提供合适而又稳定的电源。电机驱动模块,驱动直流电机完成智能车的加减速控制和转向控制。速度检测模块,检测反馈智能车后轮的转速,用于速度的闭环控制。辅助调试模块主要用于智能车系统的功能调试、赛车状态监控等方面。

 

第二章 械结构设计


  能车运行的优良性离不开机械结构的功劳,重心位置的选取,各个传感器模块的位置都会成为智能车速度与稳定性的影响因素,所以强化智能车的机械结构是智能车设计的首要任务,并且在实际调试智能车的过程中,机械结构的优化也能解决很多软件算法无法解决的问题。

2.1 车模设计与搭建

2.1.1三轮车和直立车搭建

  车和直立车采用竞赛专用D车和F车车模,外加符合竞赛要求的一些零部件进行组装。将D车各个部件进行拼装,并装上直流电机和编码器,后车齿轮应与编码器所装配的齿轮高度啮合。再装配上电池固定零件,再利用螺丝螺母将自制PCB主板固定在电池支架上,增加尾部重力。再将驱动PCB版固定在车模中部并连接电机。车模前中部利用三通固定碳素杆,上面加装电磁。D车整车长不超300mm宽不超250mm高不超200mm。F车类似于D车将各个部件进行拼装,并且为了安装摄像头,在车中部打两个孔安装摄像头支架,车前部安装自制3D打印发球器,车中部安装三通固定碳杆,并在其上加装电感作为电磁传感器,车尾部安装有电池支架,其上利用铜柱和尼龙柱安装了主板和驱动板,主板上带有电池盒一遍安装两节18650锂电池,其下安装有电池保护板。F车整车长不超300mm宽不超250mm高不超200mm。

2.1.2直立车直立运行原理

  直立车要想实现直立运行,车的重心需尽量位于车轮部分,且直立姿态以车轮为轴的两部分力矩应尽量相等。所以我们安装部件时尽量靠近车轮轴线处,并且利用铜柱等负载平衡两侧力矩。

2.2 车模整体结构布局

  搭建完成的智能车如下图2.1、图2.2。

▲ 图 2.1 三轮车整体布局

▲ 图 2.1 三轮车整体布局

▲ 图

▲ 图

2.3 三轮发球装置设计

2.3.1 设计平台

  我们先后采用了PC端Tinkercad平台和平板端Shaper3D。这两个平台的资源都不是很多,但Shaper3D的操作比较简便,且功能较多,所以我们最终选择后者。

2.3.2 3D结构

  我们通过软件设计的发球装置如下图2.3

▲ 图2.3 三轮发球器3D模型

▲ 图2.3 三轮发球器3D模型

2.3.3 发球装置参数及创新点

  我们根据传球所用乒乓球直径40.00mm决定了传球装置凹槽直径为41.00mm,厚度为1.50mm,所有安装孔均符合M3尺寸孔洞。并且在实际调试过程中发现打印的3d器件硬度不够,于是在两侧加装护板,减小冲击对传球装置的损坏。顶部外壳设计既保证了万向轮的正常运作,还充当固定挡板,使电磁和摄像头的位置不会因撞击等意外而发生改变。

2.3.4 发球装置安装

  我们将发球装置安装在三轮全向轮所在位置,利用螺母进行固定。

2.4 三轮车散热片安装

  三轮运行过程中由于车模自身结构相较于直立更重,所以在整个系统运行过程中转向时会发生电机堵转现象,其结果会导致三轮电机发热严重,甚至影响到三轮车的正常运行。为了解决此问题,我们在电机上加装了散热片,如下图2.4所示。

▲ 图2.4散热片

▲ 图2.4散热片

2.5 三轮车摄像头安装

  三轮车摄像头碳杆底座采用可调节角度的两通器件,便于在实际调试中多次尝试找到最合适的摄像头角度。其结构如下图2.5.1、图2.5.2。

▲ 图2.5.1摄像头底座安装

▲ 图2.5.1摄像头底座安装

▲ 图2.5.2摄像头安装

▲ 图2.5.2摄像头安装

2.6 直立车直立姿态下速控与转向

2.6.1 直立条件下的速度控制

  车模运行速度是通过控制驱动PWM来控制车轮运动实现。
  电机的运动控制有三个作用:

  (1)通过电机加速度控制实现车模直立稳定。

  (2)通过电机速度控制,实现车模恒速运行和静止。虽然本届比赛规则中没有要求车模速度恒定,但是通过速度控制,可以提高车模稳定性。

  (3)通过电机差速控制车模方向。

2.6.2 直立条件下的方向控制

  直立车的方向控制采用并级PD控制。输入量为左右电感值的开方差比和,理想值为0。并用陀螺仪的Z轴角速度作为D输入,增加转向阻尼,减少震荡。当左电感值大于右电感值,说明左电感更靠近赛道中线,开方差比和算出负值,左电机加上方向环输出,右电机减去方向环输出从而实现转向的效果。

 

第三章 路设计说明


3.1 主板电路设计

3.1.1 直立车电源管理模块

  直立车主板降压电源和驱动供电芯片均为AS1015,新型高效率电源稳压芯片,内部采用P-MOSFET取代老式的LM2576LM2596LM2941等芯片。该BUCK电路通过反馈回路的电阻影响输出电压,所以采用电位器对该电源电路进行控制,而摄像头和陀螺仪供电采用两路LM1117-3V3进行降压。其余外设均用MM32F3277G9P核心板上所带的RT9013-3V3降压电源进行供电。主板电源管理模块原理图如下图3.1.1

▲ 图3.1.1 直立车电源管理模块

▲ 图3.1.1 直立车电源管理模块

3.1.2 三轮车车电源管理模块

  由于AS1015芯片停产,我们随后制作的三轮车电源管理芯片不得不发生变化,最终在多种电源芯片对比后采用了TPS5450DDAR芯片,该芯片效率较高,且具有输出功率大,电压纹波小等优点,我们的设计参考了其芯片手册上的典型电路,并采用电位器对反馈回路进行控制,从而影响输出电压。其余电源管理模块均与直立车类似。并且在此基础上加入磁珠来隔绝数字地和模拟地。电源管理模块如下图3.1.2

▲ 图3.1.2 三轮车电源管理模块

▲ 图3.1.2 三轮车电源管理模块

3.1.3 电磁采集信号放大模块

  我们的电磁采集信号放大模块位于主板侧边,其运放芯片采用OPA4377,该芯片是一款由TI公司出品的低噪声、低静态电流、精密汽车级别四运放。而高频检波的肖特基二极管我们使用了集成两个二极管的BAT54S。当输入信号的幅度落入“检波死区”之内,检波电路输出就几乎不发生变化,从而使得信号中的信息就被检波电路阻碍住,即使后面的电路和软件进行相应的放大和补偿,也无法回复被截掉的信号中的信息。因此,为了防止在赛道磁场强度减弱的情况下,赛道信息被“检波死区”截掉,就需要尽可能减小检波死区的大小。而经过比较,检波二极管采用BAT54S可以有效减小检波死区,并且其集成结构可以有效减小放大模块在主板所占面积,更加有效利用主板布局。其电磁采集信号放大模块如下图3.1.3

▲ 图3.1.3 电磁采集信号放大模块

▲ 图3.1.3 电磁采集信号放大模块

  补充说明,由于两车对电磁传感要求不同,所以三轮只采用一组模块,而直立采用两组。

3.2 驱动电路设计

  我们的驱动采用了hip4082芯片搭建的全桥驱动电路。MOS采用了IRLR7843 TRPBF N沟道MOS管,该MOS价格合适,且漏源电压可达30V,功率大,符合我们双车系统的要求。PWM信号的缓冲采用SN74HCT244DW芯片。其电路原理图如下图3.2。

▲ 图3.2 驱动电路

▲ 图3.2 驱动电路

3.3 传感器模块

3.3.1 摄像头模块

  我们摄像头采用总钻风MT90V34,主板接口参考其手册设计。需要注意的一点为8条数据线在PCB排布上长度要尽量相等,所以我们采用了蛇形布线。原理图接口如下图3.3.1。

▲ 图3.3.1 摄像头接口

▲ 图3.3.1 摄像头接口

3.3.2 LC谐振传感器

  该模块的设计是用LC并联焊接后用胶枪固定在碳杆上,然后使用漆包线焊接后连接到主板上,如下图3.3.2.1、图3.3.2.2。

▲ 图3.3.2.1 三轮车LC谐振传感器

▲ 图3.3.2.1 三轮车LC谐振传感器

▲ 图3.3.2.1 直立车LC谐振传感器

▲ 图3.3.2.1 直立车LC谐振传感器

3.3.3 编码器模块

  编码器模块接口参考手册设计,原理图如下图3.3.3。

▲ 图3.3.3 编码器接口

▲ 图3.3.3 编码器接口

3.3.4 zigbee模块

  双车接力组允许使用无线通信模块。我们进行多次对比,发现zigbee模块具有对接时间极短,传送稳定,配置方便等优点。所以,采用了DL-20模块进行通讯。模块如下图3.3.4。

▲ 图3.3.3 zigbee模块

▲ 图3.3.3 zigbee模块

3.3.5 陀螺仪模块

  陀螺仪接口设置在核心板下方,节省了主板空间,且能够保持与车模底盘平行。

3.3.6 人机交互模块

  我们在主板上增设按键和OLED作为人机交互模块,方便系统调试。如下图3.3.6.1、图3.3.6.2。

▲ 图3.3.6.1 OLED模块

▲ 图3.3.6.1 OLED模块

▲ 图3.3.6.2 按键模块

▲ 图3.3.6.2 按键模块

3.3.7 电池电压采集模块

  为了便于在智能车调试过程中对电池电量的掌控,我们采用单片机自带的ad进行电压采集,并通过人机交互模块反馈给我们。原理图如下图3.3.7。

▲ 图3.3.7 电池电压采集模块

▲ 图3.3.7 电池电压采集模块

 

第四章 能车控制软件设计说明


  效的软件程序是智能车快速平稳运行的基础。我们设计的智能车系统采用工字电感采集电磁数据、摄像头采集赛道方位数据。各个电感所采集到的 AD 值及 AD 值的处理为电磁数据处理的核心内容。摄像头拍摄到的图像经过大津法算动态阈值进行二值化后进一步处理图像及方位信息。在智能车控制上,我们采用了串级、并级PID等多套方案。配合使用理论计算和实际参数补偿的办法,使智能车能够稳定行驶。

4.1 底层初始化:

  我们编写了初始化函数 all_init():

void all_init()
{
	uart_init(UART_3,9600,UART3_TX_C10,UART3_RX_C11);  
	uart_rx_irq(UART_3,1);    //无线串口及串口接收中断初始化
	
	oled_init();     
	all_pwm_init();           //初始化PWM
	zoom_init();              //计算图像缩放倍数
ADC_init();               //ADC初始化
	encoder_init();           //编码器初始化 

	mt9v03x_init();	        //摄像头初始化
	mpu_and_dmp_init();       //陀螺仪及DMP初始化
	
	gpio_init(H2,GPO,1,GPO_PUSH_PULL);	 
	gpio_init(B13,GPO,1,GPO_PUSH_PULL);	 //LED
	
	gpio_init(G11,GPO,0,GPO_PUSH_PULL);   //BEEP
	
	gpio_init(G2,GPI,1,GPI_FLOATING_IN);	
	gpio_init(G4,GPI,1,GPI_FLOATING_IN);	
	gpio_init(G6,GPI,1,GPI_FLOATING_IN); 
	gpio_init(G8,GPI,1,GPI_FLOATING_IN);	//Button
	
	Clear_flag();
	systick_delay_ms(100);
 
}

4.2 摄像头采集以及图像处理

  将摄像头采集的数据从 DMA 中保存在二维数组内,利用标志位将 DMA 场中断分成奇偶,一场用于摄像头采集保存到 DMA,一场用于单片机处理图像数组; 由于摄像头安装角度,图像会呈梯形畸变。近处图像稳定,远处图像失真。 所以结合这些特征,边缘提取从图像底部作为初始,顶部作为结束。采用动态重点的方法搜寻边界,保证了边界获取的完整性。在提取完边缘之后,分析其走势、中线斜率、中线截距、两边界丢线数目等信息用于分析赛道元素。

4.3特殊元素识别:

4.3.1 三岔路口

  利用三岔路口向左右两个方向分散的特点、当车辆靠近三叉路口时,左边界呈现明显的左向前进趋势、右边界呈现明显的右向前进趋势。由此来判断三岔路口。

4.3.2圆环

  因为圆环在铺设时圆环与赛道的切点电磁线走过两次,所以电感值会成倍数增大,由此来判断圆环。直立车采用外八字电感来判断圆环方向,三轮车则采用摄像头。

4.3.3坡道

  • 三轮车:移植DMP结算出ROLL角,从而确定坡道
  • 直立:因为直立车的电磁具有前瞻性,当靠近坡道时,中间横电感增大趋势大于左右两横电感,由此来判断坡道。

4.3.4十字

  当经过十字时,左右两边界会呈现丢线状态,由此来做判断。

4.4 PID控制的算法

  由于智能车的控制是响应速度非常快的闭环控制,所以本队使用了鲁棒性卓越的PID理论作为基础,并在其中做出适合本队小车图像算法的改动。

4.4.1 驱动转向的PD位置式算法

  由于F与D车模都是利用两轮差速转向,具有良好的转向性能。所以采用位置式PD控制。P控制把0作为理想值,电磁信号的开方差比和算法作为误差,摄像头融合了中线斜率及中线截距作为误差。D控制直接用陀螺仪读取Z轴角速度进行一定计算作为阻尼来消除震荡。

4.4.2驱动电机的PI位置式算法

  在PI 计算中融入前馈项,当速度误差小 的时候,前馈量小,速度误差大的时候,前馈量大,最终进行积分;使得加减速更加灵敏。

4.5直立控制

4.5.1角度融合

  由直立控制的理论分析可知,直立控制需要实际的车模角度,我们采用了MPU6050陀螺仪,移植并使用了其自带的DMP结算角度的方式,此方式的优点是关方硬件库可以方便的读取数值、输出角度数据稳定自带低通滤波、对六轴加速度角速度数据具有积分修正误差的作用。缺点是角度值输出精度不高且速度较慢,只有最高200HZ。

4.5.2直立控制串级PID算法

  角度环的PD控制:让车简单的直立起来很简单,可以想象一个单摆系统,如果把单摆拉开一定角度,其会在重力及阻力作用下最终回到平衡位置。让车站起来也是同样的道理,只要用简单的PD控制,与目标位置的角度差作为误差,转向目标角度的速度作为阻尼,在P值足以克服重力的作用后便可实现站立的效果。P值越大,转向目标角度的趋势越大,同时加上合适的阻尼效果就可以让直立车更加坚挺。

  角速度环的PI控制:但是如上文所说,DMP输出的角度值是有速度限制的,200HZ的有效计算速度不足以让直立车有足够的抗干扰性。所以我们在角度环的前级加入了角速度环。众所周知,角速度积分就是角度的变化量,所以我们将角速度积分作为电机的输出量,副以P阻尼控制就可以式直立车稳定与某一角度,当目标角速度为零时车模角度将维持不动,目标角速度为正时车模将向正方向持续倾斜,反之亦然。所以将角度环的计算结果作为角速度环的理想值,当实际角度小于目标角度时角度环输出正值,角速度环控制车模向正方向倾斜,依次来达到理想角度。

  速度环的P控制:如下图。当车模位于平衡角度时,重力与地面支持力抵消,车模保持静止。当车模角度小于平衡角度时重力于支持力在垂直方向上依然平衡,但是不同的受理点会使车模产生一个转向的力矩,角度环及角速度环为了使车模保持平衡就要使车模在正方向有一个加速度。所以就可以借用此原理,通过改变车模的理想角度实现加减速。

 

第五章 发工具、制作、安装说明


5.1 开发工具

  Keil MDK,也称MDK-ARM、Realview MDK、I-MDKuVision4 等。Keil MDK是由三家国内代理商提供技术支持和相关服务。
  MDK-ARM软件为基于Cortex-MCortex-R4ARM7ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。
  MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

5.2 关于机械部分的调整

  作为车辆运行的基础,车模结构的搭建至关重要。结构决定了车辆的上限,对此我们对D、F车模有以下调整:
  直立车模:将电池放于车后,于电磁杆形成平衡,使车模再直立状态下有很好的角度。同时将配重放于接近车辆中轴的位置,即调整了机械零点,有不至于使转动惯量增加太多。

  三轮车模:将主板及电池等结构放于车的尾部,将重心尽量压到后轮,这样可以使转向更加有力,前轮阻力更小。

 

第六章 语及车模各项技术参数


6.1结语

  “恩智浦”杯全国大学生智能车竞赛一项多学科、综合性的比赛,该竞赛涵盖了控制、电子电路线路设计、机械设计、传感技术等多方个学科,在整个过程中,对学生的理论基础知识、实践动手能力和团队协作能力等综合素质要求极高。通过参加比赛切实开拓了视野,使我们的动手能力、运用知识的能力、分析解决问题的能力也有了很大的提高,实实在在的培养了学生的综合素质能力。自报名参加第十六届“恩智浦”杯全国大学生智能汽车竞赛以来,我们小组成员从查找资料、设计机构、组装车模、编写程序一步一步地进行,最后终于完成了比赛任务,定下了现在这个设计方案。

  在此份技术报告中,我们主要介绍了准备比赛时的基本思路,包括机械、电路以及最重要的控制算法。在机械结构方面,我们分析了调整重心位置,优化机械结构,考虑重量、重心对车辆的影响。在电路方面,我们以模块形式分类,在主板、电机驱动等模块分别设计,经过实际检验后以报告中所提到的形式决定了我们最终的电路图。在程序方面,我们使用 C 语言编程,利用比赛推荐的开发工具调试程序,经过小组成员不断讨论、改进,终于设计出一套比较通用稳定的程序。

  在这套算法中,我们结合赛道元素调整车速,做到直道加速、弯道减速,保证尽量在最短时间内跑完全程。在制作模型汽车过程中,由于我们的知识还不够丰富,考虑问题也不够全面,暴露了我们一些平时注意不到的点。例如在电路设计的过程中,应考虑硬件设计的兼容性和易扩展性,设计时需要预留一些可能用到的资源,以备后面增加是方便扩展,同时注意走线的间距及走向,注意信号的流向、电流的大小,并且和机械互相配合好,才能设计出性能较为稳定的主板。在程序设计和调试的过程中,不能太模糊化,需要进 行实际的建模和仿真;对智能车的运行一定要进行定量的分析和计算,对智能车运行中出现的各种情况都能做到理解—解决,站在理论支持的角度进行分调和调试。

  总体而言,一路上尽管磕磕绊绊的地方不少,但靠着整个团队的协作和团结,薛老师、朱老师的悉心照顾,我们最终还是克服了难关,看到了希望。,通过与老师的共同设计、一起实践,大家学到了很多,提高了很多,这将对以后的学习和工作都会起到很多有意义的作用。这份技术报告也将作为我们八个月以来辛勤汗水的结晶,凝聚着我们小组每个人的心血和智慧,成为我们最珍贵的回忆。最后,感谢学校和学院在场地、经费方面的大力支持,感谢对我们提供指导的薛老师、朱老师和学长们,感谢每一位智能车队员为我们所提供的帮助。同时也感谢比赛组委会能组织这样一项很有意义的比赛,在与各个高校进行竞争交流,培养能力的同时又增长了见识,希望智能车竞赛能够越办越好!

6.2车模各项参数

6.2.1直立车

  • 车模几何尺寸(长、宽、高)(毫米) 290200160
  • 车模轮距(毫米) 180mm
  • 车模平均电流(匀速行驶)(毫安) 400mA
  • 传感器种类及个数 工字电感5、DL20无线串口1、编码器*2
  • 新增加伺服电机个数 0个
  • 赛道信息检测频率(次/秒) 1000Hz
  • 车模重量(带有电池)(千克) 0.85

6.2.2三轮车

  • 车模轮距(毫米) 156mm
  • 车模平均电流(匀速行驶)(毫安) 800mA
  • 传感器种类及个数 工字电感3、Dl20无线串口1、摄像头1、编码器2
  • 新增加伺服电机个数 0个
  • 赛道信息检测频率(次/秒) 50Hz
  • 车模重量(带有电池)(千克) 1335g

 

第七章 考文献


  [1]闫琪. 智能车设计:"飞思卡尔杯"从入门到精通[M]. 北京航空航天大学出版社, 2014.
[2]艾宁, 瞿少成, 刘冬,等. 基于CCD摄像头的智能车路径识别及跟踪研究[J]. 电子测量技术, 2009, 032(008):77-80.
[3]张昊飏, 马旭, 卓晴. 基于电磁场检测的寻线智能车设计[J]. 电子产品世界, 2009(11):54-56.
[4]李仕伯, 马旭, 卓晴. 基于磁场检测的寻线小车传感器布局研究[J]. 电子产品世界, 2009, 16(12):41-41.
[5]卓晴, 黄开胜, 邵贝贝. 学做智能车:挑战"飞思卡尔"杯[M]. 北京航空航天大学出版社, 2007.

 


A.直立车源代码:

#include "headfile.h"
int get_ref;
int send_times;
int bebe_times;
u8 if_sent;
int mode=0;
int choice=1;
int clear_time;
int position_off_set=0;
int dot_position=1;
u8 message_send;
u8 message_get;
int main(void)
{
  all_init();
	while(1)
	{
		   if(if_sent)
	 {

		  if_sent=0;
			state=0x02;
			systick_delay_ms(100);
			message_coding();
			uart_putchar(UART_3,message_send);
			systick_delay_ms(350);
		  if_stand=0;
		  float i;
			for(i=1;i>0.1;i=i-0.05)
		 {
			  big_times=DP*0.5*i;
			 systick_delay_ms(15);
		 }
	 }
		don_t_bebe(); 
		buttom();
		mode_choice(); 

	}
}

void message_coding()
{
	message_send=128*if_done+64*sanlun_speed_mode+32*ku_LR+16*go_LR+8*relay_in_which+4*sancha_num+state;
}

void message_discoding()
{
	bool d0,d1,d2,d3,d4,d5,d6,d7;
	
	d7=(message_get%256)/128;
	d6=(message_get%128)/64;
	d5=(message_get%64)/32;
  d4=(message_get%32)/16;
	d3=(message_get%16)/8;
	d2=(message_get%8)/4; 
	d1=(message_get%4)/2;
	d0=(message_get%2)/1;
	
	state=d0+2*d1;
	sancha_num=d2;
	relay_in_which=d3;
	go_LR=d4;
	ku_LR=d5;
	sanlun_speed_mode=d6;
	if_done=d7;
	
	if(state==0x03)
		if_stand=1;
}

void don_t_bebe()
{
	if(bebe_times)
	{
		gpio_set(G11,1);
		systick_delay_ms(30);
		gpio_set(G11,0);
		systick_delay_ms(20);
		bebe_times--;
	}
	 if(gpio_get(G11))
		{systick_delay_ms(200);gpio_set(G11,0);}
}
void buttom()
{
	
	if(gpio_get(G2)==0)
		{
			systick_delay_ms(1);
			if(gpio_get(G2)==0)
			{
				bebe_times++;
				clear_time++;
				time=0;
				if(mode==0)
				{
					dot_position++;
					if(dot_position==4)
						{dot_position=3;if(position_off_set<7)position_off_set++;} //Ñ¡ÏîÊý-3
					choice++;
					if(choice>10)            //Ñ¡ÏîÊý
						{choice=1;position_off_set=0;dot_position=1;}
				}
			while(gpio_get(G2)==0);
			}
		}	
				
	if(gpio_get(G4)==0)
		{
			systick_delay_ms(1);
			if(gpio_get(G4)==0)
			{
				bebe_times++;
				clear_time++;
				time=0;
				if(mode==0)
				{
					dot_position--;
					if(dot_position==0)
						{dot_position=1;if(position_off_set>0)position_off_set--;}
					choice--;
					if(choice<1)
						{choice=10;position_off_set=7;dot_position=3;}   //Ñ¡ÏîÊý Ñ¡ÏîÊÇ-3
				}
			while(gpio_get(G4)==0);
			}
		}	
				
	if(gpio_get(G6)==0)
		{
			systick_delay_ms(1);
			if(gpio_get(G6)==0)
			{
				bebe_times+=2;
				clear_time++;
				time=0;
				mode=choice;
				clear_time+=1;
			while(gpio_get(G6)==0);
			}
		}	
				
	if(gpio_get(G8)==0)
		{
			systick_delay_ms(1);
			if(gpio_get(G8)==0)
			{
				bebe_times+=1;
				time=0;
        mode=0;
				get_ref=0;
				clear_time+=1;
				choice=1;
				position_off_set=0;
				dot_position=1;
					message_coding();
				  uart_putchar(UART_3,message_send);
			while(gpio_get(G8)==0);
			}
		}	
		
}
	

B.三轮车源代码:
#include "headfile.h"
u8 message_get;
u8 message_send;
int send_times;
u8 if_sent;
int main(void)
{  
  all_init();

	while(1)
	{ 
			if(gpio_get(G2)==0)
		{
			systick_delay_ms(3);
			if(gpio_get(G2)==0)
			{
			Velocity_out=0;
				Ideal_Angle=roll;
			}
			
			while(gpio_get(G2)==0);
		}	
		
			if(gpio_get(G4)==0)
		{
			systick_delay_ms(3);
			if(gpio_get(G4)==0)
			{
				gpio_set(G11,1);
				Clear_flag();
			  oled_fill(0); 
				oled_p8x16str(0,2,"Clear  Flag");
				systick_delay_ms(50);
			}
			while(gpio_get(G4)==0);
		}
		
			if(gpio_get(G6)==0)
		{
			systick_delay_ms(3);
			if(gpio_get(G6)==0)
			{ 
				get_edge_length();
				gpio_set(G11,1);
				mid_ref_mid=inductor_middle;													
				mid_ref_left=inductor_left;		
				mid_ref_right=inductor_right;		
				oled_fill(0); 
				oled_p8x16str(0,2,"Get  Road");
				systick_delay_ms(50);
			}
			while(gpio_get(G6)==0);
		}
		
			if(gpio_get(G8)==0)
		{
			systick_delay_ms(3);
			if(gpio_get(G8)==0)	
			{
				chu_ku=1;if_ku_out=1;ku_time_out=0;
				gpio_set(G11,1);
				oled_fill(0); 
				oled_p8x16str(0,2,"Let's  Go");
				systick_delay_ms(50);
			}
			while(gpio_get(G8)==0);
		}
		
		if(if_done)
		{
			message_coding();
  		message_get=message_send;
	    uart_putchar(UART_3,message_send);
			oled_fill(0); 
			int i;
			while(if_done)
			{
						
					if(gpio_get(G4)==0)
				{
					systick_delay_ms(3);
					if(gpio_get(G4)==0)
					{
						gpio_set(G11,1);
						Clear_flag();
						oled_fill(0); 
						oled_p8x16str(0,2,"Clear  Flag");
						systick_delay_ms(50);
					}
					while(gpio_get(G4)==0);
				}
				
				
		   oled_p6x8str(0,0,"Congratulation");
			 oled_p6x8str(0,1,"Please press K2");

			}

			
		}
		if(gpio_get(G11))
		{systick_delay_ms(10);gpio_set(G11,0);}

		
		{
    oled_dis_bmp	( MT9V03X_H/multiple_ROW,188/multiple_COL,little_image[0],128);

	}
}

void message_discoding()
{
	bool d0,d1,d2,d3,d4,d5,d6,d7;
	
	d7=(message_get%256)/128;
	d6=(message_get%128)/64;
	d5=(message_get%64)/32;
  d4=(message_get%32)/16;
	d3=(message_get%16)/8;
	d2=(message_get%8)/4; 
	d1=(message_get%4)/2;
	d0=(message_get%2)/1;
	
	state=d0+2*d1;
	sancha_num=d2;
	relay_in_which=d3;
	go_LR=d4;
	ku_LR=d5;
	sanlun_speed_mode=d6;
	if_done=d7;
}

void message_coding()
{
	message_send=128*if_done+64*sanlun_speed_mode+32*ku_LR+16*go_LR+8*relay_in_which+4*sancha_num+state;
}

void Clear_flag()
{
			ku=0;
			state=0x00;
			message_coding();
  		message_get=message_send;
	    uart_putchar(UART_3,message_send);
			in_sancha=0;  
			san_cha_new_times=0;
	    if_done=0;
	    Ramp_times=0;
			chu_ku=0;
	    ramp_enable
			round_time=0;
			island_times=0;
			road_length=0;
			Speed_Set=2300+400*sanlun_speed_mode;
	    if_ku_out=0;
			run_time=0;
			left_island_flag=0;
			right_island_flag=0;
			fang_xiang=0;
	    if_stop=0;
}


● 相关图表链接:

  • 图 1.1 三轮车整体布局
  • 图 1.1 三轮车整体布局图
  • 图 1.3 三轮车系统总体方框图
  • 图 1.3 三轮车系统总体方框图
  • 图 2.1 三轮车整体布局
  • 图2.3 三轮发球器3D模型
  • 图2.4散热片
  • 图2.5.1摄像头底座安装
  • 图2.5.2摄像头安装
  • 图3.1.1 直立车电源管理模块
  • 图3.1.2 三轮车电源管理模块
  • 图3.1.3 电磁采集信号放大模块
  • 图3.2 驱动电路
  • 图3.3.1 摄像头接口
  • 图3.3.2.1 三轮车LC谐振传感器
  • 图3.3.2.1 直立车LC谐振传感器
  • 图3.3.3 编码器接口
  • 图3.3.3 zigbee模块
  • 图3.3.6.1 OLED模块
  • 图3.3.6.2 按键模块
  • 图3.3.7 电池电压采集模块

最后

以上就是冷傲小虾米为你收集整理的智能车竞赛技术报告 | 双车接力组 - 大连海事大学 - 同舟拾贰队 第一章 方案设计 第二章 机械结构设计 第三章 电路设计说明 第四章 智能车控制软件设计说明 第五章 开发工具、制作、安装说明 第六章 结语及车模各项技术参数 第七章 参考文献 附录 的全部内容,希望文章能够帮你解决智能车竞赛技术报告 | 双车接力组 - 大连海事大学 - 同舟拾贰队 第一章 方案设计 第二章 机械结构设计 第三章 电路设计说明 第四章 智能车控制软件设计说明 第五章 开发工具、制作、安装说明 第六章 结语及车模各项技术参数 第七章 参考文献 附录 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部