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