MC9S12DG128 微控制单元作为MC9S12 系列的16 位单片机,由标准片上外围设备组成,包括16 位中央处理器、128KB 的Flash 存储器、8KB 的RAM、2KB 的EEPROM、两个异步串行通信接口、两个串行外围接口、一组8 通道的输入捕捉或输出捕捉的增强型捕捉定时器、两组8 通道10 路模数转换器、一组8 通道脉宽调制模块、一个字节数据链路控制器、29 路独立的数字I/O 接口、20 路带中断和唤醒功能的数字I/O 接口、5 个增强型CAN 总线接口,同时,单片机内的锁相环电路可使能耗和性能适应具体操作的需要。S12 的片内资源如图5-1所示。

图5-1
具备了以上这些卓越的性能,MC9S12DG128 完全能够满足我们设计的需要,并使得电路更加紧凑。以下将首先介绍系统设计中用到的各个软件功能模块的设置,然后再讨论黑线提取及车体控制算法。
5.2 系统初始化
5.2.1 摄像头初始化
由于摄像头行同步信号接到了S12 单片机的外部中断IRQ 引脚,所以当每行视频信号到来时,会产生一个中断。此时如果需要采集该行,就开始进行AD 转换。摄像头的初始化包括初始化中断和AD 模块,具体过程为:
DDRS_DDRS2=0; //奇偶场信号输入
INTCR_IRQE=1; //外部IRQ使能
INTCR_IRQEN=1; //IRQ选择为边沿触发
ATD0CTL2=0xc0; //AD上电, 快速清零, 无等待, 关闭外部触发
ATD0CTL3=0x08; //每通道转换一次, 无 FIFO
ATD0CTL4=0x81; //8位精度,2个时钟周期, ATD时钟=8MHz
ATD0CTL5=0xa0; //右对齐, 无符号,单通道,通道0
ATD0DIEN=0x00; //关闭数字输入
5.2.2 PWM初始化
脉宽调制(PWM)模块有8 路独立的可设置周期和占空比的8 位PWM 通道,每个通道配有专门的计数器。该模块有4 个时钟源,能分别控制8 路信号。通过配置寄存器可设置PWM的使能与否、每个通道的工作脉冲极性、每个通道输出的对齐方式、时钟源以及使用方式(单独输出还是合并输出)。
为了提高控制精度,将PWM0、PWM1 两路8 位通道合并为一个16 位通道来控制舵机,这样可使舵机的控制精度从1/255 提高到1/65536。PWM 模块的初始化设置过程为:
DDRS_DDRS7=1; //33886使能信号输出
PTS_PTS7=0; //33886使能
PWME=0x00; //关闭pwm
PWMCTL_CON01=1; // PWM01合并为16位输出
PWMPRCLK=0x34; //时钟A=2M, 时钟B=4M
PWMSCLA=100; //时钟SA=时钟A/2/100=10k
PWMSCLB=1; //时钟SB=时钟B/2/1=2000k
PWMCLK= 0b00011100; //pwm0,1-A; pwm2,3-SB; pwm4-SA
PWMPOL=0xff; //极性位=1, duty=高电平时间
PWMCAE =0x00; //左对齐
PWMPER01=40000; //舵机pwm周期=时钟A/40000=50Hz
PWMDTY01=3000; //舵机中心位置
PWME_PWME1=1; //舵机使能
PWMDTY2=100;
PWMPER2=200; //电机频率=时钟SB/200=10K
PWME_PWME2=1; //电机使能
5.2.3 速度传感器初始化
通过对每个控制周期内速度传感器产生的脉冲数进行累加,可以测出这一周期内的平均速度。由于目前速度传感器的精度较高,所以用了16 位的脉冲累加器PB 进行脉冲计数。
其初始化过程为:
TIOS=0x00; //所有通道设置为输入捕捉
TSCR1_TEN=1; //主计时器使能
TCTL4=0x03;
PBCTL_PBEN=1; //16 位脉冲累加器B 使能
5.2.4 串口初始化
S12 有两个串行通信接口SCI0 和SCI1,均为TTL 电平输出。使用时,可以对波特率、数据格式(8 位或9 位)、发送输出极性、接收唤醒方式等进行选择。另外,发送和接收可分开使能,模块中还提供了多种避免传输错误的选项。在系统调试时,利用其中一个串口SCI0 通过Zigbee 和上位PC 通信,其初始化过程如下:
SCI0BD=52; //波特率=总线时钟/(16*BD)=32MHz/(16*52)=38400Hz
SCI0CR1=0x00; //正常工作, 8 个数据位, 1 个停止位
SCI0CR2=0x0c; //允许收发
5.2.5 超频设置
S12 单片机中有四个不同的时钟,即外部晶振时钟、锁相环时钟、总线时钟和内核时钟。目前电路采用的是16MHz 的外部晶振,默认设置下,锁相环时钟为32MHz,总线时钟为8MHz,内核时钟为16MHz。通过将PLLSEL 置位,可选择总线时钟从锁相环时钟获得,而锁相环时钟与外部晶振时钟的关系由SYNR、REFDV 两寄存器决定。通过寄存器设置,将总线时钟超频到了32MHz。由于总线时钟用作片上外围设备的同步,而内核时钟则用作CPU 的同步,它决定了指令执行的速度,所以超频后AD 的采样性能大大提高。具体设置过程为:
REFDV=3;
SYNR=7; //总线时钟=16MHz*(SYNR+1)/(REFDV+1)=32MHz
while(0==CRGFLG_LOCK); //等待VCO 运行稳定
CLKSEL=0x80;
5.2.6 参数设置模块初始化
系统参数设置模块由1 个数码开关、2 个数码管和5 个LED 指示灯组成。
通过数码开关选择要设置的参数类型和该参数的具体值,同时利用LED 灯和
数码管进行显示,可以方便地对各种参数进行设置。这部分的初始化过程为:
DDRA=0xff; //A 口输出
DDRB=0xff; //B 口输出
PORTA=0x00;
PORTB=0x00;
TIOS=0x00; //设置为输入捕捉
TSCR1_TEN=1; //计时器使能
TCTL3=0b01001000; //捕捉PT7 的上升沿和PT5 的下降沿
DDRE=0xff;
DDRP=0xff;
5.3 视频采集和黑线提取
5.3.1 视频信号时序
由于摄像头产品说明上通常只会给出有效像素和分辨率(分辨率即为每场信号中真正为视频信号的行数),但不会具体介绍视频信号行的持续时间、它们在每场信号中的位置、行消隐脉冲的持续时间等参数,而这些参数又关系到图像采样的有效实现,因此利用S12 的AD 和定时器对这些参数进行了实际测量。具体结果见表5-1。
表5-1视频信号时序参数

从上表可以看出,该摄像头扫描的每场中有320 行信号,其中第23 行到310 行是视频信号,第311 行到下一场的第22 行是场消隐信号。在视频信号区,每行信号持续的时间相同,约为62us;每行的行同步脉冲持续时间也相同,约为4.7us。而在场消隐区,每行持续的时间会有所变化,每行对应的消隐脉冲持续时间,尽管大多数为3.5us,但也有变化。场消隐区中第320 行的消隐脉冲持续时间远长于其他消隐脉冲,此脉冲即为场同步脉冲。
5.3.2 视频信号采集
在利用LM1881 分离出了行同步信号、场同步信号和奇偶场信号后,可以采用查询方式或者中断方式对视频信号进行采样。结合前面的电路原理图,主程序采用I/O 查询方式判别奇偶场信号跳变,并用中断方式处理行同步引发的外部中断。当奇偶场信号发生跳变(即新的一场到来)时,对行同步信号计数器清零。在行中断服务函数中,每来一个行同步则行计数器加1,当行计数等于所需采样行时,开始对此行信号进行AD 转换,直到下一个行同步信号到来。行中断服务函数的流程为:

图5-2 行中断服务函数流程
由于实际中没有必要对280 行视频信号全部进行采集,所以选择第43 行到284 行间等间隔的60 行视频信号进行采集。为了提高采样精度,每次AD 转换时先将视频信号存入一个一维数组sample_data 中,然后在紧接着的下一行时间里将该行信号转存到二维数组image_data 中。目前,单行视频采集的点数为80(其中有效点数为65),这一采样精度使得系统可以针对车体偏差,对舵机位置进行精确调整,以提高系统稳定性。将采集到的图像通过串口发送至PC 机,然后用Labview 程序进行显示,可以清楚地看到视频采样的效果:

图5-3单行80点:前0-13点为行消影、凹槽为黑线所处位置

图5-4 60行视频采集效果
5.3.3黑线位置提取
得到一场视频信号后,可以从中提取出黑线位置、是否是起始线交叉线等各种有效信息。这些信息可以用于对舵机、速度进行控制,也可用于赛道记忆。下面先对黑线位置提取算法进行介绍。目标导引线(即赛道上的黑线)的宽度相对整个赛道较窄,因此只要提取目标导引线的某些特征点,就能反映出导引线的形状。如图5-5,可以取每行的中间点或边缘点作为该行的特征点。

图5-5 黑线特征点示意图
5.4速度闭环控制
5.4.1速度控制介绍
通过速度传感器获取的当前速度值调整电机的PWM 占空比,可以实现对于速度的闭环控制。这样做改变了通过直接设置PWM 占空比调整电机转速的开环控制方法,通过对速度的闭环控制,去掉电源电压和车身重量对车速的影响,采取了最可靠的方法,保证赛车各段速度较为稳定。
速度闭环控制有很多种方法,比如PID 控制、bang-bang 控制。经过实际测试,由于车模电机属于低负载简易永磁直流电机,其加速减速特性较差,因此如采用PID 控制,P 参数只能控制在很小的范围,否则很容易发生超调。P 参数的减小,导致电机速度响应变慢,影响实际赛车控制效果。而选用bang-bang控制方法,让电机动态稳定在一定转速下,实际在赛道上表现很稳定,而且速度响应很快。
5.4.2实验依据
pwm波与实际速度的关系
首先,测定开环时不同PWM 占空比对应的稳定速度值。由于电机启动时,初始角速度为0,此时转动惯量很小,因此角加速度很大。电机在直流电压的驱动下不断加速,同时转动惯量也逐渐增大,使得角加速度减小。最后角加速度为0,电机速度稳定在某一水平上。这一速度值反映的是该PWM 占空比下,电机所能达到的最高速度。实验测得的结果如图5-6所示。

图5-6 pwm占空比与稳态速度的对应关系
实验例图

图5-7 PWMDTY=170
5.5 EEPROM
由于单片机芯片的Ram容量有限,而记忆算法需要大量的存储空间记录赛道的信息,第一圈记录的数据越详细,第二圈可用于控制的信息就越丰富,因此如何记录和存储足的数据也是运用记忆算法的基础。
算法研究者可以对算法进行优化处理,改变保存的格式以节省内存空间。例如采用一定的压缩算法,把直道,弯道分成若干级别,分别记录他们的距离和顺序。优化压缩虽然可以节省存储空间,但同时对于赛道信息多少都有丢失,不利于记忆算法的准确使用,因此如果可以获得更大的存储空间,就可以完整记录赛道的特征信息。S12提供了2K EEPROM,EEPROM就是electrically erasable programmable,是一种电可擦除可编程只读存储器,并且其内容在掉电的时候也不会丢失。在平常情况下,EEPROM与EPROM一样是只读的,需要写入时,在指定的引脚加上一个高电压即可写入或擦除,而且其擦除的速度极快!通常EEPROM芯片又分为串行EEPROM和并行EEPROM两种,串行EEPROM在读写时数据的输入/输出是通过2线、3线、4线或SPI总线等接口方式进行的,而并行EEPROM的数据输入/输出则是通过并行总线进行的。
小车的平均速度一般都在2 米左右,对于一个50M 长的赛道,25 秒内就可以跑完,由于摄像头50Hz 的限制,小车的控制周期一般都是20ms,由此可以得出跑完一圈的才运行了1000 多个周期,就算每个周期都记录一定的信息,EEPROM也足够满足需求。在对EEPROM 进行编程和擦除时,要严格地遵守下列步骤:
首先,访问ECLKDIV 寄存器,进行时钟分频,EEPROM 需要编程时钟在150-200KHz 之间。如果没有设定时钟分频,对EEPROM 的一切操作无效。检查CBEIF 标志位,确定地址、数据和命令缓冲区是否为空。然后,进行如下的三步操作(注意,操作顺序不能改变,中间也不可插入其他操作):向需要编程的地址写入一个字(2Byte)。如果是全擦除操作,可向EEPROM 中任意一个地址写入数据;如果是向量擦除,则二进制地址的最后两位将被忽略。向ECMD 寄存器写入命令字。向CBEIF 位写入1 开始命令。CCIF 位置1 表示命令被执行完毕。用户可以通过中断机制确定命令的完成。如果出现无效的命令字或是企图修改保护区内容的操作,ACCERR 和PVIOL 位会置位。
测试表明,对EEPROM 每次进行写操作所需的时间大约为0.9ms,而每次读的时间仅需2us。写操作的时间较长,这应引起足够的重视,因为对于摄像头控制方案,保证控制周期在20ms 以内是非常必要的,否则赛车在高速行驶时将来不及反应。除此以外,对于记忆信息的处理时间也应尽量压缩。由于第一圈控制算法通常较为简单,这给信息处理提供了一定的时间裕量,所以只要算法得当,赛道记忆算法的条件能得到满足。


