您的当前位置:首页正文

电气072队技术报告

来源:画鸵萌宠网


第五届“飞思卡尔”杯全国大学生

智能汽车竞赛

技 术 报 告

学 校:成都信息工程学院 队伍名称:电气072队 参赛队员:安俊洁 周飞 杨建 指导教师:王国江 刘鹏

关于技术报告和研究论文使用授权的说明

本人完全了解第五届全国大学生“飞思卡尔”杯智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。

参赛队员签名:

带队教师签名:

日 期:

-2-

目录

第一章 引言 ..........................................................................................................1

1.1背景介绍 ..................................................................................................1 1.2文献综述 ..................................................................................................1 1.3论文结构 ..................................................................................................1 第二章 智能车的总体设计方案 ..........................................................................2

2.1 电磁组的介绍 .........................................................................................2 2.2 方案的选择 .............................................................................................2 第三章 硬件电路的实现 ....................................................................................4

3.1 电源模块 .................................................................................................4 3.2 电机驱动电路 .........................................................................................5 3.3 测速模块 .................................................................................................5 3.4 HC9S12XS128MAA电路.......................................................................6 第四章 道路信号的采集与传感器的布局 ..........................................................7

4.1 赛道磁场的分析 .....................................................................................7 4.2 传感器的选型 .........................................................................................7 4.3 磁场信号的检测 .....................................................................................8 4.4 传感器的布局 .........................................................................................8 第五章 软件的实现 ............................................................................................10

5.1 赛道信息的采集与数据分析 ...............................................................10 5.2 转向控制 ...............................................................................................12 5.3 速度控制 ...............................................................................................16 第六章 系统的调试 ............................................................................................19 第七章 车模的改装 ............................................................................................20

7.1 轮距的调节 ...........................................................................................20 7.2 舵机的调节 ...........................................................................................20 7.3 小车改装过后的各种参数 ...................................................................21 第八章 总结 ........................................................................................................22

8.1 制作过程的总结 ...................................................................................22 8.2 不足与改进 ...........................................................................................22 参考文献 ..............................................................................................................23 附件A 源代码 ....................................................................................................24

-3-

第一章 引言

1.1背景介绍

全国大学生智能汽车比赛是经全国高等教育司研究,委托高等学校自动化专业教学指导分委会主办的,旨在培养创新精神、协作精神,提高工程实践能力的科技活动。

比赛要求在组委会提供统一智能车竞赛车模、单片机HCS12开发板、开发软件Code Warrior和在线调试工具的基础上制作一个能够自主识别路线的智能车,它将在专门设计的跑道上自动识别道路行驶。中心目标是不违反大赛规则的情况下以最短时间完成单圈赛道。

1.2文献综述

智能车大赛主要解决的问题就是如何把黑线从赛道中提取出来,提取出赛道后采用什么控制策略在规则允许的条件下以最快的时间跑完赛道。根据规则 我们参阅了许多论文资料,如李仕伯、马旭、卓晴的基于磁场检测的寻线小车传感器布局研究,张昊飏、马旭、卓晴的基于电磁场检测的寻线智能车设计,卓晴的智能汽车自动控制器方案设计等等。还着重学习了有关S12 和控制策略方面的书籍,如邵贝贝的单片机嵌入式应用的在线开发方法、胡寿松的自动控制原理以及运动控制等书籍来完善自己的理论水平以提高工作效率。

1.3论文结构

报告从硬件模块与软件模块两个方面论述整个车模制作过程及技术功能,整个智能车系统被分为上层算法,数据处理算法,接口程序,硬件电路。第一章引言主要介绍了大赛背景、论文结构。第二章主要介绍了总体设计方案。第三章硬件电路的实现。第四章道路信号的采集与传感器的布局。第五章软件的实现。第六章系统调试主要介绍了对车模的整体调试过程。第七章车模改装。第八章总结了调试的心得体会。

-1-

第二章 智能车的总体设计方案

本次比赛要求制作一个能自主识别线路的智能车,共有三个组别,分别为光电组、电磁组、摄像头组。

2.1 电磁组的介绍

电磁组是第五届新增加的一个比赛,竞赛车模需要能够通过自动识别赛道中心线位置处由通有100mA 交变电流的导线所产生的电磁场进行路径检测。除此之外在赛道的起跑线处还有永磁铁标志起跑线的位置。

2.2 方案的选择

我们选择了电磁组,在传感器的选择上,经过我们对各种传感器检测磁场的精度,还有其频率响应、尺寸、价格、功耗以及实现的难易程度进行考虑,最终我们选择了电磁感应线圈的方案,它具有原理简单、价格便宜、体积小(相对小)、频率响应快、电路实现简单等特点。

感应线圈检测的信号经过谐振、放大、检波过后测量其输出电压,线圈在赛道线不同的位置输出的电压不同,这样就可以判断出车模处于赛道的位置,然后控制车模的转向以及加减速。

此次比赛的最终目的就是在规则允许下一最短时间跑完规定赛道路程,然而小车限制了长度,使得电磁组的前瞻变得很小(相对于光电组和摄像头组),这样电磁小车就不能很明显的切内道过弯,所以我们从开始做车的思想就是让小车能在高速运行中巡线跑,以最短的时间完成比赛。为了使小车很稳定的加减速,于是我们采用了速度闭环控制。下图为系统方框图:

-2-

感应线圈 谐振、放大、检波 AD 测速脉冲 参数设置 光栅测速 HC9S12XS128MAA PWM PWM 拨码开关 电机 电机驱动 舵机 图2.2 系统方框图

可以每一节都加一些小结

介绍本章节都讲了写什么比如

你这节就讲了方案的去确定 最后的方案

-3-

2453第三章 硬件电路的实现 463.1 电源模块 本次比赛使用的电源是7.2V的电池供电,而我们使用的单片机供电电压为5V,舵机的额定电压为6V。因此需要我们将7.2V的电压转换成5V和6V的电压。 由于电机频繁的加减速,可能使得电池的电压变化很大或降低,如果不选用性能很好的稳压芯片,可能使稳定的电压低于5V,从而使得单片机重启,而且单片机需要的电流也不是很大,所以我们采用了LM2940-5V稳压芯片为单片机供电,LM2940是线性稳压器件,能在较低压差下稳定的工作。该芯片的典型应用电路如图3.1所示: J1LM2940-5INPUTPortC1 0.47u1VinVout3OUTPUT-5V C2 22uGND图3.1 LM2940应用 由于舵机要不停的转动,所以需要的电流比较大,因此我们采用了LM2576-ADJ芯片稳压,该芯片为开关型稳压,输出电压可调,最大电流为3A,具有热关闭和限流保护作用,工作效率高,完全满足了舵机的要求,该芯片的典型应用电路如图3.2所示; LLM2576-ADJOOFFGN/DINPUT1FEEDBACKOUTPUT42L1OUTPUT-6V100uHC21000uFR1+VINC1100uF35D1图3.1 LM2940应用图 DIODE SCHOTTKY103图3.2 LM2576应用图 2Title-4- SizeBDate:File:9-Aug-2010 Sheet of E:\\学习\\飞思卡尔\\飞思卡尔\\我们制作\\dianqi072.ddbDrawn By:4NumberRe23

33.2 电机驱动电路 加上一些选择理由 45 电机驱动原理图如图3.3所示 由单片机PWM模块输出的两路PWM信号与HEF4011相连接。我们使用HEF4011来作为MOS管驱动芯片,用于电平转换。四只大功率MOS管构成H桥, PWM占空比大,则转速高;PWM占空比小,则转速低。电路中MOS驱动芯片和MOS管都工作在开关状态,开关损耗小。当PWM1为高电平、PWM2为低电平时,Q1导通、Q3截止、Q2截止、Q4导通,电机正转 ;当PWM1为低电平、PWM2为高电平时,Q1截止、Q3导通、Q2导通、Q4截止,电机反转。当PWM0和PWM1同时为高电平或低电平时无电流,电机不转。 7.2VCCR1R247K47K312U?AAYBHEF401112313U?DAYBHEF4011Q211Q1MOSFET PMOSFET P1U?BAYBHEF4011U?CAYBHEF40111224PWM15PWM2684910MOTOR ACQ3MOSFET NQ4MOSFET N图3.3 电机驱动电路 3.3 测速模块 测速模块主要是由红外对管和光栅组成,由于红外对管输出的电压只有2V-3V不符合单片机检测的要求,所以我们使用了比较器,将红外对管输出的波形整形,于是我们选用了LM393做了一个比较器。如图3.4所示: 5VPT7R1300R21MR31234321CON3103R410KJ1OUT1IN1-IN1+GNDLM393VccOUT2IN2-IN2+8765J2 Title SizeBDate:File:-5- Number7-Aug-2010 SheeE:\\学习\\飞思卡尔\\飞思卡尔\\我们制作\\电机驱动电路Dra\\MO

图3.4 测速电路

3.4 HC9S12XS128MAA电路

因为在电路设计过程中发现xs128单片机(144引脚)的所有的引脚不是都会被用到,所以使用了汽车及芯片MAA(80引脚),而且这块板子的大小可以减小很多,所以质量更为轻便。

图3.5 HC9S12XS128MAA实物图

图3.7 HC9S12XS128MAA 原理图

-6-

第四章 道路信号的采集与传感器的布局

4.1 赛道磁场的分析

根据麦克斯韦电磁场理论,交变电流会在周围产生交变的电磁场。智能汽车竞赛使用路径导航的交流电流频率为20kHz,产生的电磁波属于甚低频(VLF)电磁波。甚低频频率范围处于工频和低频电磁破中间,为3kHz~30kHz,波长为100km~10km。如下图4.1所示:

图4.1 直线磁场分布

而在十字交叉上时磁场会发生叠加,如下图4.2所示:

图4.2 十字交叉磁场分布

4.2 传感器的选型

现在我们有很多测量磁场的方法,磁场传感器利用了物质与磁场之间的各种物理效应:磁电效应(电磁感应、霍尔效应、磁致电阻效应)、磁机械效应、磁光效应、核磁共振、超导体与电子自旋量子力学效应。下面列出了一些测量原理以及相应的传感器:

(1) 电磁感应磁场测量方法:电磁线磁场传感器,磁通门磁场传感器,磁阻抗磁场传感器。

(2) 霍尔效应磁场测量方法:半导体霍尔传感器、磁敏二极管,磁敏三极管。 (3) 各向异性电阻效应(AMR)磁场测量方法。

(4) 载流子自旋相互作用磁场测量方法:自旋阀巨磁效应磁敏电阻、自旋阀三极管磁场传感器、隧道磁致电阻效应磁敏电阻。

(5) 超导量子干涉(SQUID)磁场测量方法:SQUID 薄膜磁敏元件。

-7-

(6) 光泵磁场测量方法:光泵磁场传感器。 (7) 质子磁进动磁场测量方法。 (8) 光导纤维磁场测量方法。

以上各种磁场测量方法所依据的原理各不相同,测量的磁场精度和范围相差也很大1011107G。我们从各个传感器检测磁场的精度,传感器的频率响应、尺寸、价格、功耗以及实现的难易程度进行考虑。最终选择了电磁感应线圈(电感量10mH 内阻10Ω),它具有原理简单、价格便宜、体积小(相对小)、频率响应快、电路实现简单等特点。

4.3 磁场信号的检测

由于感应线圈测得的信号非常的小,不能满足单片机的要求。而且在空间中12存在多种频率的磁场,所以需要对感应线圈测得的信号进行处理,于是我们将感应线圈测得的信号进行谐振,放大。为了使单片机读取数据的方便,我们还将放大后的信号进行检波,然后直接用单片机的AD模块读取信号。电路图如图4.3所示: 5VDR25.1KC3R1510k0.1ufdiangan 21CON2C2Q180501D2212ADC41ufD1DIODER551kDIODE0.1ufC16.8nf 图4.3 信号处理电路 C4.4 传感器的布局 为了使小车满足爬坡的要求,综合传感器检测的距离,以及4.1所讲的赛道磁场的分布,我们最终确定了传感器水平多排的布局方式,如下图4.4所示: -8- B

图4.4 传感器的布局

说明:传感器为两排水平布局(如上图),由于电磁小车前瞻距离只有十几厘米,所以我们必须准确的判断赛车现在所处的位置,使小车能有较高的速度,因此前面三个传感器是用于判断转向,后面两个是用于判断小车处于赛道的位置。

-9-

第五章 软件的实现

赛车控制系统的设计主要由赛道信息的采集与数据分析、方向控制、速度控制着三个部分组成。框图如下:

赛道信息的采集与数据分析 转向控制 HC9S12XS128 速度控制 图 5.1 系统框图

由上图,我们就可以将系统细分为:AD采集赛道信息、数据分析、舵机PWM控制、定时测速、电机PWM控制、起跑线检测这六个部分。将系统细分可以让软件与底层硬件模块接口的配合更紧密,同时也是把软件系统的实现从具体的硬件中尽量抽象出来,使控制更方便,程序更易读,也是把团队分工整合起来的有效途径。

5.1 赛道信息的采集与数据分析

赛道信息的采集分为路况信息的采集和起跑线的采集这两个部分。

路况信息的采集主要是由安装在赛车前面的多排感应线圈来完成。感应线圈通过检测赛道上方的磁场,采集到的信号经过谐振、放大、检波,然后直接送到单片机的AD口。单片机通过AD采样模块直接就可以得到感应线圈感应到磁场信号的大小。另外,赛车安装完成后,感应线圈之间的距离以及对地的高度都是恒定的,因此通过多次对比采集得到的感应线圈信号的大小即可得到赛道中心相对于感应线圈的位置,为赛车的转向控制提供依据。

起跑线的采集主要是由安装在车头上的一排干簧管来完成。由于干簧管是连接在单片机的T3口上的,当采集到起跑线时触发单片机的中断,然后使赛车停止。 数据处理方面要分别对采集的两部分信息进行处理。赛道信息的处理,主要是对AD采样得到的数据进行归一化,以消除不同的感应线圈之间的差异。而起跑线信号则主要是去抖动,防止因抖动而误动作。

赛道信息的采集与数据分析的程序流程如下图所示:

-10-

程序开始 初始化 AD采样 Y 数据有错? N 归一化 结束 5.2 赛道信息的采集以及数据处理程序的流程图

程序开始 初始化 延时 等待中断 Y 判断抖动 N 停车 程序开始 图5.3 起跑线检测程序的流程图:

-11-

部分程序代码:

/******************************************* AD转换初始化;

*******************************************/

void AD_Init(void)//AD初始化一个通道一个通道的转换 {

ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch ATD0CTL2=0x40; //禁止外部触发, 中断禁止

ATD0CTL3=0xA0; //右对齐无符号,每次转换13个序列, No FIFO, Freeze模式下继续转 1110 1000

ATD0CTL4=0x0F; //765:采样时间为4个AD时钟周期,ATDClock=[64M*0.5]/[PRS+1]

ATD0CTL5=0x30; //6:0特殊通道禁止, 0000 0000 ATD0DIEN=0x00; //禁止数字输入 }

/**************************************

定时测速PT7口输入;每10ms读取一次速度值;存在V[2]中 PT3输入捕捉

***************************************/ void ECT_Init(void)//ECT初始化PT7引脚 {

PACTL = 0x50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT

TSCR2 = 0X06;

TCTL3 = 0xc0;//c-输入捕捉7任何沿有效, TCTL4 = 0X80;

TIE = 0x08;//每一位对应相应通道中断允许,0表示禁止中断 TIOS = 0x00;//每一位对应通道的: 0输入捕捉,1输出比较 PACNT = 0x00; TSCR1 = 0X80;

PITCFLMT_PITE=0; //disable PIT

PITCE_PCE0=1; //enable timer channel 0

PITMTLD0=256-1; //time base 240 clock cycles ,it's 0.1M Hz PITMUX=0x00; // ch0 connected to micro timer 0 PITLD0=1250-1; //INTVERAL micro time bases time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS.

PITINTE_PINTE0=1; //enable interupt channel 0 PITCFLMT_PITE=1; //enable PIT }

/******************************************* 读取AD转换值的函数D一个通道一个通道的转换 *******************************************/

void ReadAD2(unsigned int *Data,unsigned char channel) //读AD一个通道一个通道的转换 {

-12-

}

byte i=0;

for(i=channel;iATD0CTL5_Cx=i; while(!ATD0STAT0_SCF); Data[i-channel]= ATD0DR0L; }

5.2 转向控制

赛车的转向主要是由舵机来完成的。赛车的转向控制就是对舵机的控制,并考虑速度对于转向的影响。

舵机的角度分配一般有两种方式:查表方式、PID方式。分析比赛的要求,不难看出精确的转向控制是完成比赛的关键,而我们采样得到的电压值也是连续变化的,如果采用查表方式的话,还需要对数据进行模糊化的处理,很难完成精控制的要求。实践也发现,采用查表方式时,舵机的转角会出现不连续的状况,影响赛车的稳定性。而使用PID调节方式对舵机进行控制,该方式在不论是反应速度,还是舵机转向连续以及转角预测上都优于查表方式,因此,在实际过程中,我们使用的是PID方式。

方向的控制主要是根据预瞄区赛道中心的位置,初步确定舵机转角,并根据赛道变化的趋势对舵机转角进行修正。

在模拟系统中,PID算法的表达式为

p (  Kp[e(t)t)

p(t)----调节输出信号;

e(t)----调节器偏差信号,为测量值与给定值之差; Kp1TIe(t)dtTDde(t)dt](公式5-1)

----调节器比例系数;

TI ----调节器积分时间; TD ----调节器微分时间。

由于单片机控制是一种采样控制,它只能根据采样时刻的偏差值来计算控制量。因此必须将公式(5-1)离散化处理,用数字形式的差分方程代替连续系统的微分方程,此时积分项和微分项可用求和及增量式表示:

(公

dtnnn0e(t)dtE(j)tTE(j)0j0式5-2)

de(t)E(k)E(k1)tE(k)E(k1)T(公式5-3)

将公式(5-1)和公式(5-2)代入公式(5-3),可得到离散的PID表达式:

-13-

p(k)Kp{E(k)

E(k)----第

TTIkj0E(j)TDT[E(k)E(k1)]}(公式5-4)

式中,t=T----采样周期,必须使T足够小,才能保证系统有一定的精度;

k次采样时的偏差值;

E(k1)----第(k-1)次采样时的偏差值; k ---- 采样序号,k=0,1,2,3··· ;

第k次采样时调节器的输出。

kp(k)----

要想计算p(k),不仅需要本次与上次的偏差信号E(k)和E(k-1),而且还要在积分项把历次的偏差信号E(j)进行相加,即E(j)。

根据推理原理,可写出(k-1)次的PID输出表达式:

p(k1)Kp{E(k1)TTIk1j0j0E(j)TDT[E(k1)E(k2)]} (公式5-5)

用公式(5-4)减去公式(5-5),可得:

P(k)P(k1)Kp[E(k)E(k1)]KIE(k)KD[E(k)2E(k1)E(k2)]

(公式5-6)

式中, KI=Kp

KDKTTlTp ------积分系数;

D由公式(5-6)可知,要计算第k次输出值P(k),只需知道P(k-1),E(k),E(k-1),E(k-2)即可。

把公式(5-4)和公式(5-5)相减,得到:

P(k)P(k)P(k1)

T ------微分系数。

KP[E(k)E(k1)]KIE(k)KD[E(k)2E(k1)E(k2)]

( 公式5-7)

公式(5-7)表示第k次输出的增量P(k),等于第k次与第(k-1)次调节器输出的差值,即在第(k-1)次的基础上增加(或减少的)量,所以公式(5-7)叫做增量型PID控制算式。

图5.4 单位反馈的PID控制原理框图

-14-

其中e表示理想输入与实际输出的偏差,再将此偏差送入控制器,经控制器计算可得到偏差值的比例、积分和微分值的线性组合u。

其中, K p 、K i 、K d 分别称为比例系数、积分系数、微分系数。u 接着被送到了执行机构获得新的输出信号Y。Y被再次送到感应器以产生新的偏差信号,这个过程就反复地进行。

运用PID 控制的关键是调整三个比例系数,即参数整定。PID 控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行。

一般来说,增大比例系数能够减小上升时间,并减小稳态误差,但不能消除。增大积分系数能够消除稳态误差,但会使瞬时响应变差。增大微分系数能够增强系统的稳定特性,减小超调,并且改善瞬时响应。

由实验获知,当I为零,D比P较小时系统相对较稳定。对于直道而言,P应该适中,如果太大,极易出现超调振荡,如果太小,由弯道进直道时车模不能及时摆正,不利于直道的加速。且由直道入弯时,舵机会因响应不及时而冲出跑道。对于弯道而言,P应该稍大,这样有利于弯道走内线,同时也提高了舵机的响应速度和幅度,拐弯更顺畅,大大降低了冲出跑道的可能性。对于蛇形道而言,P要稍小,P小,舵机响应稍小,有利于走蛇形道。若P太大,舵机响应变大,蛇形道极易按照弯道行驶策略行驶,这样就大大的增加了车模行驶的路程,行驶时间也必然长得多。另外,还考虑到舵机具有良好的线性响应,所以我们实际使用的PD控制器来控制舵机的转向,而且为了调试的方便还是用了拨码开关调节PD控制器的系数。

在这可以列表说明你们的实验过程比如Kp为多大时后面的Ki等怎么调整的过程 Kp Ki 最终跑的情况(或者一个说明误差等等)

uKpeKIedtKDdedt(公式5-8)

-15-

程序开始 PID 初始化 舵机 等待数据处理完成 N 数据有效? 程序开始 Y 图5.5转向控制的程序流程图

部分程序代码:

/******************************************* 设置舵机转角的函数

以电压的偏差判断舵机的转向和转量

*******************************************/

void Set_PWMA(void) //首先是c{

P1=0,P11=0; //摆正943 极左623;极右1263 if(a>50||b>50||c>50||d>50||e>50) //判断传感器的值是否有效 {

if(e<50) //50 {

if(aPWMDTY01=P1_Min; } else {

PWMDTY01=P1_Max; } } else {

if((D[3]>0&&DD[3]>0)||(D[3]<0&&DD[3]<0))

-16-

{

P1=kp*D[3]/10+kd*(D[3]-D[2])/10; P1=943+P1; }

if(P1<623) //舵机的最小值 P1=623;

else if(P1>1263) //舵机的最大值 P1=1263;

PWMDTY01=P1; } } }

5.3 速度控制

比赛要求赛车在寻迹的前提下尽可能快的完成比赛(竞速类比赛)。由于赛道的情况比较复杂,速度过高很可能会使赛车不稳定或者来不及转向而冲出赛道。在随动控制系统中,如果速度控制采用开环控制其鲁棒性很差,极易受到扰动量的干扰使使系统不稳定。赛车对稳定性和速度的要求都很高,因此要求系统的抗干扰性能很强。所以开环控制不适合赛车的控制系统,必须使用闭环控制。一般而言在采集到实时的速度以后速度控制方式有两种,一种是对动力进行控制,当速度高于一定值的时候减小赛车的动力,而速度过小的时候需要增加赛车的动力。这种方法有很大的缺点,它不能快速降低速度,可能会使赛车在直道进入弯道的时候因速度过高而转向不及时。另外一种是对赛车的速度进行控制,只在当赛车速度高于一定值的时候对赛车进行减速,这种方法能很好的保证赛车的稳定性,而且程序简单容易实现。另外电磁组前瞻距离很小,对赛道类型的判断也不能保证很准确,为了稳中求胜,我们在速度控制时只对速度进行了控制。 部分程序代码:

/******************************************* 减速的子程序

*******************************************/ void jiansu(void) {

int j1,j2; if(V>Vp) { V=0;

PWMDTY3=0; PWMDTY2=0;

for(j1=0;j1<20;j1++) for(j2=0;j2<50;j2++); PWMDTY3=0;

PWMDTY2=Stop_PWM; for(j1=0;j1-17-

for(j1=0;j1<20;j1++) for(j2=0;j2<50;j2++); PWMDTY3=P3_Max; PORTB=~PORTB; } }

/******************************************* 减速的程序

*******************************************/ void Set_PWMV(void)(程序说明呢?) {

if(PWMDTY01<843||PWMDTY01>1043) {

Stop_Time=400;

Vp=28; //27 Stop_PWM=25; jiansu();

} else {

Stop_Time=400;

Vp=40; //40 Stop_PWM=25; jiansu();

} }

-18-

第六章 系统的调试

使用了组委会提供的软件开发平台CodeWarrior IDE4.7版,其工作界面如

图6.1 CodeWarrior IDE4.7版

调试时使用清华大学的BDM和CodeWarrior IDE 4.6自带的hiwave.exe用户能够很方便的进行一系列的调试工作,如修改PC,监控寄存器的值,设置程序断点等等。这样能缩短软件的开发时间,为车模性能调试提供更多宝贵的时间。

图 6.2 hiwave.exe工作界面

在CodeWarrior IDE4.6界面中编译连接通过后直接点击Debug就能进入hiwave.exe工作界面,如图9-3。

-19-

第七章 车模的改装

7.1 轮距的调节

车模后轮轮距的大小关系着车模在高速过弯当中的平稳性,后轮距越宽在速度相同的情况下小车越不易出现侧翻和侧滑的情况。在比赛中出现侧翻和侧滑的情况是非常危险的,为了避免侧翻和侧滑又要提高车模的最大过弯速度,我们将后轮改装如图

图7.1 轮距的调节

7.2 舵机的调节

舵机转向是系统中一个较大时间常数的惯性环节。 由于大赛采用的舵机的工作速度为0.16s/60度,对于对快速性要求极高的智能小车来说,是影响其速度的一个重要因素,特别是对于前瞻不够远的智能小车。我们可以通过加长舵机力臂的方法来弥补这一缺陷。加大力臂后减小了舵机的转向范围,所以要使前轮转动相同的角度,舵机力臂加长后所需时间更短,响应更快。但如果舵机的力臂太长又会造成舵机的转向力矩太小,PWM信号与角度不能很好的一一对应,对于舵机的开环控制会带来很大的稳态误差。综合以上考虑,我们将转臂加长至3.0CM,其安装图片为图7.2所示:

把舵机这样放还可以解决左右转拒不平衡的问题,假如存在哪个问题:只能想左或者向右转向比较好(通过实验得出,不停强调你们做了实验的)

-20-

图7.2 舵机改装图

7.3 小车改装过后的各种参数

改装过后车模照片

图7.3 小车全图

各种参数表:

表7.1 项目 路径检测方法 车模几何尺寸(长、宽、高)(毫米) 车模轴距/轮距(毫米) 车模平均电流(匀速行驶)(毫安) 电路电容总量(微法) 传感器种类及个数 赛道信息检测空间精度(毫米) 车模重量(带有电池)(千克) 赛道检测频率(次/秒) 参数 电磁感应 长395mm、宽240mm、高100mm 150mm 1320mA 1700uf 感应线圈(五个),红外对射式传感器(1个) 5mm 1.1kg 500

-21-

第八章 总结

8.1 制作过程的总结

本队从3月份开始制作智能车到现在,本队每个成员在课余时间尽自己最大的努力来解决问题,优化方案,创新。大家把所学的理论知识用于实践,还在其他的方面学习了新的理论,涉猎多个学科。并在这次的磨练中锻炼了我们对知识的融合能力,培养了我们实践动手能力。最终制作完成了智能电磁小车。具体一点嘛比如哪些方面的知识

8.2 不足与改进

电磁小车与光电、摄像头小车相比,最大的劣势是前瞻太短。为了弥补这个问题,因此就必须从硬件上面弥补,如合理的传感器布局,改进传感器的响应时间,所以我们使用了多排布局传感器的方案,在信号的处理电路方面我们使用了谐振、放大、检波,但是在后面的制作过程中我们发现检波过程使得传感器的响应变慢了很多,限制了我们小车的速度。

改进:在传感器的布局上面,可以采用多排,感应线圈不同的摆放姿势,如竖直摆放,可以提高小车的前瞻。在传感器信号处理上面可以不使用检波,直接用单片机放大信号的峰峰值,但是XS128的AD在7US左右而我们的信号周期为50US如果直接用AD采集失真很大,因此最好使用同频采集。这样可以使传感器的响应时间很快。同频采样的优点

同频采样确定了,采样点后每次之才一个值,就是你们需要的峰峰值 节约了采样的资源

正弦波,单片机AD前通过微分器进行信号同步,当信号达到峰值时,微分器输出为零,

-22-

参考文献

[1] 邵贝贝.《单片机嵌入式的在线开发方法的应用》(第一版) 清华大学出版

社出版 2004年10月

[2] 谭浩强 《C语言程序与设计》(第二版),清华大学出版社出版 1999年12月 [3] 卓晴.黄开胜. 邵贝贝.学做智能车――挑战“飞思卡尔”杯.北京航空航天大

学出版社,2007(1)

[4] 电磁组竞赛车模路径检测设计参考方案 大赛主委会提供

[5] 李仕伯 马旭 卓晴 清华大学 基于磁场检测的寻线小车传感器布局研究 北京 100084

[6] 张昊飏 马旭 卓晴基于电磁场检测的寻线智能车设计 清华大学 (北京 100084)

-23-

附件A 源代码

#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE \"mc9s12xs128b\"

/************************************************ 固定参数

***********************************************/ #define P3_Begin 0; //正转最小值 #define P3_Max 55; //正转最大值 #define P3_Min 55; //正转最小值 #define P1_Begin 943; //舵机中间值 #define P1_Max 1263; //舵机最大值 #define P1_Min 623; //舵机最小值 /******************************************* 数组变量

*******************************************/ word xx[1][5]; //存放AD采样获得的值

int D[4]; //偏差的数组;偏左为正;偏右为负;当前D[2]上次D[1]上上次D[0]; int DD[4];

/*********************************************** 变量定义

**********************************************/ word a,b,c,d,e; //传感器采样获得的平均值

word amax,bmax,cmax,dmax,emax; //传感器获得的最大值 word S_Time=0; //起跑线延时 int kp=24,kd=0,ki=0; //比例系数24

int V; //用于存放速度值 word V_max=0; //存放最大速度

int P3,P2,P1,P11; //正转P3,反转P2,舵机P1; word Stop_Time; byte Stop_PWM; word Vp; //期望速度 word Input_Num;

/******************************************* 时钟初始化

*******************************************/ void PLL_Init(void) //设置系统时钟频率busCLK=64 { CLKSEL=0X00; //disengage PLL to system PLLCTL_PLLON=1; //turn on PLL SYNR =0xc0 | 0x07; REFDV=0x80 | 0x01; POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;

-24-

_asm(nop); //BUS CLOCK=64M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system; }

/*******************************************

舵机PWM初始化,1口输出,1KHz 摆正943 极左613;极右1273 *******************************************/ void PWMA_Init(void) //Busclk=64M {

PWME_PWME1=0x00; //1口禁止 PWMCTL_CON01=1; // 0/1级联 PWMPRCLK=0x33; //8分频A=B=8M PWMSCLA=4; //SA=A/2/4=1M PWMCLK_PCLK1=1; //时钟源SA PWMPOL_PPOL1=1; //极性选择 PWMCAE_CAE1=0; //left对齐方式 PWMCNT01=0; // PWMPER01=9000; //

PWMDTY01=P1_Begin; //占空比基准值943 ;摆正943 极左623;极右1263 PWME_PWME1=1; //使能1口 }

/******************************************* 电机PWM初始化;3口输出;正传;1KHz

*******************************************/ void PWMV1_Init(void) //电机PWM3口 {

PWME_PWME3=0x00; //3口禁止

PWMSCLB=40; //SB=B/2/40=100K PWMCLK_PCLK3=1; //时钟源SB PWMPOL_PPOL3=1; //极性

PWMCAE_CAE1=0; //left对齐方式 PWMCNT3=0; //

PWMPER3=100; //周期=100K/100=1K PWMDTY3=P3_Max; //占空比55 PWME_PWME3=1; //3口使能 }

/*******************************************

电机PWM初始化;2口输出;反转;1KHz;只有当调用减速程序的时候有用 *******************************************/ void PWMV2_Init(void) //电机PWM2口 {

PWME_PWME2=0x00; //2口禁止 PWMCLK_PCLK2=1; //时钟源SB PWMPOL_PPOL2=1; //极性

PWMCAE_CAE2=0; //left对齐方式 PWMCNT2=0; //

-25-

PWMPER2=100; //周期=100K/100=1K PWMDTY2=0; //占空比 PWME_PWME2=1; //2口使能 }

/******************************************* AD转换初始化;

*******************************************/ void AD_Init(void)//AD初始化一个通道一个通道的转换 { ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch ATD0CTL2=0x40; //禁止外部触发, 中断禁止 ATD0CTL3=0xA0; //右对齐无符号,每次转换13个序列, No FIFO, Freeze模式下继续转 1110 1000 ATD0CTL4=0x0F; //765:采样时间为4个AD时钟周期,ATDClock=[64M*0.5]/[PRS+1] ATD0CTL5=0x30; //6:0特殊通道禁止, 0000 0000 ATD0DIEN=0x00; //禁止数字输入 }

/**************************************

定时测速PT7口输入;每10ms读取一次速度值;存在V[2]中 ***************************************/ void ECT_Init(void)//ECT初始化PT7引脚 { PACTL = 0x50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT TSCR2 = 0X06; TCTL3 = 0xc0;//c-输入捕捉7任何沿有效, TCTL4 = 0X80; TIE = 0x08;//每一位对应相应通道中断允许,0表示禁止中断 TIOS = 0x00;//每一位对应通道的: 0输入捕捉,1输出比较 PACNT = 0x00; TSCR1 = 0X80; PITCFLMT_PITE=0; //disable PIT PITCE_PCE0=1; //enable timer channel 0 PITMTLD0=256-1; //time base 240 clock cycles ,it's 0.1M Hz PITMUX=0x00; // ch0 connected to micro timer 0 PITLD0=1250-1; //INTVERAL micro time bases time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS. PITINTE_PINTE0=1; //enable interupt channel 0 PITCFLMT_PITE=1; //enable PIT }

/******************************************* 求绝对值的函数

*******************************************/ int fabs(int in)//取绝对值 {

return in>=0 ? in:-in; }

-26-

/******************************************* 延时的函数

*******************************************/ /*******************************************

读取AD转换值的函数D一个通道一个通道的转换,每个通道读取20次求平均值

右边的传感器c;左边传感器a;中间传感器b

*******************************************/

void ReadAD2(unsigned int *Data,unsigned char channel) //读AD一个通道一个通道的转换 { byte i=0; for(i=channel;i/******************************************* 求AD转换值平均值的函数

右边的传感器a;左边传感器e;中间传感器c

*******************************************/

void AD_Trans(void) //运算AD得到舵机转角的方向和期望值、电机的期望值 {

byte i=0;

a=b=c=d=e=0; a=xx[0][0]; b=xx[0][1]; c=xx[0][2]; d=xx[0][3]; e=xx[0][4];

while(a>255||b>255||c>255||d>255||e>255) {

ReadAD2(xx[i],0); a=xx[0][0]; b=xx[0][1]; c=xx[0][2]; d=xx[0][3];

e=xx[0][4]; }

D[0]=D[1]; D[1]=D[2]; D[2]=D[3]; D[3]=a-d;//前排 DD[0]=DD[1]; DD[1]=DD[2]; DD[2]=DD[3]; DD[3]=b-c;

-27-

}

/******************************************* 设置舵机转角的函数

以电压的偏差判断舵机的转向和转量

*******************************************/

void Set_PWMA(void) //首先是c{

P1=0,P11=0; //摆正943 极左623;极右1263 if(a>50||b>50||c>50||d>50||e>50) //判断传感器的值是否有效 {

if(e<50) //50 {

if(aPWMDTY01=P1_Min; } else {

PWMDTY01=P1_Max; } } else {

if((D[3]>0&&DD[3]>0)||(D[3]<0&&DD[3]<0)) {

P1=kp*D[3]/10+kd*(D[3]-D[2])/10; P1=943+P1; }

if(P1<623) //舵机的最小值 P1=623;

else if(P1>1263) //舵机的最大值 P1=1263;

PWMDTY01=P1; } } }

/******************************************* 减速的子程序

*******************************************/ void jiansu(void) {

int j1,j2; if(V>Vp) { V=0;

PWMDTY3=0; PWMDTY2=0;

-28-

for(j1=0;j1<20;j1++) for(j2=0;j2<50;j2++); PWMDTY3=0;

PWMDTY2=Stop_PWM; for(j1=0;j1for(j1=0;j1<20;j1++) for(j2=0;j2<50;j2++); PWMDTY3=P3_Max; PORTB=~PORTB; } }

/******************************************* 减速的程序

*******************************************/ void Set_PWMV(void) {

if(PWMDTY01<843||PWMDTY01>1043) {

Stop_Time=400;

Vp=28; //27 Stop_PWM=25; jiansu();

} else {

Stop_Time=400;

Vp=40; //40 Stop_PWM=25; jiansu();

} }

/******************************************* *******************************************/ void Data_Trans(void) { }

/******************************************* *******************************************/ void Get_kp(void) {

int g1;//,g2; byte i;

amax=bmax=cmax=dmax=0; for(g1=0;g1<12000;g1++) { i=0;

-29-

ReadAD2(xx[i],0); //四组AD转换

AD_Trans(); //两组分别求平均值存在a,b,c if(fabs(D[2])>dmax) {

dmax=fabs(D[2]); cmax=c; } }

//kp=3200/dmax; //PORTB=kp;

//for(g1=0;g1<10000;g1++) //for(g2=0;g2<10000;g2++); //PORTB=0X00;

PWMDTY3=P3_Max; }

/*******************************************

主函数;依次调用时钟、舵机、电机、AD、测速的初始化 *******************************************/ void main(void) {

DDRB=0XFF; PORTB=0X00;

PLL_Init(); //时钟初始化64M

PWMA_Init(); //舵机PWM初始化1口50Hz PWMV1_Init(); //电机PWM3口20% 1KHz PWMV2_Init(); //电机PWM2口0% 1KHz AD_Init(); //AD初始化01口 AD0;AD1 ECT_Init(); //定时测速的初始化 PT7 //Get_kp(); //采集传感器的最大最小值 EnableInterrupts;

/* put your own code here */ for(;;) { byte i=0;

ReadAD2(xx[i],0); // AD转换

AD_Trans(); //两组分别求平均值存在a,b,c //Data_Trans(); //数据的归一化处理 Set_PWMA(); Set_PWMV(); } /* wait forever */

/* please make sure that you never leave this function */ }

/******************************************* 测速中断 每隔10ms读取一次速度V

*******************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED

-30-

void interrupt 66 ReadSpeed(void)//读取速度 { static int count = 0; PITTF_PTF0=1;//中断标志清零 if(count%2==0)//每10ms读取一次速度并进行一次控制 { //读取速度

V = PACNT; //单位:m/s PACNT = 0;//计数器清零 S_Time++; } if(S_Time>400) { S_Time=400; } /*if(V>V_max) { V_max=V; PORTB=V_max; }*/ if(count%200==0) { count = 0; } count++; }

/******************************************* 起跑线

*******************************************/ void interrupt 11 Timer3_Onput(void) {

byte i=0;

TFLG1_C3F=1; Input_Num++; if(S_Time>399) //延时 {

PWMDTY3=0; ReadAD2(xx[i],0); AD_Trans(); Set_PWMA(); }

if(Input_Num>255) {

Input_Num=0; } }

-31-

因篇幅问题不能全部显示,请点此查看更多更全内容

Top