距离值通过PIC16C57的10脚进行串行输出,经MAX232芯片后与ARM的串口相连。芯片MAX232是为RS232标准串口设计的接口电路,它完成TTL电平和RS232电平的转换[8]。
2.2 声光报警电路设计
本系统要求根据影响装载机稳定性的障碍物距离的临界值对危险状况进行三级报警。当处于低危险状况时,只有指示灯绿灯被点亮,提醒驾驶者注意;当危险级别增高时,指示灯黄灯点亮,同时伴随有舒缓的蜂鸣声,提醒驾驶者采取措施;当达到最高危险级别时,指示灯红灯被点亮,同时蜂鸣声由舒缓转为急促,提醒驾驶者赶紧制动。
设计中,分别采用了LPC2290的P2.20(GPIOA4)驱动绿色LED,P2.21(GPIOA5)驱动黄色LED, P2.22(GPIOA6)驱动红色LED,P2.23(GPIOA7)驱动蜂鸣器。所设计的报警电路如图3所示。
图3 报警电路图
3 系统软件设计
常用的嵌入式操作系统有VxWorks、Windows CE、嵌入式Linux和μC/OS-Ⅱ等,由于μC/OS-Ⅱ嵌入式系统具有公开源代码,具有实时多任务内核来进行多任务调度等优点[9],所以本系统选用μC/OS-Ⅱ嵌入式操作系统。
由于采用模块化编程,所以μC/OS-II下系统任务的划分也是基于不同的功能模块,每一个模块被分解成一个或者多个任务,每个任务被安排一个优先级。这样,一旦这些任务被建立起来,它们之间的调度情况就完全由μC/OS-II来完成。结合本系统的设计需求,程序中创建串口通信任务、报警任务、LCD显示任务。其软件流程框图如图4所示。
图4 软件流程框图
上电后,首先进行硬件的初始化,然后对μC/OS-II操作系统进行初始化,建立任务,进行多任务调度。μC /OS - II的任务调度是抢占式的,所以在设置任务优先级的时候应该尽量考虑任务对实时性的要求。即使两个任务的重要性是相同的,它们也必须有优先级上的差异,这也就意味着高优先级的任务在处理完成后必须进入等待或挂起状态,否则低优先级的任务永远也不可能执行。本系统中设置串口通信任务的优先级高于液晶显示任务,液晶显示任务的优先级又高于报警任务。
1.串口通信任务完成超声波测距部分与ARM处理器之间的数据传输。串口通信部分主要包括两部分内容:用户接口函数和任务函数。串口共有5个用户接口函数,分别为deopen()、dclose()、dread()、dwrite()和diocontrol()。
超声波测距装置和LPC2290进行通信的部分程序代码如下:
diocontrol(Uart0_Handles,UART0_SET_MODE, (void *)&Mode0); // 设置UART 模式
diocontrol(Uart0_Handles,UART0_SET_TIMEROUT,(void *)5); // 设置接收超时因子, 参数 =0 则关闭超时
diocontrol(Uart0_Handles, UART0_CLR_FIFO, (void *)0); // 清空接收软FIFO
while (1)
{Rece_Count=dread(Uart0_Handles, UART_Rece
_Buff,1); //读取超声波发送过来的第一个起始字节,放入缓冲区
if((Rece_Count>0)&&(UART_Rece_Buff[0]== ’@’)) //如果读取成功且第一个字节为‘@’
{dread(Uart0_Handles,&UART_Rece_Buff[1],3); //接收后三位字节,分别为百位数、十位数、个位数
for(i=1;i<4;i++)
UART_Rece_Buff[i]=UART_Rece_Buff[i]+48; //将十六进制数转换为ASCII码值
for(i=0;i<3;i++)
sbuff[i]=UART_Rece_Buff[i+1]; //接收的数据缓存到数组中,供LCD显示部分调用
}
}