第四届全国大学生智能汽车邀请赛技术报告
第五章 软件设计
5.1 主程序设计
程序主要用到S12芯片中的PWM模块、A/D模块、ECT模块、I/O模块等模块化设计。PWM模块主要用来控制舵机和电机的运转;ECT模块主要是用在了测速模块和数据采集,捕捉中断并计算瞬时速度;I/O模块主要是用来分配给按键,A/D模块主要采光电管的电压值变换。
5.2 软件系统总体设计
在整个系统设计中,用到了 4 个单片机基本功能模块:时钟模块、PWM 输出 模块、ECT 模块、AD 转换模块、。通过编写程序先对所用到的模块进行初始化, 并通过对相应数据寄存器或状态寄存器的读写,实现期望的功能。为实现所期 望的功能所需芯片资源如表 5.2.1 所示。
表 5.2.1 系统所用到的芯片资源 AD 模块 ECT 模块 PWM 模块 I/O模块 PAD0~PAD13 PT0 PWM23 PWM45,PWM01 PB0~PB7 光电传感器 速度检测脉冲计数 舵机控制 电机驱动电路 拨码开关 系统通过在主程序内循环调用信号检测、信号处理、路径计算和赛车控制等功能子模块,程序的执行为先对各个模块进行初始化,然后在主程序中完成 相应的功能。首先对各功能模块进行初始化,初始化流程图如图 5.2.1 所示。
15
第四届全国大学生智能汽车邀请赛技术报告
初始化完成以后,就在主程序中编写程序,完成智能车沿着跑道快速行驶的任务,其主程序的流程图如图5.2.2所示。
16
第四届全国大学生智能汽车邀请赛技术报告
图5.2.2 主程序流程图
17
第四届全国大学生智能汽车邀请赛技术报告
5.3 软件各功能模块设计
5.3.1 时钟模块
时钟基本脉冲是CPU工作的基础。MC9S12XS128微控制器的系统时钟信号,由时钟振荡电路或专用时序脉冲信号提供。MCU内部的所有时钟信号都来源于EXTAL引脚,也为MUC与其他外接芯片之间的通信提供了可靠的同步时钟信号。
S12的总线时钟是整个MCU系统的定时基准和工作同步脉冲,其频率固定为晶体频率的1/2。对于S12,可以利用寄存器SYNR、REFDV来改变晶振频率fOSCCLK,可以选用8MHz或16MHz外部晶体振荡器作外时钟。将SYNR设为3,REFDV设为1,可以得到64MHz的总线频率。
而锁相环产生的时钟频率fPLLCLK=2*fOSCCLK*(SYNR+1)/(REFDV+1),设计中我们将SYNR设为3,REFDV设为1,因此,总线时钟为16MHz,CPU工作频率为64MHz。
5.3.2 PWM输出模块
MC9S12XS128集成了8路8位独立PWM通道,通过相应设置可变成4个16位PWM通道,每个通道都有专用的计数器,PWM输出极性和对齐方式可选择,8个通道分成两组,共有4个时钟源控制。PWM0、PWM1、PWM4、PWM5为一组,使用时钟源ClockA和ClockSA;PWM2、PWM3、PWM6、PWM7构成另一组,使用时钟源ClockB和ClockSB。ClockA和ClockB均是由总线时钟经过分频后得到,分频范围1~128,通过寄存器PWMPRCLK来设置,ClockSA和ClockSB是分别通过ClockA和ClockB进一步分频后得到的,分频范围为1~512,分别通过寄存器PWMSCLA和PWMSCLB来设置,计算公式为:
ClockSA=ClockA/(2*PWMSCLA) ClockSB=ClockB/(2*PWMSCLB)
通过寄存器PWME来控制PWM0~PWM7的启动或关闭。
为了提高精度,我们将PWM0和PWM1,PWM2和PWM3,PWM4和PWM5级联,构成16
18
第四届全国大学生智能汽车邀请赛技术报告
位的PWM通道,级联时,2个通道的常数寄存器和计数器均连接成16位的寄存器, 3个16位通道的输出分别使用通道5、3、1的输出引脚,时钟源分别由通道5、3、1的时钟选择控制位决定。级联时,通道5、3、1的引脚变成PWM输出引脚,通道4、2、0的时钟选择没有意义。 通过寄存器PWMPRCLK、PWMSCLA、PWMSCLB、PWMCLK对各通道的时钟源进行设置。
PWM模块的初始化设置过程如下所示:
void PWM_init(void) {
PWME=0x00; PWMPRCLK=0x00; //舵机 PWMSCLB=40; PWMCLK_PCLK3=1; PWMPOL=0x08; PWMCAE_CAE3=0; PWMCTL_CON23=1; PWMPER23=8000; PWMDTY23=600;
PWME_PWME3=1; //反转 PWMSCLA=0x03; PWMCLK_PCLK1=1; PWMCAE_CAE1=0; PWMCTL_CON01=1;
PWMPER01=8888; //=600HZ PWMDTY01=0; //(PWMPERx+1) PWME_PWME1=0; //正转 PWMCLK_PCLK5=1; PWMCAE_CAE5=0; PWMCTL_CON45=1; PWMPER45=8888; PWMDTY45=8000; PWME_PWME5=1;
19