1引言
随着社会的进步和信息技术的高速发展,政府及社会公众对气象服务的要求进一步扩大、加深,也对气象监测提出了越来越高的要求。近年来国家大力推广地面气象观测网的建设,多要素自动气象站大量地在城市、乡镇以及无人野外建成。由于气象观测点地域的不定,环境的多变,自动气象站的设计向着性能稳定、功耗低、智能化、通讯灵活等方向发展。传统的“采集卡+微机”的数据采集方式成本高、体积大且无法在无人值守的野外工作,而普通的以8位单片机为核心的系统精度、运算能力、存储容量等都很有限。针对以上问题,本文提出一种基于STM32处理器和GPRS通讯模块的多通道气象数据采集系统的设计方法,在不移稙嵌入式操作系统的条件下,实现数据的采集、处理、存储及远程传输,并提供良好的人机交互界面,以及菜单式的管理和数据的实时显示。
STM32F1xx系列处理器是意法半导体公司在业界最先推出的基于ARM Cortex-M3内核的32位精简指令集微控制器,该系列微处理器工作频率为72MHz,内置高容量的Flash存储器和SRAM,具有丰富的I/O端口资源。集成了分支预测、单周期乘法和硬件除法等功能,大大提高了处理器的数据处理能力。同时,采用Thumb-2指令集,具有很高的代码效率,速度比ARM7快二分之一,功耗却低四分之三,性能比市场上的8/16位单片机有了大幅提高,价格却很低廉。作为最新一代的微控制器,STM32单片机具有性价比高、功耗低等特点,其卓越的计算性能、先进的中断响应系统和丰富的片上资源,完全满足本系统实时、低功耗、低成本的要求[1]。
2系统整体方案介绍
2.1系统功能要求
(1)可自动实时采集大气温湿度、大气压、风速、风向、土壤温湿度、降雨量、光照强度等气象信息,具有存储和记录功能,带LCD显示;
(2)用户可以根据需要选择有线、无线等多种数据远程通讯方式,可设置数据存储和发送时间间隔;
(3)可通过串口、U盘、SD卡从采集仪中读取历史数据。
2.2传感器介绍
由于自动气象站必须在恶劣的气候环境下长时间工作,要求气象传感器性能可靠、功耗低、使用寿命长、响应速度快,且有很强的防水、抗寒和耐腐蚀性等[2]。一般的传感器难以满足这些要求,必须使用专业的防护等级高的传感器模块。系统采用气象专业传感器模块,这些模块有统一的工作电压(5V),工作电流都小于10mA,具有较低的功耗。但是由于各传感器工作原理大不相同,各模块的输出信号也各不相同,主要包括RS485信号、0-5V电压、4-20mA电流、脉冲、格雷码等。根据不同的输出信号,可将这些传感器分为智能传感器、数字信号传感器、模拟信号传感器3大类,系统必须为不同类型的传感器设计不同的接口进行数据的采集。
2.3系统总体结构
系统总体结构如图1所示,由STM32F103VC单片机、信号采集模块、数据存储模块、人机交互模块、通讯模块、电源模块等六大功能模块组成。
图1 系统总体结构图
3软件设计
针对系统的总体结构,软件采用模块化的设计方法对系统的各项功能进行封装,主要包括中断系统、数据采集、处理及存储、人机交互、通讯系统、文件系统、实时时钟、电源管理等功能模块。各个模块完成特定的功能,模块之间相互独立并提供必要的接口。主程序的流程图如图2所示,首先进行初始化,包括各设备的初始化,端口、串行通讯设置及时钟、中断设置等,然后进入循环等待状态,利用精确的定时中断机制来实现各个任务的调度。
中断系统是程序的核心组成部分,直接决定系统的性能和程序的可靠性。程序的main函数是一个无限循环,当中断发生时在中断处理函数中设置任务的执行标志,中断函数返回后对任务的执行标志进行判断,若为真则执行相应的任务,否则跳过该任务继续判断下一个任务是否执行。过多的使用中断会影响程序的效率及可靠性,因此,尽量使用最少的中断来满足系统的需要。程序中主要利用定时中断机制来实现任务的调度,需要用到的时间标志数量较多,这些标志的时间间隔从1ms到1min不等,且均可通过人机交互模块进行人工设置,主要包括1ms的RS485轮询、0.1s的RS485超时、5ms的按键扫描、20ms的按键消抖、50ms的数据采集、1s的数据处理、1min的数据存储、10ms的刷屏、0.25s的光标闪烁、1s的时钟更新、3s的滚屏、10s的回屏、10s~30s的背光延时等。为此,可以采用一个1ms的定时器中断和RTC秒中断作为基准,使用软件的方法来模拟以上所有的时间间隔标志。此外,程序中必须用到的中断还有RS485数据接收中断、串口数据接收中断、ADC_DMA中断以及一个用于激活按键模块的外部中断。
图2 主程序流程图
3.1数据采集、处理与存储
数据的采集、处理与存储是系统的核心任务。《中华人民共和国地面气象观测规范》中对地面自动气象站各个气象要素的传感器采样间隔、数据采集、处理与存储方法都作了明确的要求。不同气象要素的采集要求有很大的差别,比如气温、气湿和气压的采样速率为每分钟六次,去掉一个最大值和一个最小值,余下的4次采样值求算术平均作为1分钟内的瞬时值;而风速、风向的采样速率为每秒钟一次,求3秒钟内的滑动平均值作为瞬时值。程序对不同的气象要素设置不同的数据采集时间标志,并使用一个统一的数组结构体用来暂存数据。采集任务开始后程序依次检测各个气象要素的采集时间标志,采集时间到则启动采样程序,将采样得到的数据根据各个传感器的换算公式进行计算后得到的实际气象要素值分别存入数组结构体中。
由于单片机采样速率较快,每个采样值都是得到一组数据,去掉一个最大值和一个最小值后得到的平均值,以保证数据的稳定。等到数据处理时间标志到达后,再将这段时间内暂存在数组结构体中的数据按照各个气象要素的要求进行统一处理得到一组最终值,将最后得到的这组最终值连同时间存储到一个单独的缓存区以备显示模块、通讯模块等调用。最后,当到达指定存储间隔后,将缓存区的数据转存至FLASH或SD卡中。
3.2人机交互接口
良好的人机交互接口为工作人员提供了可视化的操作环境,方便工作人员对自动气象站进行监视、参数设置、故障检测、数据导出、配置传感器等,极大地提高了自动气象站的灵活性、可扩展性和可维护性。系统采用的是128x64像素点阵式LCD液晶屏,并配有“左”“右”选择键、“上”“下”加减键及“确定”和“取消”一共6个按键,以此实现深度为三级的菜单界面,并可根据界面提示对系统各个参数进行设置。菜单界面的设计利用了“状态机”的思想,通过一个结构体数组确定菜单的转向以及执行的函数。这种方法的内存消耗量小、效率高,且可以很灵活地升级、扩展。部分C语言代码如下:
typedef struct//菜单状态结构体
{
unsigned short StateIndex; //菜单状态序号
unsigned short StateKeyRight; // “右”键指向的下个菜单序号
unsigned short StateKeyUp; //“上”键指向的下个菜单序号
unsigned short StateKeySet; //“确定”键指向的下个菜单序号
unsigned short StateKeyCancel; //“取消”键指向的下个菜单序号
void (*CurrentOperate)(); // 函数指针指向本级菜单需执行的函数
}StateTableStruct;
StateTableStruct KeyTable[SIZE_OF_STATE]= //菜单状态结构表
{
{ 0, 1, 1, 2, 0, 0, 0, *D0},
{ 1, 1, 1, 2, 0, 1, 1, *D1},//0级
{ 2, 3, 4, 5, 0, 2, 2, *D2},
{ 3, 4, 2, 11, 0, 3, 3, *D3},
{ 4, 2, 3, 15, 0, 4, 4, *D4},//1级
…………………. //此处省略部分代码
{31, 31, 31, 47, 15, 31, 31, *D31},//3.1
{32, 32, 32, 48, 16, 32, 32, *D32},//3.2
{33, 33, 33, 49, 17, 33, 33, *D33},//3.3
};
extern unsigned short KeyValue; //按键的键值
void(*KeyFuncPtr)(); //指向按键后执行函数的指针变量
void Interface()
{
if(FlagKeyPressed==TRUE) //有键按下
{
FlagKeyPressed=FALSE;
switch(KeyValue)
{
case KEY _RIGHT: KeyFuncIndex=KeyTable[KeyFuncIndex]. StateKeyRight; break;
case KEY _LEFT: KeyFuncIndex=KeyTable[KeyFuncIndex]. StateKeyLeft; break;
case KEY_SET: KeyFuncIndex=KeyTable[KeyFuncIndex]. StateKeySet; break;
case KEY_CANCEL: KeyFuncIndex=KeyTable[KeyFuncIndex].StateKeyCancel; break;
case KEY_UP: KeyFuncIndex=KeyTable[KeyFuncIndex]. StateKeyUp; break;
case KEY_DOWN: KeyFuncIndex=KeyTable[KeyFuncIndex]. StateKeyDown; break;
default: break;
}
KeyFuncPtr=KeyTable[KeyFuncIndex].CurrentOperate; //指向要执行的函数
(*KeyFuncPtr)();//执行
}
}
3.3通讯系统
GPRS是通用分组无线业务的简称,是基于GSM的新型移动分组数据承载业务[3],具有接入时间短、“永远在线”、费用低、网络资源利用率高、覆盖范围广等优点,特别适合频繁、突发性的小流量数据传输,很好地适应了自动气象站的需要[4]。系统采用华为EM310无线模块实现与上位机的数据传输,它内嵌TCP/IP协议,能方便地通过GPRS网络与Internet上的PC机进行数据交换,支持AT控制指令集,可通过控制器串口发送AT指令直接对模块进行操作,并具有体积小、重量轻、功耗低等优点。以下是GPRS初始化及测试的部分C语言代码:
//AT指令表
unsigned char AT[]="AT";//握手信号
unsigned char ATI[] ="ATI";//设备初始化
unsigned char ATE0V1[] ="ATE0V1";//关回显设置命令返回OK/V1 0/V0
unsigned char AT_IPR[] ="AT+IPR=9600"; //波特率设置
unsigned char AT_CPIN[] ="AT+CPIN?"; //查询SIM卡状态
unsigned char AT_CSQ[] ="AT+CSQ"; //查询信号
unsigned char ATH[] ="ATH"; //呼叫挂起
unsigned char AT_COPS[] ="AT+COPS?"; //查询网络运营商
unsigned char AT_CGREG[] ="AT+CGREG?"; //GPRS IP 方式
unsigned char AT_IOMODE[] ="AT%IOMODE=0,1,1";
unsigned char AT_CGDCONT[] ="AT+CGDCONT=1,\"IP\",\"CMNET\"";
//GPRS 接收方式
unsigned char AT_ETCPIP[] ="AT%ETCPIP=\"\",\"\"";
unsigned char AT_IPOPEN[] ="AT%IPOPEN=\"TCP\",\"222.20.95.129\",1001";
//GPRS连接方式\GPRS连接地址(根据用户实际IP修改)\GPRS连接的端口
unsigned char AT_IPSEND[] ="AT%IPSEND=\"STM32 SEND DATA TO PC!\""; //信息命令
unsigned char AT_IPCLOSE1[] ="AT%IPCLOSE=1";//TCP连接关闭
unsigned char AT_IPCLOSE5[] ="AT%IPCLOSE=5";//GPRS连接关闭
unsigned char ATA[] ="ATA"; //来电接听
void sendchar(unsigned char ch)//通过串口发送单个字符
{
while (!(USART1->SR & USART_FLAG_TXE));
USART_SendData(USART1, ch);
}
void sendstring(unsigned char *p)//通过串口发送字符串
{
while(*p) sendchar(*p++);
sendchar(0x0D);
sendchar(0x0A);
}
void GSM_init(void) //GPRS初始化函数
{
while(1)
{
clear_SystemBuf();
sendstring(AT);
if((SystemBuf[5]=='O')&&(SystemBuf[6]=='K')) break; //判断模块是否初始化成功
}
sendstring(ATI);//初始化
sendstring(AT_IPR);//波特率9600
sendstring(ATE0V1);//关闭回显,设置DCE为OK方式
while(1)
{
clear_SystemBuf();
sendstring(AT_CPIN);//查询SIM卡状态
if((SystemBuf[18]=='O')&&(SystemBuf[19]=='K')) break;
}
do
{
clear_SystemBuf();
sendstring(AT_COPS);
}while(strsearch("CHINA MOBILE",SystemBuf)==0);//检测服务商信息
}
void GPRS_Send(void)//GPRS建立连接并发送数据
{
sendstring(AT_CGDCONT);
sendstring(AT_IOMODE);
sendstring(AT_ETCPIP);
sendstring(AT_IPOPEN);
sendstring(AT_IOMODE);
sendstring(AT_IPSEND);
sendstring(AT_IPCLOSE1);
sendstring(AT_IPCLOSE5);
}
采集软件中的通讯分为两个部分:一是将STM32单片机作为主机与各智能传感器之间的通讯,二是将STM32单片机作为从机与监控中心主机的通讯。前者采用RS485总线主从式的通讯方法,使用MODBUS协议的主机查询和从机回复的帧消息结构,这样有利于对从机的管理,避免数据传输出现混乱。后者则利用GPRS通讯与远程监控中心进行数据传输,对自动气象站进行监控。
3.4上位机软件
监控中心主机在Internet中有固定的IP地址,方便与自动气象站间的数据传输。除了操作系统外,主机安装Visual Studio 2008开发环境和SQL Server 2005数据库管理软件,采用C#.NET编写数据接收与管理软件,实现对各个自动气象站的管理,数据的实时显示、接收、处理,具有分类存储,数据保存,曲线显示,统计分析,历史数据查询及打印报表等功能。
4结束语
本文所设计的气象数据采集系统观测精度高、自动化程序高、性价比高,可长时间全天候不间断地进行气象要素观测,具有良好的可靠性和稳定性。软件设计采用模块化的设计方法,工作环境变化时不需对原有软硬件进行任何改动,只需要将新的传感器加入到系统中,并进行简单的软件配置或升级即可,提高了系统的可扩展性。同时,由于GPRS覆盖面积广、接入速度快、稳定性高,数据传输的实时性和准确性较好,为野外工作和远程监控提供了方便,使得系统具有很高的应用价值和广阔的市场前景。
参考文献
[1]彭刚,秦志强.基于ARM Cortex-M3的STM32系列嵌入式微控制器应用实践[M].北京:电
子工业出版社, 2011(1).
[2]World Meteorological Organization. The Measurement of Gustiness at Routine Wind
Stations.1987.
[3]R.J.(Bud)Bates著,朱洪波等译.通用分组无线业务(GPRS)技术与应用[M].北京:人民邮出
版社,2004(2).
[4]徐宁军,陈战平,冯智伟等.GPRS业务在自动气象站网数据传输中的应用[J].气象科
技,2006(1).
共0条 [查看全部] 网友评论