第一章 方案设计
??本本章将简要介绍智能汽车系统的整体设计理念,并将整个系统分为三个部分:机械结构、控制模块、控制算法等。
1.1系统总体方案的设计
??双车接力组智能车系统由竞赛组委会提供D、F在原车模的基础上,对两款车型进行了改进设计。上海智能微电子有限公司生产的32位MCU MM32F3277G9P在KEIL软件开发在开发环境中进行。三轮车主要采用摄像头,辅助电磁和陀螺仪传感器将轨道信息输入控制核心,用于赛车的运动控制决策。脉冲计数通过编码器测速模块检测速度,并利用控制器的输入捕获功能计算速度和距离;电机转速控制PID控制,通过 PWM 控制驱动电路调节电机转速,完成智能车速闭环控制。直立车主要采用电磁,辅助陀螺仪传感采集轨道信息输入控制核心,用于赛车运动控制决策。传感器通过两个电机的差速和陀螺仪的回值PID拟合控制转向。此外,还增加了键盘和键盘OLED智能车参数调试作为输入输出设备。
▲ 图 1.1 三轮车的整体布局
▲ 图 1.1 三轮车整体布局图
1.2控制流程图
▲ 图 1.3 三轮车系统总体方框图
▲ 图 1.3 三轮车系统总体方框图
??直立赛车有七个模块:MM32F3277G9P主控模块、传感器模块、电源模块、电机驱动模块、速度检测模块、辅助调试模块。各模块的作用如下:MM32F3277G9P主控模块将根据控制算法收集传感器信号并做出决策,驱动直流电机完成智能汽车的控制。通过一定的前瞻性,传感器模块可以提前感知主控模块做出决策提供必要的依据和充足的反应时间。为整个系统提供合适稳定的电源模块。电机驱动模块,驱动直流电机完成智能车的加减速控制和转向控制。用于速度闭环控制的速度检测模块、智能车后轮的速度反馈。辅助调试模块主要用于功能调试、赛车状态监控等方面。
第二章 机械结构设计
??智能源汽车运行的优良性与机械结构、重心位置的选择、各传感器模块的位置将成为车速度和稳定性的因素。因此,加强智能汽车的机械结构是智能汽车设计的首要任务,在智能汽车的实际调试过程中,机械结构的优化也可以解决许多软件算法无法解决的问题。
2.1 车模设计与搭建
2.1.13轮车和直立车搭建
??车辆和直立车辆由竞赛专用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.3 三轮发球装置设计
2.3.1 设计平台
??我们先后采用PC端Tinkercad平台和平板端Shaper3D。这两个平台资源不多,但是Shaper3D操作简单,功能多,最终选择后者。
2.3.2 3D结构
??软件设计的发球装置如下图2所示.3
▲ 图2.3 三轮发球器3D模型
2.3.3 发球装置参数及创新点
??根据传球,乒乓球直径40.00mm传球装置的凹槽直径为41.00mm,厚度为1.50mm,所有安装孔均符合要求M3尺寸孔洞。并在实际调试过程中发现打印3d装置硬度不够,两侧安装护板,减少冲击对传球装置的损坏。顶壳设计不仅保证了万向轮的正常运行,还充当了固定挡板,使电磁和摄像头的位置不会因碰撞等事故而改变。
2.3.4 安装发球装置
??三轮全向轮位置安装发球装置,用螺母固定。
2.4 安装三轮车散热器
??在三轮运行过程中,由于模型本身的结构比直立更重,电机在整个系统运行过程中会堵塞,导致三轮电机发热严重,甚至影响三轮车的正常运行。为了解决这个问题,我们在电机上加装了散热片,如下图2.4所示。
▲ 图2.4散热片
2.5 三轮车摄像头安装
三轮车摄像头碳杆底座采用可调节角度的两通器件,便于在实际调试中多次尝试找到最合适的摄像头角度。其结构如下图2.5.1、图2.5.2。
▲ 图2.5.1摄像头底座安装
▲ 图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
取代老式的LM2576
、LM2596
、LM2941
等芯片。该BUCK
电路通过反馈回路的电阻影响输出电压,所以采用电位器对该电源电路进行控制,而摄像头和陀螺仪供电采用两路LM1117-3V3
进行降压。其余外设均用MM32F3277G9P
核心板上所带的RT9013-3V3
降压电源进行供电。主板电源管理模块原理图如下图3.1.1
。
▲ 图3.1.1 直立车电源管理模块
3.1.2 三轮车车电源管理模块
由于AS1015
芯片停产,我们随后制作的三轮车电源管理芯片不得不发生变化,最终在多种电源芯片对比后采用了TPS5450DDAR
芯片,该芯片效率较高,且具有输出功率大,电压纹波小等优点,我们的设计参考了其芯片手册上的典型电路,并采用电位器对反馈回路进行控制,从而影响输出电压。其余电源管理模块均与直立车类似。并且在此基础上加入磁珠来隔绝数字地和模拟地。电源管理模块如下图3.1.2
。
▲ 图3.1.2 三轮车电源管理模块
3.1.3 电磁采集信号放大模块
我们的电磁采集信号放大模块位于主板侧边,其运放芯片采用OPA4377
,该芯片是一款由TI
公司出品的低噪声、低静态电流、精密汽车级别四运放。而高频检波的肖特基二极管我们使用了集成两个二极管的BAT54S
。当输入信号的幅度落入“检波死区”之内,检波电路输出就几乎不发生变化,从而使得信号中的信息就被检波电路阻碍住,即使后面的电路和软件进行相应的放大和补偿,也无法回复被截掉的信号中的信息。因此,为了防止在赛道磁场强度减弱的情况下,赛道信息被“检波死区”截掉,就需要尽可能减小检波死区的大小。而经过比较,检波二极管采用BAT54S
可以有效减小检波死区,并且其集成结构可以有效减小放大模块在主板所占面积,更加有效利用主板布局。其电磁采集信号放大模块如下图3.1.3
。
▲ 图3.1.3 电磁采集信号放大模块
补充说明,由于两车对电磁传感要求不同,所以三轮只采用一组模块,而直立采用两组。
3.2 驱动电路设计
我们的驱动采用了hip4082芯片搭建的全桥驱动电路。MOS采用了IRLR7843 TRPBF N沟道MOS管,该MOS价格合适,且漏源电压可达30V,功率大,符合我们双车系统的要求。PWM信号的缓冲采用SN74HCT244DW芯片。其电路原理图如下图3.2。
▲ 图3.2 驱动电路
3.3 传感器模块
3.3.1 摄像头模块
我们摄像头采用总钻风MT90V34,主板接口参考其手册设计。需要注意的一点为8条数据线在PCB排布上长度要尽量相等,所以我们采用了蛇形布线。原理图接口如下图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.3 编码器模块
编码器模块接口参考手册设计,原理图如下图3.3.3。
▲ 图3.3.3 编码器接口
3.3.4 zigbee模块
双车接力组允许使用无线通信模块。我们进行多次对比,发现zigbee模块具有对接时间极短,传送稳定,配置方便等优点。所以,采用了DL-20模块进行通讯。模块如下图3.3.4。
▲ 图3.3.3 zigbee模块
3.3.5 陀螺仪模块
陀螺仪接口设置在核心板下方,节省了主板空间,且能够保持与车模底盘平行。
3.3.6 人机交互模块
我们在主板上增设按键和OLED作为人机交互模块,方便系统调试。如下图3.3.6.1、图3.3.6.2。
▲ 图3.3.6.1 O
LED模块
▲ 图3.3.6.2 按键模块
3.3.7 电池电压采集模块
为了便于在智能车调试过程中对电池电量的掌控,我们采用单片机自带的ad进行电压采集,并通过人机交互模块反馈给我们。原理图如下图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-MDK
、uVision4
等。Keil MDK
是由三家国内代理商提供技术支持和相关服务。 MDK
-ARM软件为基于Cortex-M
、Cortex-R4
、ARM7
、ARM9
处理器设备提供了一个完整的开发环境。 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)