第五章 软件系统设计及实现
推荐给好友
打印
加入收藏
更新于2008-07-30 14:57:45

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

 




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.