飞思卡尔智能车大赛技术报告 下载本文

内容发布更新时间 : 2024/5/4 12:42:07星期一 下面是文章的全部内容请认真阅读。

4.2.4编码器

5智能车软件系统设计

5.1程序概述

程序使用了XS128芯片中的TIM模块、PIT模块、AD模块、I/O模块、PIT模块、PWM模块。其中舵机和电机通过PWM模块来控制,舵机频率100Hz,通过对赛道黑线边缘部分的提取对赛道位置和赛道地形进行判断,I/0块主要用来作为人机交互模块使用。PIT模块作为定时器产生1ms的定时中断,转向控制服务程序,速度控制服务程序均在PIT中断当中完成。AD采样服务程序在AD中断中完成。 程序大概流程如下:

(1)进行各个模块的初始化。

(2)在按下启动键之后程序进入大循环,扫描是否有暂停键按下。

(3)AD中断服务程序进行AD采样,PIT中断服务程序,进行线性CCD返回数值数据析. (4)转向控制,速度控制,输出相应的PWM波值控制电机和舵机,使智能小车在赛道上平稳运行。

5.2采集传感器信息及处理

TSLS1404线性CCD的工作时序图如图:

16

对赛道每扫描一次信息的初始化以及每取五次信息进行一次传输: for(i=0; i<128; i++) {

*pixel_pt++ = 0; }

StartIntegration();//预曝光

EnableInterrupts;//开中断 for(;;) {

//SpeedControl(); MotorAction(10); //key_scan();//键盘扫描 if(TimerFlag10ms == 1) {

TimerFlag10ms = 0;//清10ms标志 cnt++; if(cnt >=5) {

cnt = 0;

17

SendImageData(PixNew); }

5.3计算赛道信息:

在实际测试和比赛之中,CCD接收到的信息往往伴随着许多杂点,那么就要削减这些杂点对计算的影响,我们采用了高斯滤波去除错误点并实现曲化采集到的赛道信息点,为判断出黑线边界我们又对数据进行了二值化,以获取赛道的边缘线。同时为了尽量减少CCD的曝光时间我们队CPU的执行进行了顺序化。最后达到获取赛道的信息。二值化的阈值在这里用了动态阈值,大大克服了CCD对环境的光亮强的狭小范围内依赖程度搞得高的缺点、 5.3.1,去噪点

void Enosing(uchar *a) { char i;

for(i=1;i<127;i++) {

if(a[i]==0) {

if((a[i-1]==1)&&(a[i+1]==1)) {

a[i]=1; } }

if(a[i]==1) {

if((a[i-1]==0)&&(a[i+1]==0)) {

a[i]=0; }

18

} } }

5.3.2计算动态阈值

void trends_threshold(uchar *a) {

unsigned

i,j,zmax=0,zmin=255,zbmax=0,zbmin=255,zamax=0,zamin=255,t0,t1,za,zb; for(i=0;i

for(j=0;j

if(a[j]>zmax) { zmax=a[j]; }

if(a[j]

t0=(zmax+zmin)/2; if(Threshold!=t0) {

for(j=0;j

if(a[j]>=t0) {

if(a[j]>zamax)

19

char

{ zamax=a[j]; }

if(a[j]

if(a[j]>zbmax) { zbmax=a[j];

}

if(a[j]

} za=(zamax+zamin)/2; zb=(zbmax+zbmin)/2; t1=(za+zb)/2;

if(t1!=t0) t0=t1; } Threshold=t1; }

20