4.1主程序说明
图1.2是我们采用的CCD摄像头图像传感器,它输出的标准的视频复合信号,利用同步信号分离芯片LM1881将分离后的同步信号输入到二值化比较器,将模拟视频信号二值化后输入单片机的IO口。通过单片机的分析处理,将输出相应的PWM信号控制舵机和电机。
首先,打开单片机电源,延时四秒钟后,进入寻迹模式,单片机不停的扫描I/O口。监测某一行图像中各个像素点点的电压值,当检测到某一点为0(低电平)时,说明传感器扫到了黑线,这样可以确定小车与轨道的相对位置,进而给出相应的控制信号。当监测到信号位于整行图像信号的左侧时,说明小车向右偏出,应给舵机左转舵的信号;当监测到信号位于整行图像右侧时,说明小车向左偏出,应给舵机右转舵的信号。
另外,小车具有自适应调速动能,可以根据速度传感器(光电码盘)传回的电压信号,对小车行驶的速度实时进行控制调整。当CCD传感器检测到在直道前进时,小车直线加速至事先设定的阈值,进入弯道的时候减速至低速的阈值。由单片机配合速度传感器实现加减速的变化,平滑稳定。利用给驱动电机反向电流实现小车制动控制,效率比较高并且稳定。
4.2 PWM舵机控制说明
舵机的电源线和地线接好后,只要为其提供不同宽度的正脉冲控制信号即可方便的控制其旋转的角度。舵机工作原理请参照 ——1.1.2 舵机控制 一节。为提供不同宽度的正脉冲控制信号,我们采用MC9S12DG128单片机的PWM模块为其提供同频率但占空比不同的控制信号。图4.1 是其PWM程序实现框图。
采用C语言编程的代码实现如下:
// PWM的X通道使能
PWME = 0xFF; //PWME_PWME1=1;PWME_PWME3=1; PWME_PWME5=1;
PWMCLK=0xXX;//时钟选择,令对应位为1,则对应通道选择可分频时钟;对//应位为0,则对应通道选择不可分频时钟
PWMPRCLK_PCKA0=1;
PWMPRCLK_PCKA1=1;
PWMPRCLK_PCKA2=1;//时钟分频。上面3句程序是在选择可分频的时钟A(PWM //有8个信号输出通道,0、1、4、5对应时钟A;2、3、//6、7对应时钟B)的条件下写的 。上面三个数按高低//为顺序组成的二进制数转化为十进制后为n,则分频率//为2的n次方。
PWMPOL=0xXX;//极性选择,令对应位为1,则对应的通道脉冲起始为高电平;//对应位为0,则对应的通道脉冲起始为低电平
PWMCTL_CONXY=0;//X、Y通道分别单独组成8位通道,否则X、Y通道共同//组成16位通道。注;XY的组合仅限于01、23、45、67,//且16位通道时,往往X通道作为高8位
PWMCAE=0xXX;//脉宽对齐方式选择,令对应位为1,则选择该通道为中心对//齐方式;对应位为0,则选择该通道为左对齐方式。
PWMCTL_PSWAI=0;//准许等待模式下,分频时钟仍然运行
PWMCTL_PFRZ=0;//准许冷结模式下,PWM波形输出
PWMSCLA=0xXX;// 时钟再分频,Clock SA = Clock A / (2 * PWMSCLA)
PWMPERXY=0xXX;
PWMDTYXY=0xXX; //选择X、Y通道占空比(XY的组合仅限于01、23、45、67)
//当PPOLx=0时Duty Cycle=[(PWMPERXY-PWMDTYXY)/PWMPERXY]*100%
//当PPOLx=1时Duty Cycle = [PWMDTYXY/ PWMPERXY] * 100%
当写入完PWMDTYXY后,计数器清零、开始计数,产生PWM波输出。
由于PWM模快的初始化程序是基本不变的,我们在控制程序中所要改变的只有PWMDTYXY的值,用以改变PWM占空比,进而改变正脉冲的宽度,用以控制舵机的旋转。因此,我们没有必要为控制舵机专门写一段子程序,PWM模快的初始化程序可以在主程序的开始进行且只用初始化一次,在主程序中所要做的是为PWMDTYXY赋值。这样做可以减少整个程序的长度,避免了调用子程序所产生的麻烦和时间浪费、避免了重复初始化。



