(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);