5.1. 系统概述
软件部分主要的工作是通过采集CMOS摄像头的视频信号,提取跑道黑线的 路径信息从而控制小车的转向以及速度。以下将首先介绍系统设计中用到的各 个软件功能模块的设置,然后再讨论黑线提取及转向控制算法。
5.2. 系统设计
在整个系统中,主要使用了7个单片机基本功能模块:时钟模块、ECT模块、AD模块、PWM输出模块、外部中断模块、串口通信模块以及普通IO模块。根据系统实际需求,对各个模块进行了初始化配置,通过对相应数据寄存器或状态寄存器的读写,实现相应的功能。
5.2.1. 时钟模块
S12单片机中有四种层次的时钟,即外部晶振时钟、锁相环时钟、总线时钟和内核时钟。当前电路板采用的是16MHz的外部晶振,因此外部晶振时钟为16MHz,默认设置下,锁相环时钟为16MHz,总线时钟为8MHz,内核时钟16MHz。锁相环时钟与外部晶振时钟的倍、分频关系由SYNR、REFDV两寄存器决定。总线时钟用作片上外围设备的同步,而内核时钟则用作CPU 的同步,它决定了指令执行的速度。 尽管S12单片机的上限内部总线频率是25MHz,但是由于控制小车运动的环境并不十分恶劣,所以在采用摄像头作为寻线传感器的情况下,为了提高AD采(64uS)的时间内的采样点数,我们对单片机进 集速度,增加在一行视频信号行了超频。最终,超频后的内核时钟为72MHz,总线时钟为36MHz,具体设置过程为:
CLKSEL=0;
PLLCTL_PLLON = 0; /* Disable the PLL */
SYNR = 35; /* Set the multiplier register */
REFDV = 15; /* Set the divider register */
/* PLLCTL: CME=0,PLLON=1,AUTO=1,ACQ=1,??=0,??=0,??=0,SCME=0 */
PLLCTL = 112;
while(!CRGFLG_LOCK); /* Wait */
CLKSEL_PLLSEL = 1; /* Select clock source from PLL */串口通信模块
此段代码安排在系统最初初始化时执行。
5.2.2. ECT 模块
视频信号的行同步有三种方式输入S12 单片机, 第一种是通过IRQ外部中断 引脚接入,第二种是通过ECT 模块接入,第三种采用普通I/0端口通过循环查询操作。实际调试中,由于采用 查询方式更大的消耗系统资源,在中断资源充足 的情况下,暂不考虑。而视频的场同步信号是分为奇偶场,并且电平相反,所 以要 求中端口同时对场同步信号的上下延敏感。所以选择ECT模块的捕获功能更适应本系统,此段代码为:
//通道六位行同步信号 捕获上升延
TIOS_IOS6 = 0 ; //PT6为输入捕获
ICOVW_NOVW6 = 0 ; //新值覆盖旧值
TCTL3 |= 0x10 ; //通道6上什延捕获
TFLG1_C6F = 1; // Reset interrupt request flag
HsDisable(); //中断禁止
//通道七位场同步信号 捕获上下延
TIOS_IOS7 = 0 ; //PT7为输入捕获
ICOVW_NOVW7 = 0 ; //新值覆盖旧值
TCTL3 |= 0xC0 ; //通道7上下捕获
TFLG1_C7F = 1; // Reset interrupt request flag
TIE_C7I = 1 ; //中断允许
同时ECT模块还需要用作定时器,根据检测与控制需要,适当的调整速度计 算频率,这里设置为50Hz 。
此段代码为:
TIOS = 0x81;
TC0 = 0xFFFF; are register
TSCR2 = 0x04;
TFLG1_C0F = 1; // Reset interrupt request flag
// Enable interrupt
TIOS = 0x01; // Store given value to the comp
TIE = 0x01;
TSCR1 = 0X80; // Enable Timertimer enable
5.2.3. AD 模块
模数转换器模块有8路通道,精度可设置为8位或10位。另外单次转换时间、转换结果类型、转换完成是否产生中断、转换序列长度等都是可以自行设置的。本次设计中,只有视频信号1路模拟信号输入AD模块,因为摄像头视频信号采集不需要有太高的精度,而对于一行信号的检测需要很快的速度,因此,决定采用8位精度单通道连续扫描模式采集模拟信号。
具体设置过程为:
ATD0CTL2=0xC0; // AD上电, 快速清零, 无等待, 禁外部触发, 中断允许
ATD0CTL4=0x80; // 每个序列 1 次转换, No FIFO, Freeze 模式下继续转换
ATD0CTL3=0x08; // 8位精度, 2个时钟, PRS=5, divider=12
ATD0DIEN=0x00; // 禁止数字输入
5.2.4. PWM 模块
脉宽调制模块有8路独立的可设置周期和占空比的8位PWM 通道(也可配置,每个通道配有专门的计数器。该模块有4个时钟源,能分别 为4路16位通道)控制8路信号。通过配置寄存器可设置PWM的使能与否、每个通道的工作脉冲极性、每个通道输出的对齐方式、时钟源以及使用方式。 为了提高控制精度,我们将PWM2、PWM3 两路8位通道合并为一个16位通道来控制舵机,这样可使舵机的控制精度从1/255提高到1/65536。将PWM0、PWM1机的上臂,PWM4、PWM5路合并控制驱动电机的下臂。 PWM模块的初 合并控制电始化设置过程为:
//16位 PWM
PWME = 0x00; //Disable PWM
//初始化PWM01 用于控制驱动电机 频率 1KHz
PWMCTL_CON01 = 1 ; //connect 0 and 1
PWM PWMPOL_PPOL1 = 1 ;//polarity of the resulting
PWMCLK_PCLK1 = 0 ;//Select clock source
PWMPRCLK = 0x00 ; // Set prescaler register
PWMCAE_CAE1 = 0 ; //align mode ,0 is left align mode; 1 is center align mode
PWMCNT01 = 0;//counter value ,write anything ,this will be set 0x0000
PWMDTY01 = PWM_DRIVER ; //duty
PWMPER01 = 36000 ; //period
//初始化PWM45 用于控制驱动电机 频率 1KHz
PWMCTL_CON45 = 1 ; //connect 0 and 1
PWMPOL_PPOL5 = 1 ; //polarity of the resulting PWM
PWMCLK_PCLK5 = 0 ; //Select clock source
PW register MPRCLK = 0x00 ; // Set prescaler
PWMCAE_CAE5 = 0 ; //align mode ,0 is left align m ode; 1 is center align mode
PWMCNT45 = 0 ;/ /ceounter valu thing ,this will be set 0x0000 ,write any
PWMDTY45 = 0 ;
PWMPER45 = 36000 ;
//初始化PWM23 用于控制舵机
PWMCTL_CON23 = 1 ; //connect 0 and 1
M PWMPOL_PPOL3 = 1 ; //polarity of the resulting PW
PWMCLK_PCLK3 = 0 ; //Select clock source
PWMPRCLK |= 0x 40 ; // Set presca ler register
P WMCAE_CAE3 = 0 ; //align mode ,0 is left align mode; 1 is center align mode
PWMCNT23 = 0 ;//counter value ,write anything ,this will be set 0x0000
PWMDTY23 = STEER_CENTER ; //duty
PWMPER23 = 18000 ; //period
PWME = 0x2A ; // Run counter


