裘君,陳婉君,2,楊蘊(yùn)菡
基于Matlab產(chǎn)品族的溫濕度采集系統(tǒng)設(shè)計(jì)*
裘君1,陳婉君1,2,楊蘊(yùn)菡1
(1.浙江大學(xué)寧波理工學(xué)院信息科學(xué)與工程學(xué)院,寧波315100;2.太原科技大學(xué))
Matlab產(chǎn)品族中的Matlab Coder、Simulink Coder和Embedded Coder是針對(duì)C/C++代碼轉(zhuǎn)換而推出的,目的是加快軟件開(kāi)發(fā)并提高其執(zhí)行效率。飛思卡爾FRDM-KL25Z則是一款非常高效節(jié)能的控制器??紤]到環(huán)境溫濕度采集系統(tǒng)對(duì)效率和功耗的要求,這里將以FRDM-KL25Z為主控器,以溫濕度傳感器DHT11為檢測(cè)模塊,并利用Embedded Coder和Matlab Coder設(shè)計(jì)溫濕度采集功能模塊,用Simulink搭建控制程序,最終設(shè)計(jì)了一種高效節(jié)能的溫濕度采集系統(tǒng),實(shí)現(xiàn)實(shí)時(shí)采集環(huán)境溫濕度值并上傳的功能。
溫濕度采集系統(tǒng);Matlab Coder;Embedded Coder;Simulink Coder;FRDM-KL25Z
目前,嵌入式系統(tǒng)的應(yīng)用逐漸地滲透到各行各業(yè)的電子產(chǎn)品中,因此市場(chǎng)對(duì)電子產(chǎn)品軟件開(kāi)發(fā)的需求呈現(xiàn)快速增長(zhǎng)的趨勢(shì),對(duì)軟件的開(kāi)發(fā)手段則提出了更高的要求[1]。Matlab產(chǎn)品族中的Matlab Coder[2]和Simulink Coder[3-4]可以將Matlab函數(shù)和Simulink模型框圖轉(zhuǎn)換成高效優(yōu)化的C程序代碼。借助Matlab Coder,在針對(duì)某個(gè)嵌入式系統(tǒng)進(jìn)行C/C++程序設(shè)計(jì)時(shí),可以利用Matlab中強(qiáng)大的函數(shù)庫(kù)來(lái)簡(jiǎn)化程序,最終又能生成獨(dú)立運(yùn)行于嵌入式系統(tǒng)中的C/C++代碼[5],這樣極大地縮短了軟件的開(kāi)發(fā)周期并提高了程序執(zhí)行的效率。
Matlab Coder同時(shí)又可以將Matlab函數(shù)、C/C++編寫的特定功能算法集成封裝到特定的Simulink模塊中,而Simulink Coder則可以將這些模塊再生成C/C++代碼來(lái)實(shí)現(xiàn)嵌入式系統(tǒng)等的控制[1]。而Matlab中Embedded Coder可為受支持的嵌入式處理器生成代碼,它一般是針對(duì)某一特定嵌入式處理器的支持包,其對(duì)一些通用的外設(shè)驅(qū)動(dòng)(如輸入輸出、串口操作等)、特定處理器的內(nèi)核、時(shí)鐘、引腳等都做了定義。
飛思卡爾(現(xiàn)已被NXP收購(gòu))Kinetis L系列是非常高效節(jié)能的MCU,它全新的設(shè)計(jì)理念使早先在8/16位MCU中無(wú)法完成的設(shè)計(jì)應(yīng)用成為可能[6],它集成了最新的ARM Cortex-M0+內(nèi)核、具有多個(gè)Flash存儲(chǔ)器、豐富的模擬外設(shè)和HMI外設(shè)選項(xiàng)。Kinetis L系列向下兼容飛思卡爾8位單片機(jī),向上兼容飛思卡爾32位單片機(jī)[7],且具有低廉的價(jià)格和強(qiáng)大的開(kāi)發(fā)支持包。
本文旨在設(shè)計(jì)一種高效節(jié)能的溫濕度采集系統(tǒng),首先利用Embedded Coder和Matlab Coder設(shè)計(jì)了溫濕度采集程序,并將所有程序封裝到DHT11的Simulink模塊中;然后,在Simulink中搭建了系統(tǒng)的控制程序;最后,借助Simulink Coder自動(dòng)將在Simulink中搭建的控制程序生成C代碼并下載到FRDM-KL25Z開(kāi)發(fā)套件上執(zhí)行,進(jìn)而實(shí)現(xiàn)溫濕度采集并上傳的功能。
本文安裝的是針對(duì)飛思卡爾FRDM-KL25Z處理器的Embedded Coder支持包。該支持包中用C++語(yǔ)言定義了一些通用的外設(shè)驅(qū)動(dòng)類,如模擬量輸入類、模擬量輸出類、數(shù)字量輸入/輸出類、中斷類、串口類、定時(shí)器等。例如數(shù)字量輸入/輸出類DigitalInOut,其對(duì)應(yīng)的部分函數(shù)聲明如下所示,具體都是由Embedded Coder來(lái)實(shí)現(xiàn)。
class DigitalInOut{
public:
DigitalInOut(Pin Name pin);
//創(chuàng)建DigitalIn Out對(duì)象并連接到一個(gè)具體的引腳
void write(int value); //向?qū)?yīng)引腳寫值,0或1
int read();//從對(duì)應(yīng)引腳讀取值,0或1
void output();//設(shè)置引腳為輸出屬性
void input();//設(shè)置引腳為輸入屬性
}
如果在程序設(shè)計(jì)時(shí)用到這些類,首先要實(shí)例化,然后就可以直接調(diào)用類中定義的函數(shù)了,如下面的程序所示:
DigitalIn Outio;//數(shù)字量輸入輸出類的實(shí)例化
io.output();//設(shè)置引腳為輸出屬性
io=1;//引腳輸出高電平
這些通用的類是針對(duì)大多數(shù)MCU都適用的,本文中用到的是基于Cortex- KL25Z控制器,故Embedded Coder支持包也給出了與該MCU對(duì)應(yīng)的一些定義和庫(kù)函數(shù)等,部分如圖1所示。M0+內(nèi)核的FRDM
圖1 Embedded Coder支持包對(duì)FRDM KL25Z的定義文件
Embedded Coder支持包在Matlab環(huán)境中安裝好后,在Simulink中會(huì)有一些自帶的針對(duì)FRDMKL25Z的功能模塊,如圖2所示。這些模塊都對(duì)應(yīng)著KL25Z上的相應(yīng)部分,如RGB LED模塊對(duì)應(yīng)KL25Z上的RGB燈,其三個(gè)輸入端對(duì)應(yīng)KL25Z上的三個(gè)引腳,給三個(gè)輸入端賦值就是給KL25Z上的對(duì)應(yīng)的三個(gè)引腳賦值;Analog Input模塊對(duì)應(yīng)著KL25Z上的某個(gè)模擬輸入引腳,模塊的輸出為KL25Z上對(duì)應(yīng)模擬輸入引腳的輸入值,這需要外設(shè)給實(shí)際的輸入引腳賦值。同理AnalogOutput、DigitalInput、Digital Output、Serial Receive、Serial Transmit等模塊都是對(duì)應(yīng)著KL25Z上的一些輸入或輸出引腳。
圖2 Embedded Coder支持包為KL25Z創(chuàng)建的Simulink模塊
圖3 模塊設(shè)計(jì)流程圖
具體的設(shè)計(jì)流程如圖3所示。
圖3中,第一列.h和.cpp文件是DHT11的驅(qū)動(dòng)程序,用C++設(shè)計(jì)的。因?yàn)镃++中有“類”這個(gè)類型,其中的public成員可以被外部調(diào)用,這里用于被Matlab函數(shù)調(diào)用。第二列為C包裹文件,由于Matlab函數(shù)不能直接調(diào)用C++程序,而驅(qū)動(dòng)是用C++寫的,所以要?jiǎng)?chuàng)建包含兼容性函數(shù)的C包裹文件,這樣Matlab函數(shù)就可以通過(guò)C程序間接地調(diào)用C++編寫的源碼了。第三列是Matlab程序文件,該文件用于定義所要設(shè)計(jì)的Simulink模塊,主要包括屬性定義和方法定義。屬性部分用于定義一些變量,類似于C中的全局變量。方法部分則是定義模塊的具體功能和輸入/輸出端等。第四列即為最終需要的Simulink模塊,該模塊包含了前三列的所有C/C++和Matlab程序。
2.1模塊驅(qū)動(dòng)程序的設(shè)計(jì)
DHT11模塊的功能是根據(jù)采樣時(shí)間從數(shù)據(jù)引腳讀取當(dāng)前環(huán)境的溫濕度值。其底層的驅(qū)動(dòng)程序是基于Embedded Coder通過(guò)C++來(lái)實(shí)現(xiàn)的,命名為DHT11.h和DHT11.cpp。其中,DHT11.h文件中部分程序如下所示:
首先定義了一個(gè)類DHT11,其構(gòu)造函數(shù)的參數(shù)是引腳類型的變量,對(duì)應(yīng)著溫濕度傳感器的數(shù)據(jù)傳輸引腳;readData()函數(shù)返回的是數(shù)據(jù)采集的狀態(tài),返回“0”就表示數(shù)據(jù)已正確讀??;read Humidity()、read Temperature()函數(shù)分別獲得環(huán)境的相對(duì)濕度值和溫度值。Private類型的變量io為DigitalInOut類的實(shí)例對(duì)象,用來(lái)確定溫濕度傳感器DHT11的數(shù)據(jù)傳輸引腳為數(shù)字量輸入/輸出類型。
而DHT11.cpp中的程序則是借助于Embedded Coder對(duì)各函數(shù)的具體實(shí)現(xiàn),如構(gòu)造函數(shù),也即模塊初始化函數(shù)DHT11(Pin Namepin)的實(shí)現(xiàn)程序如下所示:
DHT11::DHT11(Pin Name pin):io(pin){}
這里只需要給I/O對(duì)象所需的引腳參數(shù),即可將某一實(shí)際的引腳初始化為數(shù)字量輸入/輸出功能。具體則是通過(guò)自動(dòng)調(diào)用DigitalInOut類中的函數(shù)來(lái)實(shí)現(xiàn),可見(jiàn)借助于Embedded Coder能大大地減少代碼量。
由于Matlab不能直接調(diào)用C++程序,所以要?jiǎng)?chuàng)建包含兼容性函數(shù)的C包裹文件,命名為:THSensor_wrapper.h和THSensor_wrapper.cpp。其中THSensor_wrapper.h是對(duì)各函數(shù)的聲明,而THSensor_wrapper.cpp則為各函數(shù)通過(guò)調(diào)用驅(qū)動(dòng)程序DHT11類中的public類型的函數(shù)來(lái)實(shí)現(xiàn)相應(yīng)的功能。THSensor_wrapper.cpp中具體程序如下所示:
2.2模塊Matlab程序的設(shè)計(jì)
這里主要是借助于Matlab Coder,Matlab函數(shù)通過(guò)C包裹文件調(diào)用DHT11模塊的底層驅(qū)動(dòng)程序,最后又能自動(dòng)地全部轉(zhuǎn)換為C代碼下載到硬件電路上,進(jìn)而實(shí)現(xiàn)溫濕度采集的功能。主要程序如下:
程序中用到了一些Matlab函數(shù),其中stepImpl函數(shù)對(duì)模塊進(jìn)行初始化,這里主要是初始化溫濕度傳感器的數(shù)據(jù)傳輸引腳;stepImpl函數(shù)的內(nèi)容是每個(gè)時(shí)間步(這里是傳感器的采樣時(shí)間)所要執(zhí)行的任務(wù),即采集當(dāng)前環(huán)境的溫濕度值;getDescriptiveName函數(shù)是給要?jiǎng)?chuàng)建的Simulink模塊命名;releaseImpl函數(shù)用來(lái)釋放所占用的內(nèi)存;coder.cinclude函數(shù)用來(lái)調(diào)用所需的頭文件;coder.ceval函數(shù)則是用來(lái)評(píng)估和執(zhí)行對(duì)應(yīng)的功能函數(shù)??梢?jiàn)借助于Matlab中強(qiáng)大的函數(shù)庫(kù),可以簡(jiǎn)化程序設(shè)計(jì),提高程序的執(zhí)行效率,如stepImpl函數(shù)的使用避免了在C程序中定時(shí)器的頻繁使用,并且使程序的結(jié)構(gòu)更加簡(jiǎn)潔明了。
2.3DHT11的Simulink模塊生成
當(dāng)DHT11模塊的驅(qū)動(dòng)程序、C包裹程序和Matlab程序都正確編寫完了后,就要將這些程序都封裝到DHT11的Simulink模塊中。在Matlab工具欄的應(yīng)用程序選項(xiàng)下選擇“Freescale Cup Companion”,然后創(chuàng)建一個(gè)新的model,在新model下加入一個(gè)Matlab System模塊,并給其添加定義好的模塊“T HSensor”,就可生成一個(gè)DHT11的Simulink模塊,如圖4所示。
圖4 DHT11的Simulink模塊
溫濕度傳感器的一個(gè)非常重要的參數(shù)就是采樣時(shí)間。在Matlab中沒(méi)有明確的采樣時(shí)間的模塊會(huì)自動(dòng)地繼承跟它相連接的有可控采樣時(shí)間的模塊的采樣時(shí)間,因此如圖5所示,借助Constant模塊和Add模塊,為THSensor模塊添加采樣時(shí)間。因?yàn)镃onstant模塊的采樣時(shí)間是可控的,而且要把Constant模塊的值設(shè)為0,然后用這三個(gè)模塊共同創(chuàng)建一個(gè)新的模塊,并命名為THSensor,兩個(gè)輸出端分別輸出溫度值和濕度值。
最后在THSensor模塊的Mask選項(xiàng)下,為其添加采樣時(shí)間Sample time參數(shù),這樣在模塊的屬性對(duì)話框中就可以看到這個(gè)參數(shù)了,如圖6所示。用戶可以直接在這個(gè)對(duì)話框中設(shè)置所需的采樣時(shí)間,避免了C程序中復(fù)雜的計(jì)算。到此,DHT11的Simulink模塊的封裝就基本完成了。
圖5 給DHT11的Simulink模塊添加采樣時(shí)間參數(shù)
圖6 DHT11 Simulink模塊的可調(diào)采樣時(shí)間參數(shù)
圖7 溫濕度采集系統(tǒng)的原理圖
溫濕度采集系統(tǒng)的主控制器為FRD- KL25Z,數(shù)據(jù)采集設(shè)備為DHT11溫濕度傳感器,系統(tǒng)功能為根據(jù)采樣時(shí)間連續(xù)地采集環(huán)境溫濕度值并上傳到主機(jī)。上文已經(jīng)對(duì)溫濕度采集程序進(jìn)行了設(shè)計(jì),并封裝到了特定的Simulink模塊THSensor中,現(xiàn)在將簡(jiǎn)單介紹溫濕度采集系統(tǒng)的整體設(shè)計(jì)和系統(tǒng)功能的具體實(shí)現(xiàn)。
系統(tǒng)原理圖如圖7所示,圖中大致分為4個(gè)部分:①FRDM_KL25Z_all,列出了FRDM- KL25Z開(kāi)發(fā)套件中的所有可用引腳;②DHT11,標(biāo)明了溫濕度傳感器各引腳與主控器的連接;③UART0,表示溫濕度采集系統(tǒng)的數(shù)據(jù)上傳用到的是FRDM- KL25Z中的串口模塊uart0,并利用其默認(rèn)的數(shù)據(jù)接收引腳PTA1和發(fā)送引腳PTA 2;④OpenSDA接口,此接口有調(diào)試、下載和串行通信的功能。OpenSDA接口和主機(jī)的USB接口連接時(shí),會(huì)自動(dòng)形成一個(gè)COM口,該COM口對(duì)應(yīng)著uart0模塊。故僅通過(guò)OpenSDA接口,就可實(shí)現(xiàn)程序的下載和串口數(shù)據(jù)收發(fā)的功能。
在Simulink環(huán)境下系統(tǒng)控制程序如圖8所示,圖中有三個(gè)功能模塊:
①THSensor,DHT11對(duì)應(yīng)的Simulink模塊,該模塊的功能是根據(jù)采樣周期,連續(xù)地采集當(dāng)前環(huán)境下的溫濕度值并輸出。其中Out1對(duì)應(yīng)著溫度值的輸出,Out2對(duì)應(yīng)著濕度值的輸出;
②Matrix Concatenate,Simulink中的數(shù)組操作模塊,這里利用其將溫度值和濕度值組合在一個(gè)數(shù)組中;
③Serial Transmit,Embedded Coder中自定義的串口數(shù)據(jù)發(fā)送模塊。該模塊默認(rèn)對(duì)應(yīng)著FRDM-K L25Z中的UART0,而且串口的波特率等參數(shù)在Embedded Coder的串口類中已被設(shè)置好,不需要再另外設(shè)置。
圖8 Simulink中控制程序搭建圖
首先,按照?qǐng)D7原理圖所示,進(jìn)行DHT11模塊和FRDM-KL25Z開(kāi)發(fā)套件的實(shí)物連接,并按照?qǐng)D8所示,正確連接各Simulink模塊。
然后,連接FRDM-KL25Z的OpenSDA接口和主機(jī)的USB接口,如圖9所示,自動(dòng)形成了一個(gè)串口COM3。最后,點(diǎn)擊圖8所示Simulink model工具欄上的,此時(shí)Simulink Coder會(huì)自動(dòng)地將在Simulink中搭建的控制程序再生成C代碼并通過(guò)OpenSDA接口下載到FRDMKL25Z開(kāi)發(fā)套件上執(zhí)行。
圖9 OpenSDA接口形成的COM口
這樣既可實(shí)現(xiàn)溫濕度采集的功能,又能將采集到的溫濕度值通過(guò)FRDM-KL25Z中的uart0模塊發(fā)送,而OpenSDA在主機(jī)中形成的COM3口可接收到發(fā)送的數(shù)據(jù)。為了能正確地接收數(shù)據(jù),COM3的波特率等參數(shù)要和Embedded Coder中串口類對(duì)uart0模塊的參數(shù)設(shè)置一致。
此時(shí)溫濕度傳感器所處的環(huán)境為熱水杯的水面上空,采樣時(shí)間為3 s,將接收到的數(shù)據(jù)在主機(jī)的串口調(diào)試助手中顯示,如圖10所示。第一列數(shù)據(jù)為采集到的溫度值,第二列為相對(duì)濕度值。
文中設(shè)計(jì)的溫濕度采集系統(tǒng)有著低功耗、高效率的特點(diǎn)。低功耗主要體現(xiàn)在所選的FRDMKL25Z,這是一款非常節(jié)能的MCU,而高效率則主要體現(xiàn)在對(duì)Matlab Coder、Embedded Coder的使用上。Matlab Coder和Embedded Coder能簡(jiǎn)化C程序的設(shè)計(jì),提高程序執(zhí)行的效率。而將程序封裝到Simulink模塊中,則有利于模塊的單獨(dú)調(diào)試,并且能直觀地了解到各模塊之間的關(guān)系。
圖10 主機(jī)COM3口接收數(shù)據(jù)圖
[1]廖燦燦,張樹(shù)群,雷兆宜.Matlab Coder生成C代碼的研究與應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2013(3):175-178.
[2]Online MATLAB.MATLAB2012a,MATLAB Coder[EB/ OL].[201604].http://www.mathWorks.cn/p roDucts/ matlab coder/.
[3]陳永春.從MATLAB/Simulink模型到代碼實(shí)現(xiàn)[M].北京:清華大學(xué)出版社,2002.
[4]魏鑫.MATLAB R2014a從入門到精通[M].北京:電子工業(yè)出版社,2015.
[5]劉玉良,李剛,康凱.基于MATLAB的嵌入式系統(tǒng)軟件開(kāi)發(fā)[J].天津大學(xué)學(xué)報(bào),2008,41(5):593-596.
[6]蔣婷,王宜懷,李濤.基于ARM CotexM0+KL系列MCU的構(gòu)件化匯編框架研究[J].計(jì)算機(jī)應(yīng)用與軟件,2015,32(1):13-15.
[7]趙航濤,賀永慶,錢音潔,等.基于KL25單片機(jī)的直流電機(jī)控制電路及編程[J].電腦開(kāi)發(fā)與應(yīng)用,2014,27(11):37-39.
裘君(副教授)、陳婉君(碩士研究生),研究方向?yàn)榍度胧较到y(tǒng)應(yīng)用。
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,F(xiàn)RDM-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)
寧波市科技計(jì)劃項(xiàng)目(編號(hào):2014B82015);浙江大學(xué)寧波理工學(xué)院教學(xué)改革與研究項(xiàng)目(編號(hào):NITJ- 201517)。