Board logo

标题: 基于Cortex—M3的自动气象站设计 [打印本页]

作者: forsuccess    时间: 2013-7-24 21:43     标题: 基于Cortex—M3的自动气象站设计

随着我国气象事业的快速发展,人们对气象信息采集的要求也越来越高,传统的人工操作和读数不仅劳动效率低下,而且容易出现人为错误,已无法满足现代气象观测的要求,近些年,电子技术的快速发展为气象数据采集技术的更新和设备换代提供了条件,Cortex—M3基于ARM公司最新的v7平台,它的数据处理能力是ARM7的两倍,而功耗只有ARM7的1/3,低廉的价格使其具有很高的性价比,在Cortex-M3上移植μc/os—II实时操作系统保证了系统的实时性和稳定性,其具有的诸多优点非常适合存自动气象数据采集领域使用。

1 系统整体设计
整个气象数据采集系统硬件主要由气象数据采集传感器模块、主控制模块、数据存储模块、数据发送模块以及上位机接收模块组成。传感器采集模块在主控制器的驱动下完成温度、湿度、气压、风速数据的采集,主控制模块由使用Cortex—M3内核的STM32处理器的最小系统组成,完成对数据采集传感器模块的控制以及对采集数据的数据处理工作,数据处理按照《地面气象规范2003》的基本要求执行,数据存储模块使用SD卡来完成测量数据的本地备份,处理完的数据打包成气象数据包使用GPRS模块通过GSM网络发送至上位机,上位机模块由GPRS模块和PC组成,上位机通过GSM网络接收测量数据并进一步处理,整体结构如图1所示。



2 气象数据采集模块
系统气压采集模块使用BMP085数字气压传感器,其和STM32通信使用标准的IIC协议,其内置的EEPROM中存储了补偿计算需要的11个参数,它们是11个连续存储的16位数据,存储地址为0XAA~0XBF,当STM32在读取了测量数据后需要通过补偿计算得到单位为hpa的测量数据。温湿度采集模块使用AM2301数字温湿度复合传感器,其与STM32通信使用单总线通信协议,该模块内置了一个8位的MCU,能自动完成数据的测量工作,当STM32得到了总线的控制权后,输出低电平大于800μs后,AM2301模块就得到了总线控制权并输出80μs的低电平作为响应信号并马上连续输出40bit的测量数据,测量数据格式为:40bit=湿度高8位+湿度低8位+温度高8位+温度低8位+校验位,其中校验位=湿度高位+湿度低位+温度高位+温度低位。风速采集模块使用FY-FS风杯式风速传感器,风吹动风杯转动会把风速信号转化为脉冲信号输出,STM32使用外部中断和定时中断来捕获脉冲频率并通过计算得到实时风速值。处理完成的数据存储在SD卡中,SD卡是一种存储容量为1 G的FLASH产品,与STM32通过SPI协议通讯。数据发送模块使用SIM300,利用短信息方式(TEXT模式)通过GSM网络与上位机通信,STM32使用AT指令通过串口与SIM300通信,上位机使用SIM300模块接收测量数据进行下一步处理。 数据采集各模块的关键技术指标见表1,其中温湿度、气压使用平均算法,风速使用滑动平均算法。


平均算法:测量一分钟,每分钟取样6次,去掉一个最大值和最小值,剩下4个值取算术平均。
滑动平均算法:当采集速率每秒一次(t=1),平均期间T=3s,连续测量120s,代入下面公式计算:

式中:n个样本值的平均值,:n-1个样本值的平均值,Yn:第n个样本值,t:采样时间,T:平均期间(s)。

3 软件设计
3.1 基于Cortex—M3的μc/os—II移植
μc/os—II是一种典型的具有可剥夺型内核的基于任务优先级调度的实时操作系统,可同时管理多达64个任务,由于Cortex—M3不支持32位的ARM指令集,而只支持Thumb-2指令集,这种不向后兼容的方式使Cortex—M3之前平台使用的ARM汇编语言程序都不能直接移植到Cort ex—M3上,笔者从μc/os—II和Cortex—M3的内核结构研究着手,对μc/os—II内核中INCLUDES.H、OS_CFG.H、OS_CPU.H、OS_CPU_ C.C、OS_CPU_A.ASM五个与应用程序和处理器相关的文件进行修改,在INCLUDES.H中增加了与STM32处理器相关的外设寄存器定义和内存映射的头文件,在OS_CFG.H中完成对μc/os—II内核构造部分的配置工作,在OS_CPU.H中完成与编译器相关数据类型的定义、任务堆栈数据类型的定义,以及任务堆栈方向的设定工作,在OS_CPU_C.C中根据Cortex—M3内核结构完成系统任务堆栈结构设计,由于在C环境下无法对Cortex—M3的寄存器进行操作,所以需要在OS_CPU_A.ASM汇编环境中完成对临界区函数、上下任务切换函数以及中断服务子程序中的任务切换函数的设计工作,在完成以上修改后还需在c环境下增加系统时钟配置和中断函数为μc/os—II提供一个周期性信号源,在STM32中系统时钟是由SysTick定时器来提供的。
3.2 μc/os—II任务设计
在μc/os—II架构下整体设计中需要建立7个任务,如图2所示,由于统计任务主要作用是计算当前CPU的利用率,需要消耗相当的STM32内部资源,所以为节约系统资源在这里需要把系统配置OS_TASK_STAT_EN设置为0,禁止使用统计任务,空闲任务是必须的,在没有其它任务进入就绪状态时投入运行,当系统开始运行前自动建立,优先级自动配置为最低。由于系统要求在开始多任务调度前必须新建一个任务,所以我们建立了一个开始任务,开始仟务作用就是新建另外5个任务,包括:温湿度采集任务、气压数据采集任务、风速采集任务、数据存储任务、数据发送任务,完成这5个任务建立后开始任务就会自己挂起。完成对任务设计后还需要对任务的优先级进行设置,空闲任务优先级设置为最低,风速采集任务频率最高为1s/次,所以优先级应设置为最高,温湿度和气压采集任务频率相同为10s/次,设置优先级应低于风速采集任务,数据存储和发送任务应该都在前面几个数据采集任务完成后,所以设置优先级应该更低一些,开始任务由于在新建任务后被挂起并不参与任务调度,所以优先级可以设置为次于空闲任务的最低级。


3.3 系统整体调试
在主函数中需要进行初始化工作,主要完成STM32时钟系统和μc/os—II时钟系统配置,初始化操作系统后新建开始任务TaskStart后操作系统开始运行,在系统刚开始进行任务调度时由于只有空闲任务和开始任务参与任务调度,开始任务优先级最高所以执行开始任务,在开始任务中又新建气压测量任务(TaskPre)、温湿度测量任务(TaskTem)、风速测量任务(TaskV)、数据存储任务(TaskFlash)、数据发送任务(TaskSim),完成任务新建后开始任务被挂起进入休眠状态,不再参与任务调度,根据事先设计好的优先级系统总是执行优先级最高的任务,风速测量任务优先级最高,挂起时间一到总能得到处理器的使用权,当测量完毕后任务自动挂起不参与任务调度,类似的情况,温湿度测量、气压测量完成各自测量数据并完成数据处理器后也自动挂起,并把标志为置1表示测量工作完成,数据存储任务和数据发送任务根据判断标志位决定是否进行数据存储和数据发送工作,其主函数和开始任务主要代码如下:


在完成新建任务后进行整体软件调试,PC机通过USB转串口线接入SIM300模块后通过串口调试助手来观察接收到的下位机测量的气象数据,在这里需要注意的是,在气压测量、温湿度测量、风速测量任务中,为了数据读取和处理方便我们取的数据都是整数的,比如温度为12.8℃,我们实际存储数据就是128且是分在三个变量来存储百、十、个位的,所以为了数据的发送,我们设置一个全局数组data设计为一个数据帧来存储测量的数据,整个数据格式作如下定义:u8 data=湿度数据[3位]+温度数据[3位]+气压数据[5位]+风速[3位]来存储测量的数据,在通过GPRS发送数据时只需要通过AT指令把数组中的数据发送即可,上位机接收到数据如图3所示。



4 结论
本设计实现了μc/os—II在Cortex-M3上的移植并通过了实验验证,同时依照设计功能要求在μc/os—II平台上完成了气象数据采集系统中各个任务的设计工作,经实验验证,本系统能正常运行,气象数据测量精度达到设计要求,具有成本低廉,精度高,易于实现等特点,具有较好的实时性和稳定性。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0