APP下载

基于Matlab产品族的温湿度采集系统设计*

2016-11-10裘君陈婉君杨蕴菡

单片机与嵌入式系统应用 2016年9期
关键词:串口温湿度嵌入式

裘君,陈婉君,2,杨蕴菡

基于Matlab产品族的温湿度采集系统设计*

裘君1,陈婉君1,2,杨蕴菡1

(1.浙江大学宁波理工学院信息科学与工程学院,宁波315100;2.太原科技大学)

Matlab产品族中的Matlab Coder、Simulink Coder和Embedded Coder是针对C/C++代码转换而推出的,目的是加快软件开发并提高其执行效率。飞思卡尔FRDM-KL25Z则是一款非常高效节能的控制器。考虑到环境温湿度采集系统对效率和功耗的要求,这里将以FRDM-KL25Z为主控器,以温湿度传感器DHT11为检测模块,并利用Embedded Coder和Matlab Coder设计温湿度采集功能模块,用Simulink搭建控制程序,最终设计了一种高效节能的温湿度采集系统,实现实时采集环境温湿度值并上传的功能。

温湿度采集系统;Matlab Coder;Embedded Coder;Simulink Coder;FRDM-KL25Z

引 言

目前,嵌入式系统的应用逐渐地渗透到各行各业的电子产品中,因此市场对电子产品软件开发的需求呈现快速增长的趋势,对软件的开发手段则提出了更高的要求[1]。Matlab产品族中的Matlab Coder[2]和Simulink Coder[3-4]可以将Matlab函数和Simulink模型框图转换成高效优化的C程序代码。借助Matlab Coder,在针对某个嵌入式系统进行C/C++程序设计时,可以利用Matlab中强大的函数库来简化程序,最终又能生成独立运行于嵌入式系统中的C/C++代码[5],这样极大地缩短了软件的开发周期并提高了程序执行的效率。

Matlab Coder同时又可以将Matlab函数、C/C++编写的特定功能算法集成封装到特定的Simulink模块中,而Simulink Coder则可以将这些模块再生成C/C++代码来实现嵌入式系统等的控制[1]。而Matlab中Embedded Coder可为受支持的嵌入式处理器生成代码,它一般是针对某一特定嵌入式处理器的支持包,其对一些通用的外设驱动(如输入输出、串口操作等)、特定处理器的内核、时钟、引脚等都做了定义。

飞思卡尔(现已被NXP收购)Kinetis L系列是非常高效节能的MCU,它全新的设计理念使早先在8/16位MCU中无法完成的设计应用成为可能[6],它集成了最新的ARM Cortex-M0+内核、具有多个Flash存储器、丰富的模拟外设和HMI外设选项。Kinetis L系列向下兼容飞思卡尔8位单片机,向上兼容飞思卡尔32位单片机[7],且具有低廉的价格和强大的开发支持包。

本文旨在设计一种高效节能的温湿度采集系统,首先利用Embedded Coder和Matlab Coder设计了温湿度采集程序,并将所有程序封装到DHT11的Simulink模块中;然后,在Simulink中搭建了系统的控制程序;最后,借助Simulink Coder自动将在Simulink中搭建的控制程序生成C代码并下载到FRDM-KL25Z开发套件上执行,进而实现温湿度采集并上传的功能。

1 基于FRDM-KL25Z的Embedded Coder支持包

本文安装的是针对飞思卡尔FRDM-KL25Z处理器的Embedded Coder支持包。该支持包中用C++语言定义了一些通用的外设驱动类,如模拟量输入类、模拟量输出类、数字量输入/输出类、中断类、串口类、定时器等。例如数字量输入/输出类DigitalInOut,其对应的部分函数声明如下所示,具体都是由Embedded Coder来实现。

class DigitalInOut{

public:

DigitalInOut(Pin Name pin);

//创建DigitalIn Out对象并连接到一个具体的引脚

void write(int value); //向对应引脚写值,0或1

int read();//从对应引脚读取值,0或1

void output();//设置引脚为输出属性

void input();//设置引脚为输入属性

如果在程序设计时用到这些类,首先要实例化,然后就可以直接调用类中定义的函数了,如下面的程序所示:

DigitalIn Outio;//数字量输入输出类的实例化

io.output();//设置引脚为输出属性

io=1;//引脚输出高电平

这些通用的类是针对大多数MCU都适用的,本文中用到的是基于Cortex- KL25Z控制器,故Embedded Coder支持包也给出了与该MCU对应的一些定义和库函数等,部分如图1所示。M0+内核的FRDM

图1 Embedded Coder支持包对FRDM KL25Z的定义文件

Embedded Coder支持包在Matlab环境中安装好后,在Simulink中会有一些自带的针对FRDMKL25Z的功能模块,如图2所示。这些模块都对应着KL25Z上的相应部分,如RGB LED模块对应KL25Z上的RGB灯,其三个输入端对应KL25Z上的三个引脚,给三个输入端赋值就是给KL25Z上的对应的三个引脚赋值;Analog Input模块对应着KL25Z上的某个模拟输入引脚,模块的输出为KL25Z上对应模拟输入引脚的输入值,这需要外设给实际的输入引脚赋值。同理AnalogOutput、DigitalInput、Digital Output、Serial Receive、Serial Transmit等模块都是对应着KL25Z上的一些输入或输出引脚。

图2 Embedded Coder支持包为KL25Z创建的Simulink模块

图3 模块设计流程图

2 利用Embedded Coder和Matlab Coder设计DHT11的Simulink模块

具体的设计流程如图3所示。

图3中,第一列.h和.cpp文件是DHT11的驱动程序,用C++设计的。因为C++中有“类”这个类型,其中的public成员可以被外部调用,这里用于被Matlab函数调用。第二列为C包裹文件,由于Matlab函数不能直接调用C++程序,而驱动是用C++写的,所以要创建包含兼容性函数的C包裹文件,这样Matlab函数就可以通过C程序间接地调用C++编写的源码了。第三列是Matlab程序文件,该文件用于定义所要设计的Simulink模块,主要包括属性定义和方法定义。属性部分用于定义一些变量,类似于C中的全局变量。方法部分则是定义模块的具体功能和输入/输出端等。第四列即为最终需要的Simulink模块,该模块包含了前三列的所有C/C++和Matlab程序。

2.1模块驱动程序的设计

DHT11模块的功能是根据采样时间从数据引脚读取当前环境的温湿度值。其底层的驱动程序是基于Embedded Coder通过C++来实现的,命名为DHT11.h和DHT11.cpp。其中,DHT11.h文件中部分程序如下所示:

首先定义了一个类DHT11,其构造函数的参数是引脚类型的变量,对应着温湿度传感器的数据传输引脚;readData()函数返回的是数据采集的状态,返回“0”就表示数据已正确读取;read Humidity()、read Temperature()函数分别获得环境的相对湿度值和温度值。Private类型的变量io为DigitalInOut类的实例对象,用来确定温湿度传感器DHT11的数据传输引脚为数字量输入/输出类型。

而DHT11.cpp中的程序则是借助于Embedded Coder对各函数的具体实现,如构造函数,也即模块初始化函数DHT11(Pin Namepin)的实现程序如下所示:

DHT11::DHT11(Pin Name pin):io(pin){}

这里只需要给I/O对象所需的引脚参数,即可将某一实际的引脚初始化为数字量输入/输出功能。具体则是通过自动调用DigitalInOut类中的函数来实现,可见借助于Embedded Coder能大大地减少代码量。

由于Matlab不能直接调用C++程序,所以要创建包含兼容性函数的C包裹文件,命名为:THSensor_wrapper.h和THSensor_wrapper.cpp。其中THSensor_wrapper.h是对各函数的声明,而THSensor_wrapper.cpp则为各函数通过调用驱动程序DHT11类中的public类型的函数来实现相应的功能。THSensor_wrapper.cpp中具体程序如下所示:

2.2模块Matlab程序的设计

这里主要是借助于Matlab Coder,Matlab函数通过C包裹文件调用DHT11模块的底层驱动程序,最后又能自动地全部转换为C代码下载到硬件电路上,进而实现温湿度采集的功能。主要程序如下:

程序中用到了一些Matlab函数,其中stepImpl函数对模块进行初始化,这里主要是初始化温湿度传感器的数据传输引脚;stepImpl函数的内容是每个时间步(这里是传感器的采样时间)所要执行的任务,即采集当前环境的温湿度值;getDescriptiveName函数是给要创建的Simulink模块命名;releaseImpl函数用来释放所占用的内存;coder.cinclude函数用来调用所需的头文件;coder.ceval函数则是用来评估和执行对应的功能函数。可见借助于Matlab中强大的函数库,可以简化程序设计,提高程序的执行效率,如stepImpl函数的使用避免了在C程序中定时器的频繁使用,并且使程序的结构更加简洁明了。

2.3DHT11的Simulink模块生成

当DHT11模块的驱动程序、C包裹程序和Matlab程序都正确编写完了后,就要将这些程序都封装到DHT11的Simulink模块中。在Matlab工具栏的应用程序选项下选择“Freescale Cup Companion”,然后创建一个新的model,在新model下加入一个Matlab System模块,并给其添加定义好的模块“T HSensor”,就可生成一个DHT11的Simulink模块,如图4所示。

图4 DHT11的Simulink模块

温湿度传感器的一个非常重要的参数就是采样时间。在Matlab中没有明确的采样时间的模块会自动地继承跟它相连接的有可控采样时间的模块的采样时间,因此如图5所示,借助Constant模块和Add模块,为THSensor模块添加采样时间。因为Constant模块的采样时间是可控的,而且要把Constant模块的值设为0,然后用这三个模块共同创建一个新的模块,并命名为THSensor,两个输出端分别输出温度值和湿度值。

最后在THSensor模块的Mask选项下,为其添加采样时间Sample time参数,这样在模块的属性对话框中就可以看到这个参数了,如图6所示。用户可以直接在这个对话框中设置所需的采样时间,避免了C程序中复杂的计算。到此,DHT11的Simulink模块的封装就基本完成了。

图5 给DHT11的Simulink模块添加采样时间参数

图6 DHT11 Simulink模块的可调采样时间参数

3 温湿度采集系统的设计与实现

图7 温湿度采集系统的原理图

温湿度采集系统的主控制器为FRD- KL25Z,数据采集设备为DHT11温湿度传感器,系统功能为根据采样时间连续地采集环境温湿度值并上传到主机。上文已经对温湿度采集程序进行了设计,并封装到了特定的Simulink模块THSensor中,现在将简单介绍温湿度采集系统的整体设计和系统功能的具体实现。

系统原理图如图7所示,图中大致分为4个部分:①FRDM_KL25Z_all,列出了FRDM- KL25Z开发套件中的所有可用引脚;②DHT11,标明了温湿度传感器各引脚与主控器的连接;③UART0,表示温湿度采集系统的数据上传用到的是FRDM- KL25Z中的串口模块uart0,并利用其默认的数据接收引脚PTA1和发送引脚PTA 2;④OpenSDA接口,此接口有调试、下载和串行通信的功能。OpenSDA接口和主机的USB接口连接时,会自动形成一个COM口,该COM口对应着uart0模块。故仅通过OpenSDA接口,就可实现程序的下载和串口数据收发的功能。

在Simulink环境下系统控制程序如图8所示,图中有三个功能模块:

①THSensor,DHT11对应的Simulink模块,该模块的功能是根据采样周期,连续地采集当前环境下的温湿度值并输出。其中Out1对应着温度值的输出,Out2对应着湿度值的输出;

②Matrix Concatenate,Simulink中的数组操作模块,这里利用其将温度值和湿度值组合在一个数组中;

③Serial Transmit,Embedded Coder中自定义的串口数据发送模块。该模块默认对应着FRDM-K L25Z中的UART0,而且串口的波特率等参数在Embedded Coder的串口类中已被设置好,不需要再另外设置。

图8 Simulink中控制程序搭建图

首先,按照图7原理图所示,进行DHT11模块和FRDM-KL25Z开发套件的实物连接,并按照图8所示,正确连接各Simulink模块。

然后,连接FRDM-KL25Z的OpenSDA接口和主机的USB接口,如图9所示,自动形成了一个串口COM3。最后,点击图8所示Simulink model工具栏上的,此时Simulink Coder会自动地将在Simulink中搭建的控制程序再生成C代码并通过OpenSDA接口下载到FRDMKL25Z开发套件上执行。

图9 OpenSDA接口形成的COM口

这样既可实现温湿度采集的功能,又能将采集到的温湿度值通过FRDM-KL25Z中的uart0模块发送,而OpenSDA在主机中形成的COM3口可接收到发送的数据。为了能正确地接收数据,COM3的波特率等参数要和Embedded Coder中串口类对uart0模块的参数设置一致。

此时温湿度传感器所处的环境为热水杯的水面上空,采样时间为3 s,将接收到的数据在主机的串口调试助手中显示,如图10所示。第一列数据为采集到的温度值,第二列为相对湿度值。

结 语

文中设计的温湿度采集系统有着低功耗、高效率的特点。低功耗主要体现在所选的FRDMKL25Z,这是一款非常节能的MCU,而高效率则主要体现在对Matlab Coder、Embedded Coder的使用上。Matlab Coder和Embedded Coder能简化C程序的设计,提高程序执行的效率。而将程序封装到Simulink模块中,则有利于模块的单独调试,并且能直观地了解到各模块之间的关系。

图10 主机COM3口接收数据图

[1]廖灿灿,张树群,雷兆宜.Matlab Coder生成C代码的研究与应用[J].计算机与现代化,2013(3):175-178.

[2]Online MATLAB.MATLAB2012a,MATLAB Coder[EB/ OL].[201604].http://www.mathWorks.cn/p roDucts/ matlab coder/.

[3]陈永春.从MATLAB/Simulink模型到代码实现[M].北京:清华大学出版社,2002.

[4]魏鑫.MATLAB R2014a从入门到精通[M].北京:电子工业出版社,2015.

[5]刘玉良,李刚,康凯.基于MATLAB的嵌入式系统软件开发[J].天津大学学报,2008,41(5):593-596.

[6]蒋婷,王宜怀,李涛.基于ARM CotexM0+KL系列MCU的构件化汇编框架研究[J].计算机应用与软件,2015,32(1):13-15.

[7]赵航涛,贺永庆,钱音洁,等.基于KL25单片机的直流电机控制电路及编程[J].电脑开发与应用,2014,27(11):37-39.

裘君(副教授)、陈婉君(硕士研究生),研究方向为嵌入式系统应用。

Temperature and Humidity Acquisition System Based on Matlab

Qiu Jun1,Chen Wanjun1,2,Yang Yunhan1
(1.School of Information Science and Engineering,Ningbo Institute of Technology,Zhejiang University,Ningbo 315100,China;2.Taiyuan University of Science and Technology)

The Matlab Coder,Simulink Coder and Embedded Coder of Matlab are developed for C/C++code conversion,aiming at accelerating software development and improving the execution efficiency.The FRDM-KL25Z of Freescale is a very energy-efficient controller.In the paper,FRDM-KL25Z is used as the main controller and DHT11 as the sensor of temperature and humidity,then the Embedded Coder and Matlab Coder are used to design the temperature and humidity acquisition module.The Simulink is used to build the control program.Finally,the temperature and humidity acquisition system is designed,which can collect and upload data in real-time with high efficiency and low-power consumption.

temperature and humidity acquisition system;Matlab Coder;Embedded Coder;Simulink Coder;FRDM-KL25Z

TP399

A

��杨迪娜

2016-04-11)

宁波市科技计划项目(编号:2014B82015);浙江大学宁波理工学院教学改革与研究项目(编号:NITJ- 201517)。

猜你喜欢

串口温湿度嵌入式
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
浅谈AB PLC串口跟RFID传感器的通讯应用
基于AT89C51的数字型蚕用温湿度计的设计
基于DSP的多路温湿度监测系统
TS系列红外传感器在嵌入式控制系统中的应用
基于温湿度控制的天气预测装置
搭建基于Qt的嵌入式开发平台
蒸发冷却温湿度独立控制空调系统的应用
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索