一种基于LPC1788的互联网远程智能控制系统
2015-11-09陶俊豪等
陶俊豪等
摘 要: 为实现激光测距系统的远程控制和数据状态信息采集,提出了一种基于LPC1788微控制器的互联网智能控制系统。该系统使用FreeRTOS系统作为远程终端的实时操作系统,并基于emWin图形用户界面库开发了用户操作界面,然后使用LwIP网络协议栈实现了网络状态采集和控制通信,此外,系统采用微控制器自带UART的DMA模式实现了远程数据和状态信息的采集。该远程控制系统具有结构简单、可靠性高、稳定性好等优点,可以推广到其他智能控制系统和基于物流网的智能家居中。
关键词: LPC1788; FreeRTOS移植; Emwin移植; LwIP协议栈; 远程控制
中图分类号: TN302?34 文献标识码: A 文章编号: 1004?373X(2015)21?0076?04
LPC1788?based remote intelligent control system of Internet
TAO Junhao, ZHANG Peng, CAI Fei
(Unit 63801 of PLA, Xichang 615042, China)
Abstract: To achieve remote control and data state information collection of laser range?finding system, a LPC1788?based remote intelligent control system of Internet is proposed. The FreeRTOS system is taken as the real?time operating system of remote terminal in this system. The user operation interface is developed based on emWin GUI, and then the network state acquisition and control communication are realized by using LwIP protocol stack. Moreover the acquisition of remote data and state information is realized by adopting DMA mode of the microprocessor with UART. The remote control system has simple structure, high reliability and good stability, and can be extended to other intelligent control systems and logistics?based smart home.
Keywords: LPC1788; FreeRTOS transplant; Emwin transplant; LwIP protocol stack; remote control
0 引 言
随着Internet的广泛应用和物联网技术的飞速发展,基于互联网的远程智能控制技术引起工业界的广泛关注,而嵌入式系统以其低成本、小体积、控制灵活、易集成等特点被广泛应用于工业控制、智能家居等各种场合。LPC1788微控制器正是在这种情况下推出的,其集成了LCD图像控制器和10/100M的以太网EMAC,主要是针对各种高级通信、高质量图像显示等应用场合,是工业自动化、销售网点和医疗诊断应用的理想选择。因而可以用作基于互联网的远程智能控制系统中。
1 系统功能
本文提出的远程智能控制系统是基于一套激光器测距系统的远程控制,该激光器原有操作方式是通过机械按钮按下与抬起方式实现散热开关、发射开关、自检开关、输出频率切换等功能的,并且通过RS 422/RS 485串口输出测距和其他状态信息。为实现远程智能控制,需要设计一套人机交互的远程控制端,实现测距信息和状态的采集、水泵和发射开关以及发射频率切换、测距过量程报警等操作。
为不改变现有电路系统,可以通过网络或RS 422/RS 485工业串口控制继电器的开合来实现按钮的按下与抬起,两者的区别在于传输信号的接口形式不同,而网络接口可以利用现有Internet布线实现更远距离的、更安全的信息传递。状态采集方面,RS 422/RS 485串口和网络接口都可以实现远距离的数据交互,但是RS 422/RS 485串口形式的数据收发更简单灵活。由于受制于现有激光器的电路结构和接口形式,本文采用网络接口实现远程控制,而测距和状态数据收发方面采用RS 422/RS 485串口。
在远程控制端需要设计一个友好的人机交互终端,该终端通过以太网接口和RS 422/RS 485串口与远程激光器系统通信,实现在LCD屏幕上实时显示测距信息和状态、按钮的远程触摸显示、触摸屏校正等功能。为此,选择LPC1788微控制器作为控制核心,该芯片自带以太网接口、UART接口及LCD控制器,可以极大地简化设计。由于终端需要完成网络通信、信息状态采集、信息实时显示、按钮触摸控制等功能,涉及多个进程,若采用大循环模式将使代码复杂化降低编程效率,因而此处采用操作系统模式完成终端程序设计;在信息状态显示和按钮触摸控制方面可以采用图形化的界面来实现,以增加界面的可视性;在网络通信方面可以采用嵌入式的网络通信协议;信息状态采集方面可以采用基于UART的DMA模式实现大量的数据交互。系统的最终结构图如图1所示,图形化的界面示意图如图2所示。
2 实时操作系统的移植[1?3]
为实现网络数据和串口数据的实时传输,需为LPC1788微控制器选择一个合适的嵌入式实时操作系统(RTOS),可供选择的有μC/OS?Ⅲ,FreeRTOS,VxWorks及国产实时操作系统等,相较于其他系统而言,FreeRTOS是一个完全免费的操作系统,而且具有资源占用少、代码公开、可移植、可裁剪、调度策略灵活等特点,可以方便地移植到各种单片机上。作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,因而本文选择以FreeRTOS 8.2.0RC1作为操作系统,开发环境采用Keil MDK?ARM 4.72(以下简称MDK)。
在FreeRTOS移植方面,由于官网代码为每种处理器架构和编译器端口提供了预配置好的应用例程,可以作为移植参考。FreeRTOS代码根目录包括两部分,FreeRTOS Plus包含了除系统外的其他软件单元,本文用到的代码都在FreeRTOS目录中。系统核心代码包含在FreeRTOS/Source目录下的tasks.c,queue.c,list.c三个文件中,从8.0.0版本加入了用于内部任务通信和同步的event_groups.c,同目录下完成软件定时器和协程功能的timers.c和croutine.c为可选文件,所有实时内核的头文件位于FreeRTOS/Source/include目录中。在操作系统接口层方面,每种支持的处理器架构包含了一些架构相关代码位于FreeRTOS/Source/Portable/[compiler]/[architecture]子目录下,对应基于Cortex?M3内核的LPC1788在MDK下接口文件为port.c和portmacro.h。此外,在任务、队列、互斥量、软件定时器以及时间组创建时需要内核分配内存,系统提供了5种内存分配策略位于FreeRTOS/Source/Portable/MemMang子目录下,其中heap_1.c只分配不收回,采用数组方式分配内存;heap_2.c采用最佳拟合算法和链表分配内存但是不合并相邻内存块,可以实现动态创建、删除任务和队列;heap_3.c使用编译器自带malloc()和free()函数实现申请和释放内存;heap_4.c采用首次适配法对回收的内存块进行合并以减少碎片,本文即采用此种方式;heap_5.c除了实现和heap_4.c一样的功能外,还可以在不连续堆栈的内存堆进行内存分配。
在完成以上代码文件移植的基础上,还需要在应用的根目录下为应用加入一个自定义的配置文件Free? RTOSConfig.h,需配置内容可在官网查阅,其主要实现内核的配置和裁剪,如是否采用抢占式调度、任务最大优先级、时钟和滴答频率、是否使用钩子函数、互斥量、二值信号量、任务通知、堆栈溢出检测等以及处理器中断优先级位等。此外,MDK可以将调试输出信息通过printf()函数重定向到串口或者JTAG的ITM端口,实现调试信息可视化。若要实现此功能,需在工程文件中加入Retarget.c和Serial.c两个文件(在MDK安装目录下可找到),然后定义一个打印信号互斥量以便各个任务都可以通过重定向的端口打印调试信息。完成上述文件的移植后就可以创建任务并启动任务调度函数,创建任务时需注意设置合理的栈空间,当前任务的栈空间剩余情况可以通过uxTaskGetStackHighWaterMark()函数检查。
3 显示系统及emWin图形用户界面[4?5]
智能化的远程控制系统除能进行通信控制外还需要一个友好的人机交互界面,为此本文选择7寸电阻触摸屏进行人机交互的设计。电阻触摸屏的选择一方面是由降低设计复杂性决定的,另一方面是出于保证长时间工作稳定性的考虑。由于很多误差源如电子噪声、比例系数及机械不同轴性会影响触摸坐标值,因此需要对触摸屏系统进行校正,考虑到控制系统对按钮位置准确度要求高,校正选择tslib五点式校正算法。控制系统除了显示按钮以外,还需要显示测距信息和状态,并以曲线图的方式显示,为提高开发效率和智能化水平,选择emwin图形用户界面。
emwin图形用户界面是以C语言编写的界面,由图形库、字体库、窗口管理器、控件小工具和PC工具等组成,它能提供高效且独立于处理器和显示器的图形用户界面,用于任何使用图形进行操作的应用。其与单任务和多任务环境、专用操作系统或任何商业RTOS兼容,可以适用于任何尺寸的、具有任何控制显示器和CPU的物理和虚拟显示器。为便于用户开发,恩智浦公司基于LPC1788微控制器对emwin进行了预编译生成了emwin库文件,开发时用户只需要从恩智浦软件论坛LPCWARE.COM下载压缩包就可以获得相关源文件、说明书、辅助设计工具和板级支持例程(BSP),本文使用的版本为5.24h。
移植时需要加入库文件、配置文件和头文件。对于MDK编译器的库文件位于NXP\emWin\emWin_library\Keil目录下,名为emWin_M3.lib,配置文件位于NXP/emWin/emWin_Config目录下,头文件位于NXP/emWin/emWin_header目录下。在目标系统上使用emWin之前,需要对软件进行配置。配置过程详见恩智浦软件官网说明书,其包括GUI配置和LCD配置,GUI配置是对可用功能、默认颜色、字体以及可用存储器进行配置;LCD配置需要定义显示器物理尺寸、显示驱动和颜色转换程序。
移植完成后,为实现图2所示的界面,使用窗口管理器创建两个窗口,一个窗口用于放置控制,另一个窗口放置窗口对象(小工具),包括GRAGPH图形小工具、文本小工具、编辑小工具。在进行触摸校正时,使用GUI_SaveContext()函数保存上下文,然后使用WM_InvalidateWindow()和WM_HideWindow()函数隐藏窗口,在完成屏幕校正后使用WM_ShowWindow()和WM_ValidateWindow()函数恢复窗口并使用GUI_RestoreContext()恢复上下文。此外,为支持汉字显示可以使用GUI_UC_SetEncodeUTF8()函数开启外语支持,emWin的Tool子目录含有U2C.exe可以将UTF?8转换为C编码,然后在需要显示汉字字符串的按钮上使用BUTTON_SetText()函数就可以支持汉字按钮。
4 LWIP网络协议栈[6?8]
LPC1788微控制器以太网模块包含了一个10 Mb/s或100 Mb/s以太网媒体访问控制器,通过DMA硬件加速来优化性能。以太网物理接口通过标准的MII或简化的MII(RMII)接口连接外部PHY芯片,本文采用RMII接口连接LAN8720i芯片对外通信,网络协议栈采用针对嵌入式系统的LwIP轻量级协议栈。LwIP在保证嵌入式产品拥有完整TCP/IP功能的同时,又能保证协议栈对处理器资源的有限消耗,其运行一般只需要几十KB的RAM和40 KB左右的ROM。为提高开发效率,恩智浦提供了LwIP 1.4.0的源码、以太网底层驱动文件LPC17_emac.c以及PHY芯片LAN8720的驱动,用户可以从恩智浦软件论坛LPCWARE.COM下载lwip_lpc?v1.10.zip压缩包获得相关代码和例程。
在移植带FreeRTOS操作系统模拟层时,移植的文件除lwip_lpc\lwip?1.4.0\src文件夹下的源文件外,需要自己编写的文件包括cc.h(主要完成协议栈内部使用的数据类型定义)、lwipopts.h(完成协议栈内核的参数配置)、sys_arch.c以及sys_arch.h(为协议栈提供邮箱、信号量等机制),这些文件在例程中均有参考代码,需要指出的是,以太网描述数组必须将内存定义到用于存储外设数据的片上SRAM或连接到外部存储控制器的SDRAM才能保证描述符和控制符正常收发数据。
在完成上述移植之后就可以创建网络初始化任务和网络通信任务了,初始化代码如下:
board_setup); //RMII端口(GPIO)初始化
tcpip_init(tcpip_init_done_signal,(void *) &tcpipdone);
//创建tcpip_thread进程
while (!tcpipdone) { vTaskDelay(1); }
IP4_ADDR(&gw,192,168,1,1);
IP4_ADDR(&ipaddr,192,168,1,232);
IP4_ADDR(&netmask,255,255,255,0);
netif_add(&lan8720, &ipaddr, &netmask, &gw, NULL, lpc_enetif_init,tcpip_input); //添加网络接口
netif_set_default(&lan8720);
netif_set_up(&lan8720); //建立连接
NVIC_SetPriority(ENET_IRQn,9); //中断优先级设定
NVIC_EnableIRQ(ENET_IRQn);
sys_thread_new("tcpecho_thread", lwip_task, NULL,DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
while (1) {
lpc_phy_sts_sm(&lan8720); //PHY芯片状态更新
vTaskDelay(300);}
在网络通信任务中,LPC1788与网络继电器采用UDP协议进行通信,代码如下:
IP4_ADDR(&net_relay,192,168,1,25); //网络继电器地址
conn = netconn_new(NETCONN_UDP);
conn?>recv_timeout=100; //接收超时选项
netconn_bind(conn, IP_ADDR_ANY,7); //绑定端口
while (1) {
while(!(lan8720.flags & NETIF_FLAG_LINK_UP) ) vTaskDelay(50);
netconn_connect(conn, &net_relay,1883);
buf_snd=netbuf_new);
data = netbuf_alloc(buf_snd, 2);
netconn_send(conn, buf_snd); //发送网络命令
netbuf_free(buf_snd);
netconn_recv(conn, &buf_recv); //接收返回参数
vTaskDelay(10);
netbuf_copy(buf_recv, recv[0], buf_recv?>p?>tot_len);
netbuf_delete(buf_recv);
netbuf_delete(buf_snd);
}
5 基于UART?DMA的数据传输
LPC1788的通用DMA控制器支持外设到存储器、存储器到外设和存储器之间的传输,使用通用异步收发器的DMA模式可以极大减少处理器负荷,加速传输速度。而使用恩智浦软件论坛提供的标准固件库可以进一步提高开发效率。LPC1788的UART还可以工作在RS 485模式,要使用DMA方式需要完成端口功能配置、初始化UART及FIFO,GPDMA初始化、设定中断优先级、设定DMA工作参数、使能中断和相应通道,在中断函数给出接收任务的信号量并关闭相应通道,在任务中每接收一次数据都要重新设定下一次DMA接收的工作参数并使能通道。在任务接收到中断给出的信号量之后需要发数据给图像显示进程显示激光测距机的状态信息等参数。
6 结 语
本文提出了一种基于LPC1788的智能控制系统,该系统实现了网络远程控制和状态参数接收,因而可以推广应用到基于物联网的智能家居和其他智能控制系统中。
参考文献
[1] 张龙彪,张果,王剑平,等.嵌入式操作系统FreeRTOS的原理与移植实现[J].信息技术,2012(11):31?34.
[2] YIU J. ARM Coretex?M3权威指南[M].宋岩,译.北京:北京航空航天大学出版社,2009.
[3] 刘滨,王琦,刘丽丽.嵌入式操作系统FreeRTOS的原理与实现[J].单片机与嵌入式系统应用,2005(7):8?11.
[4] 李昕泽,邓中华.一种工业远程实时监控系统的实现[J].单片机与嵌入式系统应用,2014,14(1):51?53.
[5] 宋玉贵,尹艳玲.基于LPC1788 emWin中文显示的设计与研究[J].工具技术,2013,47(7):24?26.
[6] 赵国锋,马文武.基于LWIP的嵌入式网络系统设计与实现[J].微计算机信息,2008,24(23):59?61.
[7] 余晓光.基于实时操作系统FreeRTOS的Lwip协议的移植研究[D].昆明:昆明理工大学,2013.
[8] 宋华鲁,闫银发,张世福,等.基于STM32和FreeRTOS的嵌入式太阳能干燥实时监测和控制系统设计[J].现代电子技术,2013,36(23):103?106.