当前位置:文档之家› 国防科技大学摄像铁军一师技术报告

国防科技大学摄像铁军一师技术报告

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

智能汽车竞赛

技术报告

学校:国防科学技术大学

队伍名称:摄像铁军一师

参赛队员:陆科宇

魏启航

张熠

带队教师:安向京潘升东王龑

I

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

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

参赛队员签名:

带队教师签名:

日期:

I

第五届全国大学生智能汽车邀请赛技术报告

目录

目录..................................................................................................... I 第一章引言 (1)

1.1 整车设计思路 (1)

第二章系统控制策略 (2)

2.1 智能车系统控制的特点 (2)

第三章硬件设计 (4)

3.1 小车机械改造 (4)

3.1.1 码盘功能及选型 (4)

3.1.2 舵机的改装 (5)

3.2 单片机系统设计 (5)

3.3 摄像头的对比选型 (6)

3.4 CMOS 摄像头接口设计 (7)

3.5 电机驱动电路设计 (8)

3.6 电源模块设计 (9)

第四章软件设计 (11)

参考文献 ............................................................................................. I 附录.................................................................................................... II

I

第一章引言

1.1 整车设计思路

自主驾驶系统的三个组成部分,相互联系、相互制约,共同完成控制任务。环境感知系统,我们的该部分主要包括感知路面信息的传感器和感知车体

状态的传感器。

传感器的选择相当灵活,我们的车选用了三种传感器。

CMOS 摄像头:感知车体与路面的相对位置信息,预视距离远。

光电码盘:感知车体信息,推算车体状态。

自主决策系统,主要通过单片机的软件来实现决策控制。

操作执行系统,就是从单片机发出控制指令到车体响应这一部分的系统,主要就是相应的驱动电路,H桥之类。

三个系统相互联系、制约,它们都统一于一个共同的系统,有共同的目标和核心的控制策略,这些直接决定了三个系统的构成和性能要求。比如由控制策略,我们就可以确定环境感知系统要选什么传感器、什么精度、怎么安装,决定自主决策系统要如何分配CPU时序,各部分各用多少资源;决定操作执行系统的能力,比如是否要双向的H桥。

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

第二章系统控制策略

2.1 智能车系统控制的特点

为保证小车一直沿着黑色引导线快速行驶,系统主要的控制对象是小车的转向和车速。即应使小车在直道上以最快的速度行驶。在进入弯道的时刻尽快减速,且角度的转向要适合弯道的曲率,确保小车平滑地转弯,并在弯道中保持恒速。从弯道进入直道时,小车的舵机要转向至中间,速度应该立即得到提升,直至以最大的速度行进。为实现上述控制思想,我们采用不同的控制方法来控制小车的转角和速度。

(1)转角的控制

调整舵机的原则是:小车处于直道,则摆正舵机。小车处于弯道的曲率越大,则将舵机的转角摆的越大。除此之外,小车还会遇到黑色交叉线的特殊情况,对此,本系统将保持原有的小车方向与速度,使小车不受交叉线的干扰。

(2)车速的控制

因为小车比赛的赛道是未知的,弯道的分布情况也不能确定,小车可能频繁的进出弯道,不停的调整速度来适应不同轨迹。所以,本系统需要对智能车的速度进行控制,使得小车的速度能够频繁地变化,且能在很短的时间内由当前速度转变为我们期望的转速。基于这几点的考虑,由于模糊控制具有处理不明确信号的能力,本系统选择了模糊控制算法来控制转速。设计思路如下:小车后轮安装的旋转编码器可以在后轮旋转一圈后产生600个脉冲,所以,本系统通过每一段时间dt读入脉冲数间接测得转速speed,将speed与期望小车运行的速度speed_enactment比较,由以下公式求得速度偏差ek与速度偏差率dek。

ek = speed_enactment – speed; (式3.1)

dek = ek – ek1; (式3.2)

,通过模糊化,模糊推理和反模糊化,得出PWM输出信号,该信号控制后轮的驱动电机来调整小车行驶速度。

2.2 智能车系统控制方案的设计

本系统根据路径识别单元和车速检测单元获得的路径和车速的当前信息,控制转向伺服电机和直流驱动电机联单相应的调整智能车的行驶方向和速度。最终的目的是使智能车在直道行驶时方向迅速保持稳定、不抖动,同时速度迅速升到最大值并达到稳定。小车在行驶过程中会遇到以下两种路况:(1)当小车由直道高速进入弯道时,转角方向和车速应根据弯道的曲率迅速做出相应的改变,原则是弯道曲率越大则方向变化角度越大,车速越低。

(2)当小车遇到十字交叉路段或是脱离轨迹等特殊情况时,智能车保持与上次正常情况一致的方向,速度则相应的降低。

小车角度的控制采用开环控制。根据不同的检测路径,判断出小车所在位置,按不同的区间给出不同的伺服电机PWM控制信号,小车转过相应的角度。为了使得赛车能够平稳地沿着赛道运行,需要控制车速,使赛车在急转弯

时速度不至过快而冲出赛道。通过控制驱动电机上的平均电压可以控制车速,但是如果开环控制电机转速,会受很多因素影响,例如电池电压、电机传动摩擦力、道路摩擦力和前轮转向角度等。这些因素会造成赛车运行不稳定。通过速度检测,对车模速度进行闭环反馈控制,即可消除上述各种因素的影响,使得车模运行得更稳定

小车速度的控制采用一种参数自整定的模糊控制算法。传统的模糊控制器把速度偏差EK及偏差变化率DEK作为输入量,通过设定一组合理的参数,通过对输入变量的模糊化,模糊推理及反模糊化三个步骤来进行速度调节,输出量为PWM控制信号的增量UK。传统的模糊控制对于较小范围内的速度调节能起到明显的效果。但对于智能车系统而言,因小车需大幅度的加减速,传统模糊控制的参数不能适应系统的要求,故根据小车的角度偏差变化率DANGLE,经过修正规则自整定出模糊控制器的参数,使小车速度控制达到系统要求。

第三章硬件设计

3.1 小车机械改造

3.1.1 码盘功能及选型

光电编码器有如下功能:

1)将角度位移按一定的比例关系转换成输出脉冲数;

2)将角速度按一定的比例关系转换成输出脉冲频率;

我们采用自制的码盘对速度进行检测,然后采用闭环反馈来实现速度控制,码盘具体情况如下图:

图3-1

3.1.2 舵机的改装

由于舵机初始位置空程较大,所以我们对舵机的位置进行了改动,通过减少舵机的连杆机构来达到响应速度灵敏和足够的转角,具体改造位置见下图:

图3-2

3.2 单片机系统设计

大赛规定参赛选手使用MC9S12DG128B 作为主控器,不得使用其它辅助处理器以及可编程器件。MC9S12DG128B 是飞思卡尔半导体公司生产的采用HCS12 内核的16 位单片机,片内有1K 的寄存器空间、2K 的EEPROM、8K 的RAM 以及128K 的FLASH ROM,并且有丰富的外设接口资源。关于单片机的使用,在智能小车控制系统中,我们使用锁相环(PLL)来设定系统的工作频率,用PWM 模块控制舵机偏角和电机转速,用增强的捕捉定时器(ECT)进行码盘脉冲计数,用通用异步串口(SCI)把赛车调试或比赛的行驶过程中的各种有用参数发送到PC 机以便进行分析和改进,我们还使用同步串行外设接口(SPI)

或IIC 总线来控制CMOS 摄像头。具体情况见下图:

图3-3

3.3 摄像头的对比选型

目前市场上的摄像头所采用的感光器件分为CCD 和CMOS 两种,CCD 的全称为电荷耦合装置,而CMOS 的全称则是互补金属氧化物半导体。

目前的CMOS 摄像头有很多都自带有可编程控制模块和模数转换模块,无论从结构上、工艺上、性能上和使用方法上,都与普通的存储器有非常相似之处。与CCD 摄像头相比之下,CMOS 摄像头不需要斩波升压来提供电源,并且具有较强的可编程控制能力,也不需要额外地进行A/D 采样,各方面都更适合于作为小车的视觉传感器。

市场上的CMOS 图像传感器产品各种各样,数不胜数,大部分是彩色的,分辨率也比较高。从小车需要识别的目标特征来看,CIF 分辨率甚至QCIF 分辨率的黑白摄像头足够提供路径识别和规划所需要的信息。摄像头具体情况见下图:

图3-4

3.4 CMOS 摄像头接口设计

在选定CMOS 摄像头型号后,紧接着的工作就是如何把摄像头与主控器连接起来,构建方便可靠的数据传输通道。

在实践中,我们选择了用FIFO 做数据缓冲的方法设计摄像头的接口。这样我们就可以采用流水线方式,提高CUP 利用率,即启动采集(曝光),启动传输,等待数据(启动下一次曝光),启动传输……。

FIFO 内部的核心部分是双口SRAM,只是把地址信号集成到片内,由读写

时钟自行产生地址指针,外部控制上要比双口SRAM 简单许多。通过对FIFO 写时钟的控制,可以最大限度地利用内部存储空间。

由于FIFO 在写操作时,只需要一个写时钟信号进行同步就可以。读操作也类似于写操作,由单片机产生读时钟,FIFO 就会自动把数据挂到总线上。

下图是FIFO 的读写操作时序图:

图3-5

3.5 电机驱动电路设计

在智能汽车竞赛中,智能车的速度较快,通常达到2m/s以上,因此对电机驱动电流的要求较高,电机驱动电路必不可少。首先,竞赛级电调并不使用全桥驱动,而是使用半桥,其原理图如图所示。

我们使用了驱动芯片,制作了升压电路给mosfet driver供电。这种电路结构的好处是它可以比全桥少用一半的mosfet,或者说在相同体积内可以多并联一倍

的mosfet来提升驱动能力。通过设计电路,能使电机正转以及反转,而且使用PWM波控制,能起到很好的驱动效果。具体情况见下图:

图3-6

3.6 电源模块设计

驱动电路板中的电源模块为系统其它各个模块提供所需要的电源。设计中,除了需要考虑电压范围和电流容量等基本参数之外,还要在电源转换效率、降低噪声、防止干扰和电路简单等方面进行优化。可靠的电源方案是整个硬件电路稳定可靠运行的基础。

全部硬件电路的电源可充电镍镉电池提供。由于电路中的不同电路模块所

需要的工作电压和电流容量各不相同,因此电源模块应该包括多个稳压电路,将充电电池电压转换成各个模块所需要的电压。主要包括如下不同的电压:

1.主要为单片机、信号调理电路以及部分接口电路(如速度传感器)提供电源,电压要求稳定、噪声小。

2.主要是为舵机提供工作电压。实际工作时,舵机所需要的工作电流一般在几十毫安左右,电压无需十分稳定。

3.一部分直接取自电池两端电压,主要为后轮电机驱动模块提供电源。

4.采用摄像头进行道路检测时,为摄像头供电。

具体情况见下图:

图3-7

第四章软件设计

本系统控制软件采用大赛提供的CodeWarrior软件及BDM作为调试工具,此外,厂家提供的编程环境支持C语言和汇编语言的程序设计,以及C语言与汇编语言的混合编程,大大方便了用户的程序设计,提高了系统开发效率。本系统程序代码使用C语言编写。

本程序设计由以下几个模块组成:单片机初始化模块,实时路径检测模块,舵机控制模块,驱动电机控制模块,中断速度采集模块,速度模糊控制模块。

(1)单片机的初始化模块包括:I/O模块、PWM模块、计时器模块、定时中断模块初始化。

(2)实时路径检测模块:前排光电传感器检测黑线,将返回信号输入单片机的输入端口,程序不间断地读入输入端口的信号,通过判断语句,得出合适的PWM信号控制舵机转向

(3)舵机控制模块,驱动电机控制模块:通过直接输出PWM信号控制。舵机的控制采用开环控制,驱动电机采用模糊算法闭环控制。

(4)中断速度模糊控制模块实现:通过输出比较中断实现每10ms产生一次中断,并由累加器从旋转编码器信号线读入脉冲数,通过模糊运算得出PWM信号值输出控制转速电机控制速度。

参考文献

[1] Advanced Information Preliminary OV6630/OV6130 V1.0, OmniVision Technologies,

Inc. March 4th, 2000

[2] OmniVision Serial Camera Control Bus (SCCB) Functional Specification V2.1. OmniVision Technologies, Inc. 26th February 2003

[3] MC9S12DT128B Device User Guide V01.09. Motorola, Inc. 31st October 2002

[4] EETS2K Block User Guide V01.05. Motorola, Inc. 8th APR 2003.

[5] CRG Block User Guide V03.08. Motorola, Inc. 11th MAR 2002

[6] FTS128K Block Guide V01.03. Motorola, Inc. 11th MAR 2002.

[7] ECT_16B8C Block User Guide V01.06. Motorola Inc. Jul 5th, 2004.

[8] Port Integration Module (PIM) Block User Guide V01.04. Motorola, Inc. 3rd Sept

2003.

[9] PWM_8B8C Block User Guide V01.17. Motorola Inc. 1st Aug 2004.

[10] HCS12 Serial Communications Interface (SCI) Block Guide V02.06. Motorola, Inc.Oct 10th, 2001.

[11] SPI Block User Guide V02.07. Motorola, Inc. 11th Dec 2002.

[12] HCS12 Inter-Integrated Circuit (IIC) Block GuideV02.08. Motorola, Inc. Jun 3rd,2004.

[13] Multiplexed External Bus Interface (MEBI) Block User Guide Module V3. Motorola Inc. Feb 2002.

[14] Module Mapping Control (MMC) V4. Motorola Inc. Feb 2002.

[15] Martyn Gallop. Designing Hardware for the HCS12 D-Family. Motorola Inc. Feb2002.

[16] Grant M More. Using the I2C Bus with HCS12 Microcontrollers. Motorola Inc. Aug2002.

[17] Jim Williams. HCS12 External Bus Design. Motorola Inc. Aug 2004.

[18] 邵贝贝. 单片机嵌入式应用的在线开发方法. 清华大学出版社. 2004年10月

[19] 孙振平. 自主驾驶汽车智能控制系统. 国防科技大学工学博士学位论文. 2006年

5月

[20] 王宜怀刘晓升. 嵌入式应用技术基础教程. 清华大学出版社. 2005年10月

[21] 王彦陈文刚朱卫华. 全国大学生电子设计竞赛训练教程. 电子工业出版社.

2005年8月

附录

附录 A 算法源程序

#include /* common defines and macros */

#include /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

//constant list

#define centre 99 //the centre of the seesight of the camera

#define kp1 35 //the parameter of the motor

#define ki1 2

#define kd1 8

#define right 1 //the direction value

#define left 0

#define ready 0x66 //displaying this byte on PORTB indicates the car has get ready //global variable list

static uchar kp2; //the parameter of the servo

static uchar kd2;

static uchar speed; //the ideal speed, refer to the pulse number of the encoder static uchar max_pixel; //the maximum grey level of the image

static uchar min_pixel; //the minimum grey level of the image

static uchar evalue; //the referrent grey level of dividing the image

static uchar black_num; //the number of dual black pixels

static uchar position; //the X-axis of the track

static uchar direction; //the direction of the model car

static uchar pixel[700]; //the present image data

static uchar Lpulsenum[2]; //the pulse number of the left encoder

static uchar Rpulsenum[2]; //the pulse number of the right encoder

static int espeed[3]; //the speed error of the last three operations

static int line[2]; //the pixel differrence in X-axis

static int deta_servo; //the angle differrence of the servo

static int deta_motor; //the speed differrence of the motor

static uint formerspeed; //the former pwm duty of the motor

static uchar mypix;

static uchar DATA[20] = { //the spi words of the CMOS camera

0x00,// 0;b159~152,

0x00,// 1;b151~144,

0x33,// 2;b143~136,

0xe0,// 3;b135~128, b130-b122:Y size ->2

0x09,// 4;b127~120, b121-b113:Y start ->150

0x2c,// 5;b119~112,

0x5d,// 6;b111~104,

0x00,// 7;b103~ 96,

0x0f,// 8;b 95~ 88,

0xff,// 9;b 87~ 80,

0xf0,//10;b 79~ 72,

0x00,//11;b 71~ 64,

0x00,//12;b 63~ 56,

0x00,//13;b 55~ 48,

0x52,//14;b 47~ 40, b45-b36:integration stop

0x09,//15;b 39~ 32,

0xd1,//16;b 31~ 24,

0x8d,//17;b 23~ 16,

0x37,//18;b 15~ 8,

0x32 //19;b 7~ 0,

};

//function list

void Init_clk(void); //initiate system clock

void Init_spi(void); //initiate spi block

void Init_sci(void); //initiate sci block

void Init_pwm(void); //initiate pwm block

void Init_rti(void); //initiate rti block

void Init_port(void); //initiate ports

void Init_vari(void); //initiate variables

void Init_PulseAcc(void); //initiate pulse accumulator

void ResetPer(void); //reset all peripherals after power on

void ResetFIFO(void); //reser FIFO before request a frame

void req_image(void); //upload spi words, and request a frame

void get_image(void); //fetch data from the FIFO to the RAM

void dispose(void); //compute the parameters required

void transmit(void); //transmit the image data captured to the PC

void get_ref(void); //compute the maximum and minimum pixel of the image void self_adjust(void); //determine the exposure time refer to the surroundings void motor_ctrl(void); //control the speed

void servo_ctrl(void); //control the direction

void Init_clk(void)

asm

{

LDAB #1

STAB REFDV

LDAB #3

STAB SYNR ;System Clock Setting ->Bus Clk=32MHz

Wait:

BRCLR CRGFLG,#$08,*

BSET CLKSEL,#$80 ;Enable PLL Module

LDAB #$00

STAB PEAR ;Enable External Clock

}

}

void Init_spi(void)

{

MODRR = 0x00;

SPI0BR = 0x02;

SPI0CR2 = 0x10;

SPI0CR1 = 0x5e;

}

void Init_sci(void)

{

asm

{

LDAB #$0C

STAB SCI0CR2

LDAB #$00

STAB SCI0BDH

LDAB #$34

STAB SCI0BDL

}

}

void Init_pwm(void)

{

PWME = 0; //PWM禁止

PWMPRCLK = 0x22; //Clock A=bus clock/4=8MHz,Clock B=bus

clock/4=8MHz;Bus Clk = 32MHz

PWMSCLA = 0; //PWM 时钟SA 的选择Clock SA=Clock

A/2*PWMSCLA,//0=256

PWMSCLB = 1; //PWM 时钟SB 的选择Clock SB=Clock

B/2*PWMSCLB,//0=256

PWMCLK = 0xcf; //7,6,3,2 选择时钟SB,4,5 选择时钟A,1,0 选择时钟SA

PWMPOL = 0xff; //PWM各通道极性的选择先高后低

PWMCAE = 0; //PWM各通道对齐方式的选择左对齐

PWMCTL = 0xf0; //16 位PWM 波方式,奇数通道有效PWMDTY23 = 6370; //PWM3 用来产生舵机的pwm 波7.5%为中间PWMDTY45 = 9000; //PWM5 用来产生电机的pwm 波PWMPER23 = 20480; //320*4*32 //对应jp5

PWMPER45 = 20000; //PWM5 用来产生电机的pwm 波

PWME = 0x00; //PWM2,3,4,5 通道均不使能,待到进入中断再开放}

void Init_rti(void)

{

RTICTL = 0x74; //98Hz freq=oscclk/((b[3:0]+1)*2^(b[6:4]+9)) Caution:oscclk=16M

CRGINT |= 0x80;

}

void Init_port(void)

{

DDRB = 0xff;

DDRT = 0x00;

DDRJ = 0xff;

DDRK = 0xff;

DDRA = 0x00;

PORTK = 0xff;

PORTB = 0xcc;

PTJ = 0x00;

}

void Init_vari(void)

{

kp2 = 32;

kd2 = 10;

black_num = 7;

speed = 30;

position = centre;

line[0] = 0;

line[1] = 0;

formerspeed = 10000; //related to the PWMDTY value

}

void Init_PulseAcc(void)

{

ICSYS = 2; //选择计数器为255 后的状态和holding register 使

能及队列方式和锁存方式选择

相关主题
文本预览
相关文档 最新文档