智能车设计

更新时间:2024-05-24 16:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

宁 波 大 学

信 息 学 院

智能车设计入门

实验报告

学 号: 126040557 姓 名: 王 修 登 专 业: 通信工程 指导教师: 蒋 金 涛

目 录

中文摘要

一、 硬件模块

(一)电源模块 (二)电机模块 (三)舵机模块 (四)液晶模块 (五)线性CCD模块

二、 软件模块

(一)系统总体流程图 (二)部分程序模块的设计

1、线性CCD模块 2、线性CCD数据处理模块 3、舵机模块

参考文献 致谢 附录

智能车设计入门

【摘要】 全国全国大学生“飞思卡尔”杯智能车竞赛是由教育部等自动化专业教学指导分委员会主办的一项以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的科技创意性比赛。

本文介绍了电磁组智能系统,本智能车系统是以蓝宙电子智能车系统为平台,该平台是以32位单片机K60为核心,用线性CCD检测赛道的道路信息,通过电机控制小车的速度,通过舵机打角来改变智能车的运动方向,用编码器来检测小车的速度,以12864液晶和按键来实现人机交互,共同完成智能车的控制。

【关键词】 智能车; 线性CCD; K60;电机;舵机。

一、 硬件模块

(一)电源模块

电源室一个系统正常工作的基础,电源模块为系统其他各个模块提供提供所需要的能源保证,因此电源模块的设计至关重要。智能车系统中接受供电的部分包括:单片机模块、电机驱动模块、传感器模块、电机模块等。可靠地电源室整个系统稳点运行的基础。

全部硬件电路的电源有7.2V , 2A /H 的可充电镍镉电池提供。由于电路中的不同电路模块所需要的工作电流容量各不相同,因此电源模块应包含多个稳压电路。本系统采用智能桥式电路BTN7960,电压输入范围宽,工作电流大,具有电流感应功能,体积小而且性价比高。将电池电压转换为各个模块所需要的电压。

电源模块由若干相互独立的稳压电源电路组成。由于智能车使用7.2V镍镉电池供电, 在小车行进过程中电池电压会有所下降故使用低压差电源管理芯片,K60单片机需要3.3V供电,所以还需要3.3V的电压。

(二)电机模块

本系统电机用于控制智能车的速度,对于整个系统占据着重要的地位。本系统采用智能桥式电路BTN7960来驱动电机,电压输入范围宽,工作电流大,具有电流感应功能,体积小而且性价比高。BTS7960是半桥驱动芯片,需要2个芯片来驱动一个电机,电流最高43A,其内阻很小,所以散热不是很厉害。因为本系统中为双电机,所以需要四个这样的芯片作为电机驱动。

(三)舵机模块

舵机模块在本系统中用于控制智能车的运行方向。所以需要专门的电路来驱动舵机。

(四)液晶模块

本系统对于人机交互方面的显示模块采用的是12864液晶。该液晶不仅可以显示英

文、数字字符,还可以显示汉字等。实验中,采用12864液晶来显示当前小车的运行速度,和设定的速度等参数。

(五)线性CCD模块

本系统中,线性CCD用于采集道路的信息,并且将道路的信息传送至K60单片机,

由单片机进行道路信息的读取和处理,并根据处理后的结果,来对电机和舵机进行控制,从而形成一个闭环的控制系统。

上位机软件构成

● CCDView 软件由 CCDView.exe、 ComDataHook.dll 组成,请用户使用前确认文件的组成正确。

● CCDView 主要用于显示用户 CCD 传感器采集的数据,并以图像的方式显示。 ★条形码:CCD 采集的数据,以灰度的方式表示,每个竖条代表一个数据。 ★曲线图:横坐标为 CCD 数据的偏移,纵坐标为灰度值(0~255)

下图为TSL1401线性传感器引脚及连接说明:

下图为线性CCD对的滤波电路:

二、 软件模块

(一)系统总体流程图

此部分是小车运行的核心部分,起着小车所有运行状态的作用,具有导向和决策的功能,程序流程如下图所示。

系统的总体流程是:在程序的一开始,先进行一些系统的初始化工作,有定时器的初始化、舵机的初始化、电机的初始化、线性CCD的初始化、液晶的初始化等等。

接着进入大循环中,一直等待20ms的标志为的到来,如果20ms的标志到来的时候,就对道路的信息进行检测,并且根据道路的信息找寻中点的位置,最后根据中点的位置,来对舵机的打角进行控制。也就是说,每20ms进行一次道路的检测,并对整个系统进行一些控制措施。

(1)中央处理器单元

中央处理器采用MC9S12DG128芯片,以运算速度很快的CPU12内核为核心的单片机,经过锁相环后,时钟频率可达到40MHz,内部Flash高至128KB,拥有2组各8路10位A/D、16路I/O口,有功能强大的8位PWM输出共8路,以及8路16位增强型定时器(ECT)。该单片机功能强大,完全能够胜任小车的检测和控制功能。

(2)道路识别模块

道路检测模块用于完成赛道相对智能车的偏移量、方向、曲率等信息的采集,通过连接线把信息传送给中央控制单元,使智能车沿着跑道轨迹稳定前行,获取更多、更远、更精确的赛道信息是提高智能车运行速度的关键。

(3)电源模块

为各个电路模块提供稳定电源,可靠的电源方案是整个电路稳定运行的基础,电源模块包含多个稳压电路,将充电电池电压转换成各模块所需要的电压。

(4)舵机驱动模块

对模型车上的舵机进行驱动,达到快速准确控制赛车方向。 (5)电机驱动模块 通过电机驱动模块,控制驱动电机两端电压可以使模型车加速运行,也对模型车进行制动。

(6)速度检测模块

通过速度检测模块对模型车的速度进行检测,实现闭环控制,以便调整弯道和直道的速度,从而提高平均速度,使小车能够平稳快速的跑完全程。

智能车的工作模式是:光电传感器探测赛道信息,转速传感器检测当前车速,电池电压

监测电路检测电池电压,并将这些信息输入单片机进行处理。通过控制算法对赛车发出控制命令,通过转向舵机和驱动电机对赛车的运动轨迹和速度进行实时控制。 (7)转弯控制策略

总体流程图:

(二)部分程序模块

1、 线性CCD模块

我们常说的摄像头 CCD 模块通常使用的是面阵 CCD 芯片,一般以 OV 系列面阵 CCD 最为常用。而 TSL1401 属于线性 CCD,也可以叫做线阵 CCD。与面阵 CCD 相比,线性 CCD 最明显的特点就是其只能采集一行的可视像素。本系统采用的线性CCD可以采集到一行的128个点,并用一个数组Pixel[]存储起来。

以下是CCD采样程序:

void ImageCapture(unsigned char * ImageData) {

unsigned char i; extern u8 AtemP ;

SI_SetVal(); /* SI = 1 */ SamplingDelay();

CLK_SetVal(); /* CLK = 1 */ SamplingDelay();

SI_ClrVal(); /* SI = 0 */ SamplingDelay();

//Delay 10us for sample the first pixel /**/

for(i = 0; i < 250; i++) { //更改250,让CCD的图像看上去比较平滑,

SamplingDelay() ; //200ns //把该值改大或者改小达到自己满意的结果。

}

//Sampling Pixel 1

*ImageData = ad_once(ADC1, AD6b, ADC_8bit); ImageData ++ ;

CLK_ClrVal(); /* CLK = 0 */

for(i=0; i<127; i++) { SamplingDelay(); SamplingDelay();

CLK_SetVal(); /* CLK = 1 */ SamplingDelay(); SamplingDelay(); //Sampling Pixel 2~128

*ImageData = ad_once(ADC1, AD6b, ADC_8bit); ImageData ++ ;

CLK_ClrVal(); /* CLK = 0 */ }

SamplingDelay(); SamplingDelay();

CLK_SetVal(); /* CLK = 1 */ SamplingDelay(); SamplingDelay();

CLK_ClrVal(); /* CLK = 0 */ }

以下是计算曝光时间的程序: u8 IntegrationTime = 10;

void CalculateIntegrationTime(void) { extern u8 Pixel[128];

/* 128个像素点的平均AD值 */ u8 PixelAverageValue;

/* 128个像素点的平均电压值的10倍 */ u8 PixelAverageVoltage;

/* 设定目标平均电压值,实际电压的10倍 */ s16 TargetPixelAverageVoltage = 25;

/* 设定目标平均电压值与实际值的偏差,实际电压的10倍 */ s16 PixelAverageVoltageError = 0;

/* 设定目标平均电压值允许的偏差,实际电压的10倍 */ s16 TargetPixelAverageVoltageAllowError = 2;

/* 计算128个像素点的平均AD值 */ PixelAverageValue = PixelAverage(128,Pixel);

/* 计算128个像素点的平均电压值,实际值的10倍 */

PixelAverageVoltage = (unsigned char)((int)PixelAverageValue * 25 / 194);

PixelAverageVoltageError = TargetPixelAverageVoltage - PixelAverageVoltage; if(PixelAverageVoltageError < -TargetPixelAverageVoltageAllowError) {

PixelAverageVoltageError = 0- PixelAverageVoltageError ; PixelAverageVoltageError /= 2; if(PixelAverageVoltageError > 10 ) PixelAverageVoltageError = 10 ;

IntegrationTime -= PixelAverageVoltageError; }

if(PixelAverageVoltageError > TargetPixelAverageVoltageAllowError) {

PixelAverageVoltageError /= 2; if(PixelAverageVoltageError > 10 ) PixelAverageVoltageError = 10 ;

IntegrationTime += PixelAverageVoltageError;}

// uart_putchar(UART0,0XAA) ;

// uart_putchar(UART0,PixelAverageVoltage) ; // uart_putchar(UART0,PixelAverageVoltageError) ; // uart_putchar(UART0,IntegrationTime) ; if(IntegrationTime <= 1) IntegrationTime = 1; if(IntegrationTime >= 100) IntegrationTime = 100; }

2、 线性CCD数据处理模块

数据处理模块实现的功能是读取线性CCD采集的128个点的数据,并且根据数据找到两个凹槽的中点的位置。本系统采用从中间往两边找的方法,先计算128个数据的平均值,再从第64个点往两边找,一直找到连续比平均值都小的第五个点,并且将他们作为两个凹槽的位置,这两个凹槽的位置的中间就是中点N。

u8 caiji() {

u8 n,i,average; u16 sum;

for(i = 0, sum = 0; i < 128; i++) {

sum = sum + Pixel[i]; }

average = sum / 128; for(i = 64; i > 0; i--) {

if(Pixel[i] < average) {

if(Pixel[i+1] < average) {

if(Pixel[i+2] < average) {

if(Pixel[i+3] < average) {

if(Pixel[i+4] < average) {

min1 = i + 2; break; } }

} } } }

for(i = 65; i < 128; i++) {

if(Pixel[i] < average) {

if(Pixel[i-1] < average) {

if(Pixel[i-2] < average) {

if(Pixel[i-3] < average) {

if(Pixel[i-4] < average) {

min2 = i - 2; break; } } } } } }

n = (min1 + min2) / 2; return n; } 3、 舵机模块

舵机模块根据返回的中点位置来打角度,控制小车将要运行的方向。 if(zhongdian > 64)

{

duoji = 25 * (zhongdian - 64); turn_right(); } else {

duoji = 25 * (64 - zhongdian); turn_left(); }

//else turn_right } 4、 液晶模块

液晶模块用来显示一些与系统有关的一些的参数。 void SHOW(void)//显示LCD {

byte txt[16]=\

sprintf((char*)txt,\ LCD_P6x8Str(31,3,txt);

sprintf((char*)txt,\ LCD_P6x8Str(31,4,txt);

sprintf((char*)txt,\ LCD_P6x8Str(31,5,txt); }

参考文献

[1] 野火. 三天入门 Cortex-M4 —Kinetis 系列[M]. 野火嵌入式开发工作室,2002,23~26.

[2]卓晴,黄开胜,邵贝贝等.学做智能车----挑战“飞思卡尔”.北京航空航天大学出版社.

本文来源:https://www.bwwdw.com/article/tjw7.html

Top