打印
[MM32生态]

基于灵动MM32系列单片机的三轮智能车设计

[复制链接]
90|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
摘 要
随着社会发展,人们对自动化,智能化的需求呈指数增长,在《中国制造2025》中,规划了制造强国建设的宏
伟蓝图。而智能车作为一个未来的增长很重要来源,且是实现制造业强国战略的有力支持,基于此开发出来了智能
车。
  本次毕业设计是基于mm32F3277芯片开发的智能三轮小车,能完成自动寻迹和各种路况下进行停车、加速、减
速、及双车通讯。从元器件的选择、使用AD进行原理图、原理图库、封装、PCB的绘制,并进行了电路的焊接、调
试、编写程序,实现智能车从出库到入库的智能控制。
  智能车由硬件组成、软件程序和本体结构三部分组成。硬件组成:以mm32F3277为控制核心,设计了信号采样电
路、驱动电路、主控电路、磁感应电路(霍尔元件)和运放电路。软件程序:编写差动控制电机实现路径跟踪,设
计了环岛、三岔、十字、入库等多种道路要素的程序。后期对汽车进行了深入研究,分别对机械结构、硬件和软件
进行了改进。硬件主要是传感器和电路的布局,软件参数进行了调整,让汽车更加完美。本体结构:车轮采用橡胶
轮和两个直流电机。采购的是逐飞科技的F款车型,为了节省空间,在汽车底盘下方粘贴了磁感应小板,控制电路板
固定在车身上。
【关键字】智能小车 PCB板设计 智能化 自动化

前 言
本次是对智能三轮小车进行设计,使用了mm32F3277作为主控制器进行电路控制,为了对道路的寻迹、障碍的躲
避、元素的设计是本文的主要内容。
  智能车发展了几十年的时间,智能汽车的发展可以追溯到带轮子的机器人。许多研究人员将智能车辆纳入轮式
移动机器人的范围,在简单的避障和寻路机器人的基础上,增加了一系列智能系统,使智能车辆越来越完善,智能
汽车的研发需求包括识别复杂未知环境中的环境信息、做出最优决策、规划路线、辅助用户驾驶等。作为一个软硬
件结合的研究领域,对编程和信息通信等软件有很高的要求,最新的传感器、安全装置等必要的硬件得到补充,是
典型的高科技综合体。
  为将智能三轮小车从思想中的幻物变成现实中的实体,进行了初步的方案设计、电路设计、程序设计及实物的
焊接和调试,最后成为一个实际的产物。下文就将这设计的步骤一步步将脑中的设计放到现实、变成实体。
第一章绪论
第一节 智能车的研究背景及意义
从车辆诞生起,人类对车辆的要求越来越高。车辆向着更智能的,更自动的方向发展。
中国制造2025[1]提出了发展为制造业强国,科技创新更上一步台阶,将一部分产业发展到世界先进水平。而汽
车作为受用面广,且科技含量高,在中国制造中将是一道靓丽的风景线。
  但是汽车的智能程度还不高,人还需要驾驶车辆,未达到解放人双手的智能程度。这是一个巨大的市场,将改
变人在车辆驾驶的方式,如果达到商用,能试用于各种复杂环境下的驾驶,该种车辆的出现将具有划时代的意义。
  目前,全球各大互联网公司及汽车制造商纷纷加入无人驾驶汽车[2]研究的阵营中,谷歌想要开发出一款完全不
需要人类操作的汽车,即车内没有方向盘、油门、刹车等,汽车所进行的一切操作均由计算机实现;而特斯拉和丰
田等公司更偏向于开发出一款汽车可以进行完全的无人驾驶。
第二节 智能车的研究现状及趋势
  在智能驾驶技术的研究上,国外起步较早,并在道路上对技术的可行性进行了验证和实测。典型研究代表如美
国卡耐基梅隆大学的NavLab-5和Boss智能车、谷歌的无人驾驶汽车、意大利帕尔马大学的ARGOvehicell、德国联邦
国防大学的VaMP智能驾驶系统等。
  以美国的智能汽车研发计划为例,早在 1983 年,美国国防高级研究计划局(DARPA)就成立了战术技术办公室
(TTO),负责自主陆地车辆(Autonomous Land Vehicles)的研发工作。现阶段美国智能驾驶技术主要应用于军事
领域,已经能够依靠智能车辆执行侦察、巡逻、监视、扫雷、战斗突击、物资运输、抢修救援等多种任务。
  国内对智能汽车的研究起步较晚,与世界最先进技术存在较大差距。但近年来,相关的技术研究文献和物理研
究取得了很大的成果,并取得了一些非常引人注目的成果。
例如,清华大学计算机系智能技术与系统国家重点实验室研发了一款可以在结构化道路上自主驾驶的清华移动机器
人智能小车,时速100km/h,最高时速150km/H。2003年,由国防科技大学何汉根教授带领的智能汽车课题组与中国
一汽集团联合研制出智能汽车CA7460,实验在长沙成功。
智能车[3]未来的发展趋势将向通用型发展,且以军用为引导,民间应用为助推,协调快速发展[4]。
第三节 本文的章节安排
  第一章:主要对智能车的过去现状进行了简述,并对未来进行了展望,智能汽车将会变成现实且进入千家万户
当中。
第二章:对智能车的整体方案和核心元件会进行选择,其中会绘制总体方案结构框图。
第三章:对硬件进行系统性的设计,如驱动、运放、主控等原理图的设计理念和具体步骤。
第四章:对软件进行编写,讲解程序对智能车的控制,及各个子程序和元素的设计。
第五章:对实物进行讲解,如何焊接、如何调试、测试电路板,最后对实物进行组装。
第三节 本章小结
  本章将世界智能车的发展和中国智能车的发展拉通,对智能车的发展历史和发展前景,花了极重的笔墨进行了
说明。科技将改变命运,也将改变人的生活方式。之后第三节对文章的每个章节进行了内容上的安排,从本章可以
从侧面看到本文的具体设计和流程,为点篇之章。

第二章智能车的整体方案及核心器件选择
第一节 智能车设计方案选择
  为了保证三轮的稳定性,选用电磁线寻迹的方式。使用电感传感器感应电磁线,为了转弯性能选用两个电机的
驱动,而为了有更强的运算能力,本次选用了mm32f3277芯片。为了更好控制速度,使用了逐飞科技的正交编码器。
总体思路方案如图2.1所示:



图2.1 总体方案结构框图
第二节 智能车系统核心器件选择
一、传感器选择
  传感器实际上是一种功能块,其作用是将来自外界的各种信号转换成电信号。传感器所检测的信号近来显著地
增加,因而其品种也极其繁多。从其中选择了两款比较适合的传感器。
1.道路信息获取传感器(工字电感)
   本次研究用电感来感应信号,电感相对于电磁线位置发生变化以后,相应产生的电感值也会发生变化,将对应
电感信号传递给运算放大器,经过A/D转化成相应的数字信号,最后使用MCU来判断位置变化(程序实现)。使用的
电感为八字电感。
2.磁场检测传感器(霍尔元件)
  霍尔元件是一种基于霍尔效应的磁传感器,用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使
用。霍尔元件[8]具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便。
3.速度检测传感器(编码器)
  也叫编码器,将信号或数据进行编制、转换为可以用于通讯、传输、存储的信号的设备,主要原理是将角位移
或直线位移转换成电信号。
二、控制器选型
1.控制器的简介
  控制器(英文名称:controller)是指按照预定顺序改变主电路或控制电路的接线,和改变电路中的电阻值来
控制电动机的启动、调速、制动和反向的主要装置。由程序计数器、指令寄存器、指令译码器、时序产生器和操作
控制器组成,它是发布命令的“决策机构”,即完成协调和指挥整个计算机系统的操作。
2.选用控制器的型号
  本次选用了MM32F3277作为控制器,选用它作为控制器的原因是MM32F3277使用了高性能ARM的M3为内核的32位单
片机,具有高性能和低功耗的特点。
三、车模选择及电机的选择
本次选用的是全国智能车比赛的F型三轮车模,该车模的具体参数如表2.1所示:
表2.1 车模参数

车模尺寸 25.2cm18cm6.4cm
电机个数 2个
车轮个数 3个(两个常规轮,一个福来轮)
9
电机参数 电压7.2V(15000~18000rpm),空载电流<630mA,最大功率>24W
特点 精度高、平稳灵活、抓地力强、价格便宜
第三节 本章小结
  本章对智能车的具体方案开展了讲解,智能三轮小车的组成部分,部件经由MCU控制,对需要的主控芯片进行了
一定的选择,将一个方案具体展现的淋漓尽致。

第三章 智能车的硬件设计
该小车需要各种电路板,包括驱动电机的驱动板、放大电流的放大电路(运放)、用于感应电磁线的电感电
路、用于车库停车的霍尔元件板、用于连接外设的主控板、用于控制的MCU(核心板)[6]。
第一节驱动电路设计
一、驱动方式
本次使用两个PWM波控制,将PWM输入到4082芯片,经过电桥电路调制电压,使电机运转。
二、原理图设计
  从驱动板进电开始,到PWM经过H桥产生交替的电压,供给到电机侧结束。为了完成这个目标,设计了驱动电
路。
驱动电路总体思路为:
  将7.2V电压输入到电路中,使用开关控制电压进入电路,然后使用拨动开关控制4082的芯片使能脚(高电平芯片
运行)。而进入4082芯片后,芯片运行需要5V电压,7.2V不满足条件,则要使用到5V稳压器,即LM2940。驱动电机运
转需要12V电压,引入了B0512升压芯片。而驱动芯片如何控制电机转动,这就需要引入逻辑门芯片SN74HC125PWR和
驱动芯片4082了,当核心板产生的PWM经过逻辑门和4082芯片和H桥式电路处理以后,输入到电机正反接口上,就可
以达到用程序控制电机转动。为了使电路设计更加清晰,本次将会把驱动电路进行分解,然后依次对应的电路一一
进行讲解。
电路的进电接口及电源开关如图3.1所示:



图3.1 电源接口及电源开关图
  图3.1使用了一个接线端子,用于电源接入,电源使用7.2V锂电池。当电路连通后,LED灯1脚为P极输入、2脚为
N极输出,会使led1这个发光二极管亮起来。
  电源开关使用了一个拨动开关,用于管理电流通入电路板中。当电源经过图3.1的原理图后,可以将电压输入到
拨动开关上,拨动开关控制电源进入4082芯片。图3.2为拨动开关原理图,三脚为电源输入脚,一脚为GND输出脚,
二脚控制4082芯片使能脚。要给4082使能4082需要一个5V高电平使芯片运作,
  图3.2的电压输入为5V,而电源输入的为7.2V。选用芯片LM2940实现将7.2V电压转换成5V电压,供4082芯片使
用,LM2940参数如表3.1所示:
表3.1 LM2940参数表
类型 线性稳压器
输入电压范围 -20V~30V
输出电流 0~1A
输出电压 5V
  由表3.1格知,输入电压在-20~30V,输出电压满足条件5V。
  LM2940是5V稳压芯片,将电源电压由7V稳定在5V。为了使电路更稳定,将使用电容进行滤波,在图3.3中直插电
容和贴片电容主要起到隔直流通交流, 起到滤除交流电的作用。图3.3使用0R电阻是为了预防电路设计出现问题,
如果前面电路出问题,可以调试电路。该芯片实物如图3.4所示:



图3.4 实物图
4082芯片可以运作后,需要一个12V的电压,选用的是B0512这款升压芯片,具体参数如表3.2所示:
表3.2 B0512具体参数表
购买商家 立创商城
芯片型号 B 05 12 LS - W5

型号的具体表现
B:产品系列
05:输入电压
12:输出电压
LS:封装形式
W5:产品功率
  芯片优点
体积小、功率密度高
效率高,输出纹波噪声低
热稳定性能好,温度特性好
工作温度范围:-40℃~+85℃
可靠性高(MTBF≥350万小时)
国际标准SIP封装,节省PCB空间
环保设计,符合ROHS指令
100%满载老化
  其上参数说明可以使用5V电压,经过芯片处理升压到12V。且热稳定性好,节省PCB空间,非常满足对该电路设
计的要求,使用B0512进行了设计。如3.5图所示,B0512芯片1脚为电源输入脚,2脚为GND脚,三脚四脚也接到GND
脚。
图3.5 B0512原理图
  对于在芯片端给驱动板的PWM信号要经过逻辑门电路,才能输入驱动芯片(4082),选用的是SN74HC125PWR,该芯
片的参数如表3.3所示:

由参数可以得到该芯片由四路逻辑门(与非门),1到3、4到6、8到10、11到13引脚分别组成四个逻辑门,7脚
是GND脚,14是电源VCC脚(2V到6V),如图3.7所示:
图3.7 SN74HC125PWR原理图封装
1Y、2Y、3Y、4Y都为PWM输出引脚,引脚标号取名分别为PWMMIN1.1、PWMMIN1.2、PWMMIN1.3、PWMMIN1.4,用于输入
到两个驱动芯片上(两个电机),如图3.8所示:

ALI、BLI引脚的引入的交替高低电压,会输入到mos管中,可以调节电机的转速,实现电机正反转、停转。用于
控制智能车加减速、
  将升压到12V输入到4082驱动芯片上,由下图可知当DIS为低时,H全桥端将无电压输入,BLI/ALI为PWM输入。
第二节 运放电路设计
  作用:将电感采集到的信号进行放大。电感采集到的信号主要是电流信号,经过运放放大,传给MCU,与标志位
进行对比,控制电机的正反转,使速度跟着对应电感值变化而变化,从而达到控制车辆的前进、后退、停车、入
库。
  电感采集的信号很微弱,MCU处理不了,为了解决这个问题引入了运放电路,运放的作用就是用来放大电流信
号,使用OPA4377作为运放模块芯片,具体参数如3.6表格所示:

本次运放需要使用到四路运算放大器,放大倍数从1倍到101倍。OPA4377刚好满足条件,且成本低,实用性高,
实物如3.10图所示:



INT1、INT2、INT3、INT4为经过运算后放大的信号,OUT1、OUT2、OUT3、OUT4为信号的输入端。
放大倍数公式如下:
放大通道1:1+(RP1+R5)/(R1);
放大通道2:1+(RP2+R6)/(R2);
放大通道3:1+(RP3+R7)/(R3);
放大通道4:1+(RP4+R8)/(R4);
放大倍数由滑动变阻器决定,放大倍数由1倍到101倍。以下为3D概念图
第三节 核心板电路设计
  选用mm32f3277芯片为MCU的核心板,核心板的作用可以比作电脑的CPU,作为信息和处理信号的载体,核心板最
主要的组成为最小系统,由芯片、时钟电路、复位电路组成。mm32f3277芯片的原理图如图3.14所示:



图3.14 芯片原理图
  芯片需要3.3V电压才能达到运行状态,所以引入了RT9013-33,该芯片是将高电压降低到3.3V,在主控板中会具
体介绍到。如表3.7所示,列明了芯片的具体参数和应用场景。
表3.7 mm32f3277具体参数和应用场景表

芯片型号 mm32f3277
使用架构 ARM Cortex-M3
工作频率(最高) 120Mhz
内置flash、SRAM大小 512KB的flash、128KB的SRAM
几个ADC 3个
几个比较器 2个
几个运算放大器 4个
几个16位通用定时器 2个
几个32位通用定时器 2个
几个16位基本定时器 3个
包含标准的通讯接口 2个I2C接口、3个spi接口和8个UART接口
  芯片的供电脚VDD使用3.3V电压供电。一个信号复位、一个电源复位脚,使用了两个外部晶振8MHz、32.768
KHz。烧录信号用USB接口,三个信号指示灯。其它都为外围引脚接口,用于插接到主控板上。
  其主要作用为:将各个模块收集到的信号,经过芯片处理,然后将对应信号传送给相应模块,用于控制车辆达
到预期效果。
一、单片机最小系统设计
1.时钟电路
时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,
  如上面核心板所示,使用到了两个晶振分别为8MHz、32.768KHz。8MHz使用了两个18pF电容,该晶振两端分别接
到了芯片的23脚和24脚。32.768KHz也使用了18pF的电容,该晶振两端分别接到了芯片的8脚和9脚。
2.复位电路
  复位电路是使用电路来使运行中的芯片回复到起始位置的电路,它的设计原理与计算机的复位有相似的地方,
只是启动原理和方式不同,一个是程序复位,一个是物理复位。
  和计算器清零按钮有所不同的是,复位电路启动的手段有所不同。一是在给电路通电时马上进行复位操作;二
是在必要时可以由手动操作;三是根据程序或者电路运行的需要自动地进行。
本次复位电路使用了两个:一个信号复位,一个电源复位脚。
第四节 主控板电路设计
  主控板是各个电路模块的连接板,在主控板上,有核心板的引脚插入口、蜂鸣器、驱动的PWM波的接口、编码器
接口、电源输入及电源开关接口、OLED接口、超声波模块接口、ICM20602、运放接口、无线串口、按键等等。主控
板的作用就是将核心板处理的信息传递给主控板,然后再传输给各个模块。为了达到控制的目的,主控板使用了很
多降压,稳压芯片,比如RT9013-33、LM2940。将各个接口分开来讲解。
一、主控板的接口电路
1.电源接口
  本次电源是7.2V电池电源经过T型插头输入到电路板中,在电路板中还有一个电压输出的引脚,用于连接到驱动
板的电源接口。

图3.1有一个双向二极管,可以有效起到防反接的作用,有一个拨动开关,用于控制电源进入电路。
  电源经过接线端子输入到电路中是7.2V的电压,而有些电源接口需要5V电压,为了达到效果,使用了LM2940经
过稳压达到5V,用于输入到电路中,图3.18为7.2V稳压到5V电压的原理图:
图3.18 主控板LM2490原理图
当电路运行成功的话,LED将亮起,该LED灯可以验证电路是否有电压,但不确定电压为5V,还是其它电压。这时就
要用到万用表,将上面转换的电压输入到后面电路中,如3.19图所示:
18
19
图3.19 RT9013-33原理图
  使用了三个RT9013-33降压芯片,将5V电压输入到RT9013-33降压芯片,主要用于分别输入到不同电路中(只使
用单个功率太大会烧芯片)。RT9013-33芯片参数如3.8表所示:

本次设计使用了两个编码器,作用于监测两个电机转速,然后将监测到的信号输入给MCU,根据电感值经过运放
放大,经过PID计算以后,比较两值得的大小,与用于判断在该环境下,是否需要更改速度。
3
  这个接口在本次未使用到,但是考虑到以后需要用,所以就设计上来了。该接口主要连接摄像头,用于采集道
路图像信息。

有来有去指的是超声波测距模块,使用超声波遇到物体会将波反射回来的原理制作出来的。当遇到障碍后,会
将信号传递给MCU,由MCU给出PWM控制电机转动,用来转向或停车,达到避障的作用。

本次使用的是蓝牙模块这个无线模块,该引脚用于安装蓝牙模块,蓝牙模块支持点对点及点对多点的通讯,可
以在小范围内组成一个微微网。用于信息的传输,本次设计使用两个蓝牙模块进行连接,并实现了通讯,到要碰车
的时候,发送信息,合理避障。

10.ICM20602接口(道路姿势感应传感器)
ICM20602原理图如3.28图所示:
图3.28 ICM20602
该接口用于安装陀螺仪,检测车辆的状态。本次使用的是六轴陀螺仪,坐标使用XYZ三条线定义。
二、主控板的蜂鸣器和按键
1.蜂鸣器
蜂鸣器原理图如3.29图所示:
图3.29 蜂鸣器原理图
  用于警报,当车辆出问题,或者是在某值。MCU会经过D12使用高电平,使三极管被导通,当输入相应的PWM波,
可以使蜂鸣器响起,或者唱歌用来提示信息,蜂鸣器报警。
2.按键

可用按键设计各种模式,例如加速、减速、停车等。
第五节 磁感应小板设计
一、电磁模块(电感寻迹)
电磁模块是主要由工字电感感应电磁的变化,选用普通的工字电感。
如下3.31图所示:



图3.31 工字电感实物
  电感的骨架是由铜芯线圈的绕线支架的。电感是电子电路中及各种设备中的重要组成部分之一,而电感的原理
是当电流改变时,因电磁感应而产生抵抗电流改变的电动势。
电感在实际的应用及材料:
  电感大多数将漆包线或纱包线)直接绕在骨架上,再用铁心或者铜芯、磁芯,将其放入骨架的内腔里,用于提
高电感量。小型的电感线圈一般不使用骨架,直接将漆包线包在磁芯上,本次在实验中使用的就是小型电感线圈。
应用场景:
● 直流式收音机中高频扼流器。
● 开关变压器与共模电感。
六路电磁模块的原理图如图3.32所示:



图3.32 电磁模块原理图
二、入库模块(霍尔元件模块)
本模块使用了霍尔元件,及3.3V线性稳压芯片,及LED灯和电容电阻。如3.33图所示:



图3.33 霍尔元件原理图
输入电压为5V,霍尔电阻极大,使电路处于短路状态,当磁场靠近后,霍尔元件阻值发生变化,使输出有了电压,经
过3.3V稳压芯片后,将电压输出,当MCU感应到电压,控制车辆判定入库。
PCB图如下3.34图所示:



图3.34 霍尔元器件PCB图
  本次设计使用的软件俗称AD,全名为Altium Designer。是原来Protel软件开发商Altium公司推出的一体化的电
子产品开发系统,该软件具有PCB版图设计[10]编辑和制造。PCB板设计需要相应的技巧及规则[11],本文不讲PCB的
绘图和技巧了。前文使用了蓝牙模块[12]为购买器件,自己未设计。
第六节 本章小结
  本章主要讲了本次设计的各种硬件电路,例如驱动电路、运放电路、主控板电路、核心板电路等等。为后面的
软件设计、调试、焊接打下了坚实的基础。

第四章 智能车的软件设计
Keil uVision5是一款集合了调试、运行、编译、编写等功能的C语言开发软件系统,软件使用方便,功能强大。用
户在最大的限度上使用屏幕上的空间,可以更好的去组织和设计工作上的事。
第一节 系统的主程序及流程图
在写程序之前先将流程图画下来,让编程思维更清晰。如下4.1图所示:



图4.1 程序流程图
  在main.c中先写了屏幕显示数据的函数,然后初始化,对赛道元素判断的函数。之后就是宏定义,使用均值滤
波获取电感次数5次。之后使用了各种标志位,而使用的滤波方式的是卡尔曼滤波[11]的方式。
  本程序使用了两个编码器,用encoder1_speed和encoder2_speed表示。encoder1_2_speed表示的为左右编码器
之和,初始值都设为0。这三个变量能在headfile.h中能找到。编码器获取对应的寄存器的值
encoder1_speed = tim_encoder_get_count(TIM_3);
tim_encoder_rst(TIM_3);
encoder2_speed = tim_encoder_get_count(TIM_4);
tim_encoder_rst(TIM_4);
采集磁感线[14]的电感值得变量定义如下:
先定义一个电感值权重的变量nductor_smoothing_weight,其值为0.7,再定义了电感的最大值和最小值。
本次使用了三种滤波
1:差比滤波
2:归一化滤波
3:均值滤波
设置了对应的电感采集的误差变量inductor_err=0;设置了车辆速度模式1为弯道恒速,0为弯道减速。设定v=300转
的最高速度。设定了左右电机的函数former_left_v,former_right_v。
  设置函数pid_turn_data_dispose(void)对获取的电感对应的寄存器的值进行滤波和判断。该函数内设定了低通
滤波的加权值,使用均值滤波(获取水平电感值)。inductor_level_sun=data_left_c5+data_right_c3是指竖直电
感和大小,即当水平电感和的值较阈值有差距,就会进行判断,往那个方向偏。
  adc_left_c5 = (data_left_c5/(float)inductor_level_sun)1000;
  adc_right_c3 = (data_right_c3/(float)inductor_level_sun)1000;
这两个指左右两边的电感分别和中间那个电感的差值。
  inductor_level_err=adc_right_c3-adc_left_c5;两边水平电感的差值。
  inductor_level_err=inductor_level_err>(inductor_level_sun2)?(inductor_level_sun2):
inductor_level_err;inductor_level_err=inductor_level_err<-(inductor_level_sun2)?-
(inductor_level_sun2):inductor_level_err; 指竖直电感的值,用于检测竖直方向电感较阈值有多少差距。
  inductor_dispose(ADC_3,ADC3_CH10_C00,ADC3_CH13_C03,1);均值滤波。
  inductor_vertical_sun=data_left_c6+data_right_c2; 竖直电感和。
  dc_left_c6 = 1000*(data_left_c6-0)/(float)inductor_c6_2_max_min[1];
  adc_right_c2 = 1000*(data_right_c2-0)/(float)inductor_c6_2_max_min[3];竖直电感-归一化。
  inductor_vertical_err=adc_right_c2-adc_left_c6; //竖直电感误差
  inductor_vertical_sun = adc_left_c6+adc_right_c2; //竖直电感和大小
track_element_judge();赛道元素判断
  将调用void track_element_judge(),正好下面程序就是对其的编写。在void track_element_judge()中,设

定了低通滤波的加权值,车辆的一般速度。定义了蜂鸣器打开与关闭的程序,当D12=0则开启蜂鸣器,当D12=1则关
闭蜂鸣器。
第二节 PID控制
一、PID的原理
  PID[15]算法的执行流程是非常简单的,即利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器
本身就是比例、积分、微分三个环节的加和。其功能框图如图4.2所示:



图4.2 PID控制流程图
  根据上图,考虑会在什么特别的时刻t,那时输入的为RIN(t),输出量为rout(t),经过计算可以得到偏差,公
式为err(t)=rin(t)-rout(t)。
于是PID的基本控制规律就可以表示为如下公式:
(4.1)
其中Kp为比例常数,TI为积分时间,TD为微分时间。PID控制的基本原理就是如此。
  在实现离散前,假设系统采样周期为T。假设检查第K个采样周期,很显然系统进行第K次采样。此时的偏差可以
表示为err(K)=rin(K)-rout(K),那么积分就可以表示为:err(K)+ err(K+1)+……,而微分就可以表示为:(err(K)

err(K-1))/T。于是可以将第K次采样时,PID算法的离线形式表示为:
(4.2)
也可以记为:
(4.3)
  由上面公式可以得到对应位置型PID算法的离散描述公式,这就是所谓的位置型PID算法的离散描述公式。知道
还有一个增量型PID算法,那么接下来推到一下增量型PID算法的公式。上面的公式描述了第k个采样周期的结果,那
么前一时刻也就是k-1个采样周期就不难表示为:
那么再来说第K个采样周期的增量,很显然就是U(k)-U(k-1)。于是用第k个采样周期公式减去第k-1个采样周期
的公式,就得到了增量型PID算法的表示公式:

当然,增量型PID必须记得一点,就是在记住U(k)=U(k-1)+U(k)。
二、PID仿真
  本次使用matlab simullink对PID进行仿真[15],该软件可以对仿真进行图像化现实,可以看到多久达到整定达
到稳态,和整定效果。
(一) 图形及程序
被控对象Go的传递函数的阶跃响应曲线如4.3图所示:



图4.3 被控对象Go的传递函数的阶跃响应曲线
clear all;
close all;
clc;
Go=tf(10,conv(1,conv([1,1],conv([1,3],[1,3]))));
sys=feedback((Go),1);
step(sys);
hold on;
title(‘被控函数Go的传递函数的阶跃响应曲线’);
比例环节Go的响应曲线如4.4图所示:



图4.4比例环节Go的响应曲线

clear all;
close all;
clc;
p1=[0.2,0.5,0.7,0.9,1.1,1.5];
Go=tf(10,conv([1,1],conv([1,3],[1,3])));
for i=1:6
sys=feedback((p1(i)*Go),1);
step(sys);
hold on;
end
title(‘比例环节Go_P1的响应曲线’);
legend(‘0.2’,‘0.5’,‘0.7’,‘0.9’,‘1.1’,‘1.5’);
box off

clear all;
close all;
clc;
I=[0.5,0.8,0.9,1.5,2,2.5];
Go=tf(10,conv([1,1],conv([1,3],[1,3])));
for i=1:6
sys=feedback((I(i)/Go),1);
step(sys);
hold on;
end
title(‘积分环节Go的响应曲线’);
legend(‘0.5’,‘O.8’,‘0.9’,‘1.5’,‘2’,‘2.5’);
box off
微分环节Go的响应曲线如4.7图所示:



图4.7微分环节Go的响应曲线
clear all;
close all;
clc;
D=[0.7,0.9,1.1,1.5,2,2.5];
Go=tf(10,conv([1,1],conv([1,3],[1,3])));
for i=1:6
sys=feedback((D(i)/Go),1);
step(sys);
hold on;
end
title(‘微分环节Go的响应曲线’);
legend(‘0.7’,‘0.9’,‘1.1’,‘1.5’,‘2’,‘2.5’);

box off
比例积分环节Go的响应曲线如4.8图所示:



图4.8比例积分环节Go的响应曲线
clear all;
close all;
clc;
p=0.5;
I=[0.1,0.5,0.7,1,2];
D=[1,2,3,4];
Go=tf(10,conv(1,conv([1,1],conv([1,3],[1,3]))));
for i = 1:4
sys=feedback((p*Go+D(i)*Go),1);
step(sys);
hold on;
end
title(‘比例积分环节Go的响应曲线’);
legend(‘0.1’,‘0.5’,‘0.7’,‘1.2’);
box off
比例积分环节Go(s)的响应曲线如4.9图所示:



图4.9比例积分环节Go(s)的响应曲线
close all;
clc;
P=0.7;
I=[0.2,0.8,1,1.5,1.8,2];
Go=tf(10,conv(1,conv([1,1],conv([1,3],[1,3]))));
for i=1:6
sys=feedback((P*Go+I(i)/Go),1);
step(sys);
hold on;
end
title(‘比例积分环节Go(s)的响应曲线’);
legend(‘0.2’,‘0.8’,‘1’,‘1.5’,‘1.8’,‘2’);
box off
比例微分环节Go的响应曲线如4.10图所示:



图4.10比例微分环节Go的响应曲线
clear all;
close all;
clc;
p=2;
I=[0.1,0.5,0.7,1,2];
D=[0.2,0.5,0.7,0.9];
Go=tf(10,conv(1,conv([1,1],conv([1,3],[1,3]))));
for i = 1:4
sys=feedback((p*Go+D(i)*Go),1);
31
step(sys);
hold on;
end
title(‘比例微分环节Go的响应曲线’);
legend(‘0.2’,‘0.5’,‘0.7’,‘0.9’);
box off
比例微分环节Go的响应曲线如4.11图所示:
图4.11比例微分环节Go的响应曲线



第三节 各个子程序设计
一、转向控制子程序
主程序对标志位进行了设定,对转向进行控制。
  本次使用了四个电感传感器,用于检测电感值得变化,即左边两个,右边两个。是进行如下设计可以转弯,主
要进行了两个分类,最左边的电感传感器和最右边的电感传感器为一组,靠中间位置的两个电感传感器为一组,分
别进行比较,计算。如下为程序的解释。
  分别使用了左电感值的检测大小和右电感值[16]的检测大小。C3和C5为一组,如果C5大于C3,即if**
(adc_left_c5>adc_right_c3),在if内,先使用了水平电感标志位inductor_level_difference = adc_left_c5-
adc_right_c3;如果标志位inductor_level_difference>60,可以用公式计算速度的大小speed=v*(adc_right_c3/
(float)adc_left_c5);
如果C3大于C5的电感值,即else if(adc_right_c3>adc_left_c5),与上面一样先计算水平电感标志位的大小
inductor_level_difference = adc_right_c3-adc_left_c5;再写一个判断为if(inductor_level_difference>60);
如果满足条件,即进入速度计算speed=v*(adc_left_c5/(float)adc_right_c3);将速度值传递给电机,使车辆转
向。
  C2和C6为一组,if(adc_left_c6>adc_right_c2),可以得到标志位的大小为inductor_vertical_difference =
adc_left_c6 - adc_right_c2;要进行转向,还需要一个判断,即if
(inductor_vertical_difference>250&&adc_left_c6>180),如果满足标志位大于250的同时,需要C6>180,才能对
转速进行计算speed=speedadc_right_c2/(float)adc_left_c6;或者当C6电感值直接超过300,即else if
(adc_left_c6>300计算速度公式speed=speedadc_right_c2/(float)adc_left_c6;同上,C2也是这样的计算公式。
二、速度控制子程序
  先设定了一个常量u8 constant_speed,当constant_speed=0时为弯道减速,当constant_speed=1时为恒速模
式。int16 v=300;设定了最高速度300(直线),定义了变化的速度为int16 target_speed = 400;而如何使速度达到
预期,则由电机控制,其变量名为former_left_v(左),former_right_v(右),先设定为float former_left_v=0,
former_right_v=0;即都为0 ,当检测电感值后,速度再进行变化。电机转速是由编码器[17]获得,为了达到要求,
先进行目标速度的设定set_pid_target(&pid,target_speed);该函数在bsp_pid.c里面进行了设定:
void set_pid_target(_pid *pid, float temp_val)
{
(*pid).target_val = temp_val; // 设置当前的目标值
}
Main.c内的set_pid_target(&pid,target_speed)函数设定了两个编码器,对其初始化。
  tim_encoder_init(TIM_3, TIM_3_ENC1_B04, TIM_3_ENC2_B05);//编码器。
   tim_encoder_init(TIM_4, TIM_4_ENC1_B06, TIM_4_ENC2_B07);//编码器。
设定以对应周期采集编码器的数值,tim_interrupt_init_ms(TIM_8, 5, 0x01, 0x01);最后发送PID的目标值:
delay_ms(50);(延时)
  set_computer_value(SEND_TARGET_CMD, CURVES_CH1, &target_speed, 1);
  set_computer_value(SEND_P_I_D_CMD, CURVES_CH1, &pid.Kp, 3);
使电机达到预期的转速,控制车辆加减速。
第四节 跑道元素设计
一、十字元素
当竖直电感大于0,竖直电感减去水平电感的值大于350为真的时候,即if(inductor_vertical_err>0&&
(inductor_vertical_err-inductor_level_err)>350),将权重设为0.95。
当竖直电感小于0,竖直电感减去水平电感的值小于-350为真的时候,即else if(inductor_vertical_err<0&&
(inductor_vertical_err-inductor_level_err)<-350),将权重设为0.95。
  或者当速度模式为转弯减速模式的时候,即else if(!constant_speed)。判断水平电感误差的大小,当小于830
时,使用八字电感控制速度。或者是直接给加速度一个定值,经过函数计算(在bsp_pid.c)。或者直接速度控制
speed=v。
二、环岛元素
  本次环岛设置了两个标志位[18]:环岛阀值的标志位(loop_flag=0),环岛阈值(loop_threshoid=4650)。
  先进行环岛检测,当满足:元素标志位为真,且竖直电感标志位大于环岛阈值标志位(4650)或者是竖直电感标
志位大于环岛阈值标志位减去700,同时需要满足环岛标志位为真。如下为该判断的程序: (!(element_flag)
&&inductor_level_sun>loop_threshoid||(inductor_level_sun>(loop_threshoid-700)&&loop_flag&(1<<5)))为真
的时候,进入环岛。赋值环岛标志位,清除路程、误差积分。前进到一定距离,然后判断出环岛if(loop_flag&
(0x07<<2)),当条件为真,则有清除拐点标志位,环岛标志位第一次检测,然后清除路程。第一次判断左右环岛
inductor_vertical_err<0,当满足条件,则进入第一次判断左右环岛,当左右环岛检查出错时,认为是大环岛,用
八字电感寻迹,其中先清除左右环岛标志位,然后进入环岛程序(须得判定为元素标志位为真,且环岛阈值的标志位
与(0x03)为真),使用速度积分来计算路程,将速度控制到300,使用PID,将电感权重控制到0.9。再来判断进入小环
岛((loop_flag&(0X03<<2))&&journey>55000),其内编写了判定是否入环,清除环岛标志位、清除路程。当路程达
到拐点(速度积分路程)10000),第二次检测左右环岛,与第一次的进行验证,当检测失败以后,程序直接认为为大
环岛,使用八字电感寻迹。最后清除左右环岛标志位。
三、三岔路口元素
  三岔设置了四个个标志位,一个为u16 fork_road_level_threshoid=750;该标志位为三岔水平阈值标志位,另
一个为 fork_road_vertical_threshoid,为三岔八字的阈值。还有fork_road_flag=0,为三岔标志位的标志位,还
有三岔1左拐0右拐的标志位ramp_flag=0。当!element_flag&&
(data_right_c3<fork_road_level_threshoid&&data_left_c5<fork_road_level_threshoid)&&
(data_left_c6>fork_road_vertical_threshoid&&data_right_c2>fork_road_vertical_threshoid)
&&inductor_vertical_difference<250)为真,判断内对三岔路口定义了一个标志位,三岔路中间定义了一个标志
位,转向清零,路程清零。
  三岔路口的标志位及各项清零工作做好,现在进入三岔内,有如下判断if(element_flag&(1<<0)),对路程进行
计算,将电感权重设定在0.8,速度设定在50。其内左拐的判断为if(fork_road_place),进入判断后,先设定当转
角速度小于某值之前给恒定误差,对速度进行控制,防止冲出去,电感权重为0.7,再对竖直和水平误差进行判断。
当达到转角结束以后,将电感权重改为0.5,速度降低到300,会感应到电磁减小,将增大水平、垂直电感的误差。
在三岔路口两辆车相会,判断语句为else if(journey>30000),即当速度积分路程大于30000时,如果满足条件,进
入判断。判断内先定义一个三岔路口积分标志位,会车标志位,清除前面三岔路口的标志位,转向、路程都清零。
再照前面三岔路口及路中的程序再写一遍,分为左进入三岔和右进入三岔。
四、车库元素
在开始对车库、入库和左入库和右入库的标志位进行了设定,即:
  u8 carbarn_flag=0; //车库标志位
  u8 carbarn_enter_flag=0; //入库标志位
  u8 carbarn_place=0; //入库1右拐0左拐
先是出车库,判断是否进入元素,使用元素标志位element_flag=1<<6;
当(element_flag&(1<<6)为真的时候,对各个值先进行初始化,定义如下:
target_speed=200; //速度控制
Inductor_smoothing_weight=0.5; //电感权重
journey+=encoder1_2_speed; //速度积分得路程
  turn_integral+=(encoder1_speed+encoder2_speed);//转向角度
inductor_vertical_err=0; //竖直误差归零
inductor_level_err=0; //水平误差归零
当汽车接近磁感线,即if(inductor_vertical_sun>200),进入判断
if(carbarn_place),carbarn_place是判断左拐还是右拐的标志位,判断为1,为右拐,如下程序为if
(carbarn_place)内。
inuctor_level_err=2000; //水平误差
else
inductor_level_err=-2000; //水平误差
如果出库失败,会出现出库路程过远或接近道路中间才反应过来,则退出出库。判断如下: if(journey>100000||
(inductor_level_sun>1000&&inductor_level_difference<500))
在判断内将清除标志位,路程清零,角度清零。
  出库完成后,跑完一圈,就需要入库了,依旧使用元素判定标志位element_flag,当判断为进入车库的标志位
为真,即if(element_flag&(1<<5)),会将权重设定为1,优先级最高,再用速度积分计算前进路程
journey+=encoder1_2_speed;水平误差和竖直误差进行归0,即inductor_level_err为0,inductor_vertical_err为
0,同时将速度值设为归0。当入库标志位为1,且速度积分的路程过远(超过范围),就后退,后退速度为80。
如果入库标志位为1且速度积分的路程为小于3000,就没有达到入库的地点,需要前进,速度为50。
当刚好达到要求(达到转向范围),即入库标志位为1且左右编码器之和的差值在-5到5之间,进行初始化,如下:
  target_speed=0; //速度控制
  carbarn_enter_flag|=1<<0; //开始转向
  journey=0; //路程清零
  turn_integral=0; //转向清零
  之后就是右拐进入车库了,当入库标志位和入库右转标志位都为真,将转向力度为500,速度为-15(减速)如何
速度积分的路程大于19000,则可以停车,入库成功,将速度、垂直电感误差和竖直电感误差设为0。左拐入库可参
照右拐。将左拐入库在程序中写下来了。
第五节 本章小结
  本章从程序流程图及主程序的开始讲起,如何检测电感,如何识别道路,如何进入环岛,如何判断入库,如何
进入三岔等。将各个元素具体写出来了,经过检测,各个元素完整跑了下来。

第五章 智能三轮小车的实物制作
第二节 电路焊接
一、预热
  第一步:将所需的电络铁调节到325°C,温度必须要缓慢上升(大约每秒升5度),主要用来下载焊锡丝沸腾和飞
溅,防止形成小锡珠,还有一些元器件的内部集成了很多元件,比如芯片受到高温的时间过长会使芯片烧毁,且容
易断裂。
第二步:使用助焊剂(膏),涂到焊盘上,即做到了对焊盘的清理,又使元器件更加容易焊接到焊盘上。
  将金属氧化物和某些污染从即将结合的金属和焊锡颗粒上清除。好的冶金学上的锡焊点要求“清洁”的表面。
当温度继续上升,焊锡颗粒首先单独熔化,并开始液化和表面吸锡的过程。这样在所有可能的表面上覆盖,并开始
形成锡焊点。
二、回流
  这个阶段最重要,当单个焊锡全部融化以后,聚集在一起形成液态锡,但是如果温度降下来以后,焊锡会很快
凝结成块状锡,但是在凝结之前和焊盘相接触后就会粘结在一起,当元件引脚与PCB焊盘间隙超过4mil,可能会使引
脚和焊盘分开,造成电路短路
三、冷却
冷却阶段,如果冷却快,锡点强度会稍微大一点,但不可以太快否则会引起元件内部的温度应力。
四、焊接元件
  本次焊接最艰难的是0603封装的电容、电阻和电感,焊接时,要在焊锡枪上挂锡,焊盘上也需要进行挂锡,之
后焊接会容易很多。芯片的引脚过于接近,一般要使用助焊剂和松香。不使用的话,会容易焊接失败,比如芯片在
高温下时间太长,烧坏。
第三节 实物调试
一、驱动板调试
  用开发板在两个引脚上输出对应的PWM波(一个脚为高电平时,一个脚为低电平),输入到PWM1_1和PWM1_2,再
将电机接到对应的引脚上。如果电机接上以后转动,说明电路起作用了。相应的测试同步到PWM2_1和PWM2_2,改变
对应PWM的占空比,测试是否能加减电机的速度。驱动电路板如5.1所示:



图5.1 驱动实物图

二、运放板
用万用表测电流,照上文硬件电路设计的运放板设计的公式计算放大倍数。测试能否达到1到101倍的放大倍数。运
放实物图如5.2图所示:



图5.2 运放板实物图
三、霍尔元件小板
  将输入引脚输入对应电流和电压,测试在未使用磁铁,输出引脚的对应电压,在正常情况下,输出引脚也是高
电平。再将磁铁靠近霍尔元件,当霍尔元件靠近磁铁后,电压直接拉低到零。经过测试,在磁铁未靠近霍尔元件,
输出引脚输出高电平,在磁铁靠近霍尔元件后,输出引脚直接被拉低。证明电路设计正常。霍尔原理图如5.3图所
示:



图5.3 霍尔元件实物图
第四节 整车组装
一、车模组装
本次使用的车模选用的是F型三轮车模,如5.4图所示



图5.4 整车实物图
  从下往上一次安装驱动板、主控板、运放板、核心板、蓝牙模块。在车头安装了霍尔元件电路板和电磁感应小
板。为了使主控板和小车牢牢的固定在一起,将在四个角落安装螺丝钉,打上热熔胶。
  将杜邦线安装在需要使用的引脚上,注意的是,如果杜邦线和排针接触不严,就需要更换杜邦线,保证线路不
出现断路现象。而在车头,为了使车辆能感应到电磁线,将用两根棒子来支撑电磁感应电路板,打上热熔胶,固定
电感,使电感牢牢的固定在一点,可以更好的整定PID参数。

第五节 本章小结
本章对硬件元件进行了选购,之后就是将电路板发板,让工厂生产。硬件材料和电路板到手以后,又进行了焊
接、调试。克服了一个又一个困难,比如电路焊接出现问题,电路电压达不到预期,驱动板不能驱动电机等等问
题。还对车辆进行了组装,对于前文的硬件设计,在现实中有了落脚点,在调试中车辆在道路上跑了起来,圆满完
成了预期的目标。
结 论
  智能车作为一个老生常谈的话题,车智不智能,安不安全,能不能让人从轿车的驾驶中脱离出来,这都是人们
对未来的期望。中国的广大市场中,世界的广大市场中,藏着对智能车的无限需求。
  本设计从最开始的立项,到最后整车达到使用目标,经过了三到五个月的时间。其中遇到了各种困难,比如该
三轮智能小车该实现什么功能,在深思熟虑过后,该车定位为能在道路上跑,能对遇到三岔路口、环岛、上坡、弯
道,进行识别,还要完成两辆车的信息交互。三轮智能车选最终选定了用电感采集电磁信号,然后进行道路的识
别。选用蓝牙模块,实现两车的信息交互。硬件的选型,经过多次对需要完成的任务的需求,网上资料的查取,最
后如前文,实现了对硬件的选型。原理图、原理图库、封装、PCB的绘制,都经过了很长的时间。如何绘制程序的编
写:芯片引脚定义、PID算法编写、各种滤波方式的算法编写。PID的调试:车辆奔跑时的状态如果不对,需要对PID
(参数)进行更改,反复多次才能达到控制车辆的目的,调整参数从项目开始贯彻到了结束。
  虽然将成品做出来了,但是有很多地方都不是很完美,还是需要优化,比如现在车辆功能较少,对很多实际问
题还无法解决。还有模块的数量太少,比如摄像头设计出来了,但是没使用到。还有两机通讯问题需要深化解决。
致 谢
  岁月如歌,光影似箭,短短的本科生涯即将结束,回望在校生活的点点滴滴,不禁让我感慨时间的飞逝,这期
间的点点滴滴历历在目,其中有论文写作的艰辛,,有收获的快乐。行文自此,面对着这份代表我本科学习成果的
毕业论文,心中有些许不安,唯恐辜负师长与亲友的厚望。
  在论文即将完成之际,我要对那些曾经帮助 过我的人道一声感谢,并非出于客套,而是发自内心的感动。首先
我要感谢我的导师张姣老师,从论文开始的初期,到论文的结束,张老师都倾注了极大的精力和心血,从文章的结
构,还有文章的细节都是老师一步步指导我,并且提出了很多很宝贵的意见,张老师严谨的治学态度和对学生负责
的敬业精神,都让我受益颇多,我想张老师给我的不仅仅是知识和方法,更重要的是对我品德、生活态度的感染,
39
将使我受益终生。其次我要感谢智能工程学院的各位老师对我知识的教育和启迪,从他们丰富的、生动的授课中,
我获得了大量的专业知识,同时感谢那些师姐、师兄及同窗们,他们给予了我很多帮助和关心,还要感谢那些毕业
论文的参考文献中所列到的专家和学者们,感谢他们对我这篇论文提供了莫大的帮助。才最终完成论文。
  最后我要感谢我的家人对我的学业的支持和鼓励,感谢父母对我的关照和鼓励,正是他们的理解和关怀,使我
安心顺利地完成了学业。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/QQ2083558048/article/details/146397232

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

4188

帖子

3

粉丝