武汉科技大学本科毕业设计
表3.1 功能描
1 2 3 4 5 6 7 8 9 10 11 12 13 14 /PREVIOUS NC CLK DATA BUSY /P/S NEXT VCC GND /RESET SPK+ SPK- NC AUDIO 上一曲,可按键触发 空 时钟脉冲端 数据命令输入端 播放忙信号输出端 播放/停止 下一曲 电源正极(3.3V) 电源负极 复位端 音频输出(+) 音频输出(-) 空 内置反馈DAC 述
根据设计要求以及所采取的设计方案,该模块的硬件电路原理如图3.14所示。
图3.14 语音模块电路原理图
其中,模块的CLK、DATA端分别与单片机的PA6、PA7引脚连接,当做IIC总线的时钟端和数据段,实现单片机与模块的IIC通信,将采集到的数字量数据经过串行传输传递给单片机。
- 16 -
武汉科技大学本科毕业设计
4 系统软件设计
软件作为整个汽车超速报警器系统的灵魂,其编写将直接关系到系统能否正常工作。各模块功能的实现不仅需要硬件电路的支撑,还需要软件编写的合理可行。在设计的2.5ms控制周期下,对系统信号处理及硬件电路驱动在时间上做一个合理分配,保证各模块的功能既能顺利实现又不相互干扰。
本章将主要从单片机模块初始化、人机交互、IIC总线、语音模块驱动等几个方面来详细的论述。
4.1 系统程序框架图
为了保证超速报警器的稳定运行要求,我们需要使整个系统的控制具有良好的实时性和周期性,除了既要能实现功能的完整性,还要使其在安排的时间里做完所有的事情而又不影响其他事件的执行。因此,设计时采用了定时器的中断功能。
在程序执行时,从主函数开始,首先完成对系统底层的初始化设置,然后开启定时器中断,进入到主函数的for循环中。此后,程序会一直处于for循环中执行,除非中断触发,程序才会转入到中断函数中去执行,但在中断函数执行完毕后,程序会返回到刚才中断前的for循环中的断点处继续执行下去。
接下来,我们需要对各模块功能的实现做一个时间上的安排。从前一段的论述中可知,for循环中执行的内容会经常性的被打断,而中断函数则会被定时执行,并且最多可有2.5ms的执行时间。因此,对于那些不太重要或者要求不太高的辅助函数,可以将之放在for循环中去执行,这样可以节省系统更多更为宝贵的时间去执行更为重要的事情。因此,在设计及编写上将按键读取、OLED显示放在了for循环中,而将IIC总线的驱动、读取A/D转换值及灯光报警的实现放在了中断函数中。由于语音模块的驱动时间较长(300~400ms),很明显,中断函数是执行不完的,也没这个必要,通过若干个周期的中断函数延时(设置变量计数),即可在for循环中实现,并且也不会影响到按键的读取及OLED屏的正常显示。这样,就能在时间上对各模块功能的实现做到很好的分配。
整个程序执行过程由于没有外部中断的干预,从宏观上来看,其实现是按时间顺序无限执行的。即首先完成系统的初始化设置,再通过人机交互界面利用按键对报警阈值做好相应的设置,系统即开始正式执行主控程序部分,采集汽车车轮转速,并实时的在液晶显示屏上显示出当前的车速,监控车速,当有超速行为时,相应的采用灯光闪烁报警或者语音提示报警[12]。
系统控制的总体结构图如图4.1所示。
- 17 -
武汉科技大学本科毕业设计
图4.1 系统总体结构图
下面将分块逐步介绍各个软件模块。
4.2 初始化程序设计
4.2.1 系统时钟模块
MC9S12XS128的时钟和复位发生器(Clocks and Reset Generator,CRG)模块提供了锁相环(PLL)功能,单片机使用PLL功能能够获得更高的总线频率,这对于需要提高单片机运行速度的场合是十分必要的。单片机的内部锁相环(IPLL)具有以下基本特征:①时钟参考分频器;②时钟后分频器;③可配置的内部滤波器(无外部引脚);④减少抖动和降低辐射的可选频率调制模块;⑤退出或进入锁定条件可产生中断请求。
CRG时钟合成寄存器(SYNR),如表4.1所示。
表4.1 S12XECRG合成寄存器
读/写 复位值 Bit7 VCO1 0 Bit6 VCO0 0 Bit5 SYNR5 0 Bit4 SYNR4 0
Bit3 SYNR3 0 Bit2 SYNR2 0 Bit1 SYNR1 0 Bit0 SYNR0 0 读:任何时刻;写:除CLKSEL寄存器中的PLLSEL=1的任何时刻。
VCO1,VCO0:这两位用于确定压控振荡器VCO的增益以获得频率最佳稳定性并锁定。为了IPLL正常工作,必须根据表4.1中的实际VCO频率来配置这两位值,如表4.2所示。
- 18 -
武汉科技大学本科毕业设计
表4.2 VCO时钟频率选择
VCOCLK频率范围/MHZ 32≤fvco≤48 48 VCOFRQ[1:0] 00 01 VCOCLK频率范围/MHZ 保留 80 表4.3 CRG时钟参考分配寄存器 读/写 复位值 Bit7 REFF1 0 Bit6 REFF0 0 Bit5 REFD5 0 Bit4 REFD4 0 Bit3 REFD3 0 Bit2 REFD2 0 Bit1 REFD1 0 Bit0 REFD0 0 读:任何时刻;写:除CLKSEL寄存器中的PLLSEL=1的任何时刻。 REFFRQ1,REFFRQ0:这两位用于配置PLL内部滤波器以获得频率最佳稳定性并锁定。为了IPLL正常工作,必须根据表4.3中的实际REF时钟频率设置这两个值,如表4.4所示。 表4.4 参考时钟频率选择 REFCLK频率范围/MHZ 1≤fref≤2 2 PLL时钟频率以及由PLL产生的MCU总线时钟频率由下列公式计算得来: fVCO?2?fOSC?(SYNDIV?1)/(REFDI ?V1) (4.1) fPLL?fVCO/(2?POSTD)I (4.2) V/2 (4.3) fBUS?fPLL 式中,SYNDIV的值由SYNR寄存器中的BIT5~BIT0确定,REFDIV值由REFDV寄存器中的BIT5~BIT0确定,POSTDIV值由POSTDIV寄存器中的BIT5~BIT0确定。 CRG时钟后分频寄存器(POSTDIV),如表4.5所示。 表4.5 CRG后分频寄存器 读 写 复位值 0 Bit7 0 Bit6 0 0 0 Bit5 0 Bit4 POSTDIV4 0 Bit3 POSTDIV3 0 Bit2 POSTDIV2 0 Bit1 POSTDIV1 0 Bit0 POSTDIV0 0 - 19 - 武汉科技大学本科毕业设计 读:任何时刻;写:除CLKSEL寄存器中的PLLSEL=1时的任何时刻。 POSTDIV4~POSTDIV0:这5位用于确定公式中的POSTDIV值。如果POSTDIV=0x00,则fbus= fvco。如果POSTDIV≠0,则PLLCLK频率fbus和VCOCLK频率fvco之间关系由公式(4.2)计算得到。为了得到80MHZ的总线频率,亦即fbus=80MHZ,由公式(4.3)可知锁相环频率要达到160MHZ,取寄存器SYNR=0xC9,寄存器REFDV=0x81,则SYNDIV=9,REFDIV=1,有fbus=2*16*(9+1)/(1+1)=80MHZ。 4.2.2 TIM定时模块 为了实现单片机2.5ms的中断周期,需要利用到TIM定时模块的自由运行计数器及输入捕捉/输出比较功能。自由运行计数器部分的设置包括两个系统控制寄存器TSCR1、TSCR2,如表4.6所示。 表4.6 定时器系统控制寄存器1 读 写 复位值 Bit7 TEN 0 Bit6 TSW 0 Bit5 TSF 0 Bit4 TFF 0 Bit3 PRNT 0 Bit2 0 0 Bit1 0 0 Bit0 0 0 表中PRNT位为精确定时器设置位,为0时使能普通定时器并且TCSR2寄存器的PR0、PR1和PR2位用于计数器的分频因子选择;为1时使能精确定时器并且PTPSR寄存器的所有位被用于精确定时器的分频因子选择。复位后该位只能写一次,如表4.7所示。 表4.7 定时器系统控制寄存器2 读 写 复位值 Bit7 TOI 0 Bit6 0 0 Bit5 0 0 Bit4 0 0 Bit3 TCRE 0 Bit2 PR2 0 Bit1 PR1 0 Bit0 PR0 0 该寄存器用来设置TIM模块自由运行计数器预分频器的分频因子、是否允许定时器溢出中断、是否允许通过通道7输出比较事件复位定时器计数寄存器TCNT。TIO为定时器溢出中断允许位,为1时允许定时器溢出中断,当TOF标志置位时,允许请求硬件中断;为0时禁止定时器溢出中断。还有几个输入捕捉/输出比较寄存器的设置不一一赘述[13]。按照上表中的方式去设置即可。将代码附之如下: TSCR1 = 0x10; //先关闭TIMER,允许快速清零 TSCR2 = 0x05; // TSCR2_PR = 4,32分频,禁止定时器溢出中断 TIOS = 0x03; //ch0,ch1输出比较 - 20 -