基于ARM CORTEX M4的磁导航自主路径识别系统.docx
《基于ARM CORTEX M4的磁导航自主路径识别系统.docx》由会员分享,可在线阅读,更多相关《基于ARM CORTEX M4的磁导航自主路径识别系统.docx(58页珍藏版)》请在冰豆网上搜索。
基于ARMCORTEXM4的磁导航自主路径识别系统
摘要
本文详细介绍了基于ARMCortexM4的磁导航自主路径识别系统的设计与实现过程。
本系统以飞思卡尔32位单片机MK60DN512ZVLL10为控制核心,通过电感检测赛道上通电导线产生的磁场来判断赛道信息,从而控制小车自主行驶。
对电感切割磁场产生的信号,先进行了选频,然后使用运放对信号进行放大,再利用肖特基二极管对交流信号进行检波,最后送入AD中获得小车在赛道上的位置信息。
在控制小车自主循迹中,方向与速度控制上分别使用了位置式PID与增量式PID。
在调试PID参数以及系统时,还使用了上位机软件。
关键词:
磁导航自主路径识别MK60DN512ZVLL10PID
Abstract
ThispaperdescribesthedesignandimplementationprocessbasedonARMCortexM4magneticnavigationpathindependentrecognitionsystem.ThissystemMK60DN512ZVLL10Freescale32-bitmicrocontrollertocontrolthecore,throughtheinductorwireproducesamagneticfielddetectioncircuitisenergizedtodeterminethetrackinformationtocontrolcarautonomousdriving.Cuttingthemagneticfieldgeneratedbytheinductorsignal,thefirstforaselectedfrequency,andthenusetheopamptoamplifythesignal,andthenusetheACsignalSchottkydiodedetector,andfinallyintotheADpositioninformationobtainedinthecaronthetrack.Inself-controlcartrackinginthedirectionandspeedcontrolareusedpositionalPIDandincrementalPID.PIDparametersduringcommissioningandsystem,alsousedthePCsoftware.
KeyWords:
magneticnavigationpathindependentrecognitionMK60DN512ZVLL10PID
目录
摘要I
AbstractII
引言-1-
1硬件电路-2-
1.1单片机最小系统板-2-
1.2电源模块-2-
1.2.1LM1117-2-
1.2.2LM2940-3-
1.2.3LM2576-ADJ-3-
1.2.4主板总体设计-4-
1.3电机驱动模块-4-
1.4传感器模块-6-
1.4.1磁感应传感器-6-
1.4.1.1选频电路设计-6-
1.4.1.2放大电路设计-7-
1.4.1.3检波电路设计-7-
1.4.1.4磁感应传感器整体设计-7-
1.4.1.5磁感应传感器的实际电路设计-8-
1.4.2速度传感器-8-
1.4.3起跑线检测传感器-8-
2机械调校-10-
2.1舵机的安装-10-
2.2前瞻的固定-10-
2.2.1电感的排布-10-
2.2.2前瞻的长度-11-
2.3编码器的安装-11-
2.4降低重心-11-
3软件编写-13-
3.1开发环境-13-
3.2程序下载-13-
3.3底层驱动编写-13-
3.3.1GPIO模块-14-
3.3.1.1打开时钟-14-
3.3.1.2设置引脚功能-15-
3.3.1.3GPIO口方向设置-15-
3.3.2PIT模块-16-
3.3.2.1时钟设置-16-
3.3.2.2使能PIT模块-16-
3.3.2.3计算并设定定时器初始值-16-
3.3.2.4使能PIT定时中断-17-
3.3.3ADC模块-17-
3.3.3.1ADC设置步骤-17-
3.4控制模块-18-
3.4.1方向控制-18-
3.4.2速度控制-18-
3.4.3电感值处理-19-
3.4.4丢失处理-20-
3.5调试系统-20-
3.5.1调试工具-20-
3.5.1.1上位机软件-20-
3.5.2.2无线串口-21-
3.5.2PID参数整定-21-
结论-24-
参考文献-25-
致谢-26-
附录A-27-
附录B-29-
引言
近年来,无人驾驶汽车发展的飞速,所谓无人驾驶汽车就是车可以自动驾驶无需人工控制。
国外比较有代表性的是谷歌无人驾驶汽车,通过各种传感器检测到其他车辆。
国内的无人驾驶汽车也发展的比较快,比较有代表性的就是,2011年的国防科技大学发明的无人驾驶汽车。
无人驾驶汽车有很好的发展前景,我们不需要再亲自开车,就有了更多的时间干其他事情,无人驾驶汽车还可以用于送货等。
但是无人驾驶汽车还有很多难题恶待解决,比如无人驾驶汽车是否可以应对紧急情况,这就需要无人驾驶汽车变得更加智能。
本论文详细介绍了采用飞思卡尔32位的MK60DN512ZVLL10作为控制核心,通过检测道路中心的通电导线的磁场使小车实现自主路径识别,对研究无人驾驶汽车具有现实意义。
其实现了通过电感检测磁场来获取赛道信息,并利用获取的赛道信息来控制舵机转向,即控制小车行驶方向。
为了让小车更快的自主循迹并且不冲出赛道,对速度还进行了控制,比如直道加速、弯道减速等。
1硬件电路
硬件系统主要是由最小系统板,放大电路,主板,电机驱动等组成。
在设计硬件电路原理图与PCB时,使用的是AltiumDesigner9。
1.1单片机最小系统板
Kinetis芯片是首款基于ARMCortexM4内核的微控制器,基于飞思卡尔创新的90nm薄膜存储器(TFS)闪存技术,具有独特的Flex存储器(可配置的内嵌EEPROM)。
Kinetis芯片融合了最新的低功耗革新技术,具有高性能、高精度的混合信号能力,宽广的互连性,人机接口和安全外设。
我使用的最小系统板是Kinetis系列的MK60DN512ZVLL10,外观如图1.1所示。
图1.1MK60DN512ZVLL10
1.2电源模块
电源模块好比是大厦的基石,小车的稳定运行是以电源模块稳定供电为基础的。
为小车供电的是信号为7.2V2000mAhNi-Cd电池,需要提供给单片机、放大电路等3.3V的电源,提供给电机驱动、编码器等5V电源。
因此,我们采用了低压差集成稳压器,低压差集成稳压器是线性稳压器的一种,相比于传统的线性稳压器、开关式电压稳压器等有结构简单、线性度好等优点。
1.2.1LM1117
为了给单片机与传感器提供3.3V的电压,我们选用了三端稳压器LM1117。
LM1117输出电压有可调式和固定式,我们使用的是3.3V固定输出电压。
对于给传感器模块供电电路也是相同的。
原理图如图1.2所示。
图1.23.3V单片机电源
1.2.2LM2940
硬件电路上多处用到了5V的电源,包括电机驱动、编码器、无线串口等,还提供给了单片机与传感器的输入电压。
我们选用了低压差集成稳定器LM2940来提供5V电源,电路原理图如图1.3所示。
图1.35V电源
1.2.3LM2576-ADJ
舵机的额定工作电压为5V,为了能让舵机反应更快、更灵敏,我们通常会增大给舵机的电压,我们给舵机提供的电压是6V,使用的是开关式电源变换器LM2576-ADJ,ADJ的意思就是可以调节。
可通过调节R6可变电阻来改变输出电压。
电路原理图如图1.4所示。
图1.46V舵机电源
1.2.4主板总体设计
主板总体供电示意图如图1.5所示,实物图如图1.6所示。
图1.5电源供电示意图
图1.6主板实物图
1.3电机驱动模块
智能小车的动力来源于一台直流电机,电机不仅要有较快的速度,还需要有较高的加速度,因此对电机的转速要求较高。
实现直流电动机正反转的电路有很多,比较常用的电路就是H桥驱动电路,因其形状类似于字母”H”而得名。
H桥驱动电路示意图如下图所示。
从电路图上,很容易看出,当开关Q1、Q4接通时,电流从左往右流过电机,电机正转;当开关Q3、Q2接通时,电流从右往左流过电机,电机反转。
由此来控制直流电机的正反转。
H桥示意图如图1.7所示。
图1.7H桥驱动电路示意图
但是,当电机运行时,必须要保证Q1、Q2以及Q3、Q4不能同时导通,可使用图1.8电路示意图来解决。
图1.8H桥控制电路示意图
驱动芯片我用的是英飞凌公司的BTS7960集成半桥驱动器,BTS7960有着出色的性能和极高的稳定性。
使用两片BTS7960搭成一个H桥驱动电路,来控制电机。
电机驱动原理图如图1.9所示,实物图如图1.10所示。
图1.9电机驱动原理图
图1.10电机驱动实物图
1.4传感器模块
1.4.1磁感应传感器
小车需要通过检测道路中心的通有100mA导线的磁场来实现路径识别,使用的交变电流频率为20kHz,那么磁场检测就显得尤为重要了。
现在测量磁场的方法很多,可以通过电感、磁阻、霍尔元件等交变磁场传感器来测量磁场。
我使用的是10mH工字型电感,如图1.11所示。
图1.1110mH工字型电感
1.4.1.1选频电路设计
电感切割磁场会产生感应电动势,但是这个感应电动势信号太弱,只有几十毫伏,而且噪声很多,会受到周围不同频率的磁场的干扰。
因此,电感切割磁场产生的电动势需要进行选频,减少其他干扰信号的影响。
利用电感电容即可组成简单的并联谐振电路来实现选频电路,谐振频率要求为20kHz,则可以通过公式1-1计算出C的值。
(式1-1)
将L=10mH,f=20000Hz代入公式,可以得到C=6.3nF左右,在市场上能够买到的最为接近6.3nF电容的标称电容为6.8nF。
电路图如图1.12所示。
图1.12并联谐振电路
1.4.1.2放大电路设计
选频后的信号还是很弱,因此为了能够更加准确地获得赛道信息,还需要对感应电压进行进一步的放大,这也是信号检测最主要的部分。
可以选用运算放大器进行电压放大,运放在选型上应该选择低噪音、动态范围大、高速、单电源、增益带宽积较高的运放。
运放的选择有很多,我们试过由TI公司生产的LMV358,虽然LMV358价格便宜,容易购买,但是其增益带宽积仅有1MHz,在20kHz的信号频率下,开环增益仅有50倍,而一般放大倍数要大于100倍,所以性能一般。
在运放芯片的不断尝试中,我们最终选择了性能卓越的OPA2350,也是TI公司生产的高速、单电源、至轨运放,其增益带宽积达到了38MHz,在20KHz频率下开环增益达到了1900倍,这足以看出来OPA2350性能非常的出色。
1.4.1.3检波电路设计
经过选频和放大后的电压信号仍然是交流信号,如果直接将交流信号接入单片机的AD端口,使用单片机直接采样交变电压信号的话,采集数据的处理方面比较麻烦。
所以,一般将交流信号整流为直流信号再送入AD中进行处理。
可以使用肖特基二极管,对信号进行检波处理,以便可以获得更大的动态范围。
1.4.1.4磁感应传感器整体设计
从电感切割磁场产生感应电动势要经过选频、放大、检波,最后再送入AD中。
过程如图1.13所示。
图1.13放大电路过程
1.4.1.5磁感应传感器的实际电路设计
放大电路使用的运放芯片是OPA2350,电感切割磁场产生的电动势经过选频、放大、检波等步骤。
设计的电路图如图1.14所示,实物图如图1.15所示。
图1.14放大电路原理图
图1.15放大电路实物图
1.4.2速度传感器
小车在自主循迹过程中,速度的控制很重要。
小车在直道上加速行驶,进入弯道后减速行驶,否则很容易冲出赛道。
而在控制小车速度的环节上,首先得获得小车的当前速度,然后才能决定是加速还是减速。
用于测速的传感器通常有霍尔传感器、光电传感器、测速电机、编码器四种,我们选用了测量精度较高,稳定性较好的编码器来进行测速。
根据精度要求,我们购买了360线的欧姆龙编码器,为数字量输出,可供单片机直接采集以获得速度值。
1.4.3起跑线检测传感器
智能小车除了能够实现自主循迹外,还要有跑完一圈后自动停车功能。
电磁组的赛道在起跑线处有永磁铁,用来检测起跑线。
选择干簧管来检测永磁铁无疑是最简单的方法,干簧管我也试了很多种,有的好用有的不好用,好不好用是以可以检测的最高高度衡量的,而且有的干簧管外表是玻璃的,很容易打碎,经过选择,发现了外面有塑料包装的干簧管,不容易损坏,我最终使用的是这个,检测高度大约有1.5CM,这个高度已经足够了。
当然磁铁的大小不同,稍微有些差异。
2机械调校
2.1舵机的安装
小车转向是通过舵机来驱动的,所以舵机的安装会影响到小车转向的角度和灵敏度。
由于小车上面的空间有限,为了合理利用,将舵机安装位置挪到了两前轮之间。
舵机的固定需要支架,使用了铝合金材料的支架,不仅结实而且特别轻,不会使小车的重心向前移。
舵机的安装如图2.1所示。
图2.1舵机的安装
2.2前瞻的固定
2.2.1电感的排布
智能小车的前瞻应该尽量长点,正所谓“站得高看得远”,足够的前瞻量能提前获得赛道的信息以便更好的控制小车。
当使用多个传感器的时候,传感器之间的距离越大,便越能获得更多的赛道信息。
我使用的是两个电感的方案,两个电感之间的距离为25cm左右,如图2.2所示。
图2.2电感的排布
2.2.2前瞻的长度
由于车模不限制长度,所以为了能够提前获取赛道信息以便更快的响应,我增加了前瞻的长度。
当然,并不是说前瞻越长越好,而是需要一个合适的长度,与控制算法有关系,要结合实际情况。
但是,短前瞻效果肯定不好。
前瞻的材料使用的是碳纤维杆,为了减轻前瞻的重量,使小车的中心不往前移,我试了不同直径的碳纤维杆,以小车行驶时前瞻不颤动为标准,选用了直径为4*2mm的规格。
前瞻的固定如图2.3所示。
图2.3前瞻的固定
2.3编码器的安装
编码器的安装需要注意的事项就是齿轮的咬合,包含编码器与差速、差速齿轮与电机。
调节齿轮之间的距离,然后打开电机听声音可以判断齿轮咬合的松紧。
如果转动声音尖锐,则表示齿轮咬合的太紧。
如果声音零碎,则表示齿轮咬合的太松。
齿轮咬合的太松,容易损坏齿轮,齿轮咬合的太紧,影响电机。
所以,调整齿轮咬合,以松紧合适为准,既不松动,也不卡滞。
编码器的安装如图2.4所示。
图2.4编码器的安装
2.4降低重心
为了让小车运行稳定,转向灵活,过弯时不侧翻,通常会降低小车的重心。
小车上最重的就是电池了,所以为了降低小车的重心,我将电池的高度往下降了,并且位置往后移动一点。
还去掉了小车上一些无关紧要的零件,最大限度的减轻小车的重量,使小车运行起来轻便,转向灵敏,加速减速更快。
电池的安装如图2.5所示。
图2.5电池的安装
3软件编写
3.1开发环境
Kinetis是基于ARMCortexM4核心的,可以使用飞思卡尔公司推出的面向嵌入式应用开发的软件工具CodeWarrior(简称CW),还可以选用第三方的开发环境,我使用的是嵌入式系统开发工具IAR。
软件界面如图3.1所示。
图3.1IAR界面
3.2程序下载
程序写好之后,还需要下载到单片机中,我们使用的是USB接口的J-LINK下载器,将电脑与单片机通过J-LINK连接后,在IAR界面的右上角有个下载按钮,点击下载即可。
IAR程序下载界面如图3.2所示。
图3.2IAR程序下载界面
3.3底层驱动编写
Kinetis芯片是首款基于ARMCortexM4内核的微控制器,基于飞思卡尔创新的90nm薄膜存储器(TFS)闪存技术,具有独特的Flex存储器(可配置的内嵌EEPROM)。
Kinetis芯片融合了最新的低功耗革新技术,具有高性能、高精度的混合信号能力,宽广的互连性,人机接口和安全外设。
Kinetis系列微控制器第一阶段产品有五个系列,如图3.3所示。
图3.3Kinetis微控制器产品组合
3.3.1GPIO模块
GPIO即输入输出端口,常用于输入或输出逻辑信号。
3.3.1.1打开时钟
使用GPIO需要先启用该端口的时钟,否则无法使用,而时钟需要通过SIM模块的SIM_SCGC5寄存器设置,SIM_SCGC5寄存器图3.4所示。
图3.4SIM_SCGC5寄存器
将SIM_SCGC5寄存器的第9、10、11、12、13位设置为1,IO口模块获得系统时钟,然后才能正常工作。
可以使用宏定义来实现,不容易出错。
宏定义的代码如下:
#defineSIM_SCGC5_PORTA_MASK0x200u
#defineSIM_SCGC5_PORTB_MASK0x400u
#defineSIM_SCGC5_PORTC_MASK0x800u
#defineSIM_SCGC5_PORTD_MASK0x1000u
#defineSIM_SCGC5_PORTE_MASK0x2000u
SIM_SCGC5寄存器的设置代码如下:
SIM_SCGC5|=SIM_SCGC5_PORTA_MASK|SIM_SCGC5_PORTB_MASK|SIM_SCGC5_PORTC_MASK|SIM_SCGC5_PORTD_MASK|SIM_SCGC5_PORTE_MASK;
3.3.1.2设置引脚功能
Kinetis系列的单片机的IO口一般都有复用功能,所以我们只有通过设置启用GPIO功能,IO口才能使用,所以打开时钟之后就需要将使用的引脚设为GPIO模块,通过设置引脚控制寄存器(PORTx_PCRn)来实现。
该寄存器如图3.5所示。
图3.5PORTx_PCRn寄存器
引脚复用功能通过设置MUX即可,将MUX设为1则该引脚GPIO功能即启用。
代码如下:
PORTE_PCR0=0x00000100;//E0引脚设置为GPIO模式
还可以通过宏定义的方式,宏定义如下:
#definePORT_PCR_MUX
(1)0x00000100
3.3.1.3GPIO口方向设置
大多数单片机的IO口都是双向的,当然功能强大的Kinetis系列的单片机也不例外。
在使用IO口前,需要设置IO口为输入或者输出,可通过设置IO口方向寄存器,即GPIOx_PDDR寄存器来确定IO口为输入还是输出。
GPIOx_PDDR寄存器如图3.6所示。
图3.6IO口方向寄存器GPIOx_PDDR
其中,PDD为引脚方向设置位,PDDx=1是将引脚x设置为输出,PDDx=0是将引脚x设置为输入。
具体代码如下:
GPIOE_PDDR|=0X00000001;//E0设置为输出
3.3.2PIT模块
中断程序的作用是,中断发生后,当前程序会被立即暂停,然后进入中断程序,等中断服务程序执行完毕,再恢复现场,并回到断点处继续执行刚才的程序。
不同的中断源,触发中断的事件也不同。
在单片机的应用中,经常会用到的一种中断就是定时中断,当定时时间到时则触发中断。
定时中断在智能车中最主要的应用就是测速,而Kinetis中的PIT模块用来做简单的定时是最简单的一种。
PIT模块即周期定时模块,主要功能是用来产生定时中断。
定时中断的原理是通过对总线时钟进行计数,当计数递减到0时即产生中断,我们可以通过给每个计数器赋予不同的初值来获得想要的中断周期,每次中断后,计数器便会自动加载我们自己设定的初值,如此反复即实现了定时中断的功能。
3.3.2.1时钟设置
如果要使用定时中断的话,就需要先打开时钟。
通过寄存器SIM_SCG6的设置可以打开PIT模块的时钟,将寄存器SIM_SCG6的第12~15位设置为1即可打开PIT时钟,具体代码如下:
SIM_SCGC6|=SIM_SCGC6_PIT_MASK;//打开pit时钟
其中SIM_SCGC6_PIT_MASK为宏定义:
#defineSIM_SCGC6_PIT_MASK0x800000u
3.3.2.2使能PIT模块
开启PIT模块的时钟之后,需要使能PIT模块,通过设置PIT模块控制器即PIT_MCR来实现,PIT_MCR寄存器如图3.7所示。
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Read
MDIS
FRZ
Write
Reset
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
图3.7PIT_MCR寄存器
其中,MDIS为模块使能位,默认为1,1为禁止状态,将其置0即可。
具体代码如下:
PIT_MCR=0;//PIT模块使能
3.3.2.3计算并设定定时器初始值
下面便要设定定时器的初始值来实现自己想要的定时周期了。
因为每次中断重新载入计数器初始值需要一个时钟周期,然后递减到0,所以我们在计算计数器初始值时需要考虑这个额外的时钟周期,即每两个周期中断一次。
由此可得:
计数初值LDVAL=(定时周期/模块时钟周期)-1
或者:
计数初值LDVAL=(定时周期*模块时钟频率)-1
将计数初值LDVAL赋值给定时器初值寄存器PIT_LDVALn即可,具体代码如下:
PIT_LDVAL0=time*60000-1;//计数器初始化,time为中断周期,单位ms
3.3.2.4使能PIT定时中断
最后还要使能定时器,使能中断。
用于设置对应通道的定时器是否使能以及是否产生中断请求的寄存器为定时器控制寄存器PIT_TCTRLn,如图3.8所示。
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Read
TIE
TEN
Write
Reset
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0