徐菁菁张 宇*杨俊清王月柔
(1.南昌大学前湖学院,江西南昌 330031;2.南昌大学信息工程学院,江西南昌 330031)
随着计算机技术和微电子技术的不断发展,嵌入式实时操作系统应用的领域越来越广泛[1]。传统的开发方法控制单一,效率低,而FreeRTOS 嵌入式实时操作系统可实现用户自主配置内核功能且多平台支持,该操作系统经长时间的更新已经较完善[2-3]。FreeRTOS 支持多任务,可采用抢占式和时间片轮转混合的调度机制,缩短程序运行时间,低功耗tickless 模式降低系统功耗,极大地增加系统电源使用寿命,FreeRTOS 操作系统可以更好地保证程序运行可靠性和实时性[4-5]。
同时基于车辆健康状态监测的需求日益增加[6],提出基于FreeRTOS 的车辆状态监测系统,在FreeRTOS 系统下建立系统运行指示、信息采集、发送数据包至物联平台等任务,通过对任务优先级设定实现任务切换,保证了系统的实时性,同时设置低功耗模式降低功耗。实际测试表明,系统实现了车辆状态的实时监测。
车辆状态监测系统的系统功能结构框图如图1所示。车辆状态监测系统以STM32 单片机为核心,还包含数据采集模块、通信模块、电源模块、云平台显示等组成部分[7]。
图1 系统功能结构框图
数据采集模块包括OBD 模块、温湿度模块、加速度模块,主要用于采集车速、转速、油门开度、温度、湿度、加速度等数据;STM32 微控制器,主要用于控制数据处理、低功耗等操作;物联显示平台包括网页端和客户端,主要用于查看数据;通信模块采用NB-IoT 模块,主要用于单片机与云平台之间的数据传输。
STM32 从各个数据采集模块中读取数据并处理后,通过NB-IoT 通信模块将数据打包发送至物联云平台,用户可直接从物联平台读取数据。
本设计由主控芯片STM32F103RCT6、DHT12 温湿度传感器模块、ADXL345 加速度传感器模块、以ELM327 作为协议转换芯片的OBD 模块、NB-IoT 通信模块等部分组成。其系统硬件结构图如图2所示。
图2 系统硬件结构图
DHT12 温湿度传感器以I2C 的方式通信,传输车辆的温度和湿度给主控芯片。ADXL345 采集车辆加速度的运动信息,通过I2C 的方式传输给主控。上位机发送AT 指令给OBD 模块,OBD 反馈车速、转速、油门开度等数据给主控。NB-IoT 通信模块将主控芯片采集的数据以数据包的方式发送至云平台,并接收云平台的应答信息,通过串口的方式与主控芯片通信。
系统以基于 ARM Cortex -M3 内核的STM32F103RCT6 控制器作为控制核心,程序存储器容量为256KB,具有64 个引脚,支持I2C、SPI 和串口等外设[8]。最小系统的实现电路图如图3 所示。
图3 STM32 最小系统电路图
本设计采用输出为7.2 V 的锂电池为系统提供电源,系统需要为部分传感器供电的5 V 和为微控制器供电的3.3 V。5 V 和3.3 V 直流电源可分别利用稳压芯片LM2940 和LM1117[7]降压获得。
采集模块由DHT12 温湿度传感器、ADXL345加速度传感器和OBD 车载诊断模块组成。
DHT12 数字式温湿度传感器是一款含有已校准数字信号输出的温湿度复合型传感器,具有超小体积、低功耗的优点。
ADXL345 是一款完整的3 轴加速度测量系统,可采用低功耗、休眠等模式,降低功耗,本系统采用低功耗模式。可采用I2C 和SPI 数字通信。
OBD 使用ELM327 作为协议转换芯片,将OBD协议数据转换为RS232 输出。目前常用的车载数据通信协议主要有CAN 总线通信与K 线通信2 种方式,本系统选用ISO15765(CAN-BUS)总线协议。ELM327[9]外围电路如图4 所示。
图4 ELM327 外围电路
BC20 是一款高性能、低功耗、多频段、尺寸紧凑的NB/GNSS 无线通信模块,具有-40 ℃~+85 ℃超宽工作温度范围。由于支持多星座卫星系统解调算法,其定位更加精准,抗多路径干扰能力更强。系统应用TCP 传输模式,发送数据协议中包含0x7e、报文头、报文体、校验码和0x7e,其中报文头包括报文ID、ICCID、发送时间和流水号;报文体依据发送类型设定。NB-IoT 模块电路图如图5 所示。
图5 NB-IoT 模块电路图
车辆状态监测系统基于FreeRTOS 操作系统开发的软件结构图如图6 所示,根据监测的要求需要建立5个主应用任务:系统初始化任务、系统运行指示任务、数据采集任务、数据处理任务、通信任务。使用FreeRTOS 的抢占式任务调度器来协调各任务运行[10],多任务运行可以很好地提高系统的运行效率,同时设置FreeRTOS 系统为tickless 模式降低系统功耗。
车辆状态监测系统上电启动,传感器、串口等模块初始化大概需要1 s,然后进行NB-IoT 配置,大概需要13 s 到19 s 左右,再根据任务执行的顺序执行。任务1 是LED 闪烁任务,表明系统处于工作状态;任务2 是采集监测系统的各个状态数据值,并以队列或者信号量的形式存储,可使用定时器定时发送也可使用ADXL345 阈值超出中断发送,本系统使用阈值中断发送,可以很好地降低系统功耗;任务3是将数据打包发送至云平台。车辆状态监测系统程序流程图如图7 所示。
图6 软件结构图
图7 整体软件流程图
从官网下载FreeRTOS 源码,并将之添加到创建的FreeRTOS 文件夹中,portable 文件夹只保留keil、MemMang 和RVDS。再将croutine.c、event_groups.c、list.c、queue.c、tasks.c 和timers.c 移植到新建的FreeRTOS_CORE 文件夹中,同时将port.c 和heap_4.c 移植到新建的FreeRTOS_PORTABLE 文件夹中。最后将官方的Demo 中FreeRTOSConfig.h 系统配置文件添加至工程。此时编译可能出现port.c、stm32f10x_it.c 中有重复定义的中断函数,这里选择将stm32f10x_it.c 中重复的函数屏蔽掉。至此,FreeRTOS 操作系统的移植便完成了[11]。
车辆状态监测系统在实现时划分为4 个任务进行实现,任务函数名称、优先级分配、任务功能如表1 所示[12]。
表1 任务信息
FreeRTOS 的任务创建函数为xTaskCreate,任务创建代码如下:
本系统使用队列实现任务间的数据传递,代码如下:
车辆状态监测系统接收短信指令后被唤醒,向监控系统鉴权。成功应答后,监控系统实时发送温湿度等状态值数据包至物联平台。监测系统网页测试结果如图8 所示。测试过程中,可借助串口调试助手及远程连接查看指令收发情况及监测状态参数。温湿度、加速度数据如图9 所示。OBD 监测车辆的车速、转速、油门开度等参数数据如图10 所示。
图8 监测系统网页测试结果
图9 温湿度、加速度监测
图10 OBD 数据监测
研究了基于FreeRTOS 的车辆状态监测系统,设计并搭建硬件电路,多任务运行实时采集车辆状态的各项参数,并将数据实时上传到云平台。通过测试表明,该系统可以实时稳定地读取各个车辆状态参数,并在网页端查看数据,实现对车辆状态的监测,达到了系统设计的目标。FreeRTOS 操作系统具有多任务、低功耗、实时性和稳定可靠等优点,使该系统具有运行稳定、数据实时上传、精度高和功耗低等优点,适用于各种复杂的场合内长时间使用。