廖春晨,王東,黃吳九,趙俊
(四川輕化工大學(xué)自動(dòng)化與信息工程學(xué)院,四川自貢,643000)
關(guān)鍵字:時(shí)序控制;Qt;嵌入式系統(tǒng);STM32
脈沖電信號(hào)時(shí)序控制技術(shù)是一種用途非常廣泛,近年來越來越多地被應(yīng)用于核物理[1-3]、醫(yī)療[4,5]、生物[6]、地質(zhì)[7-8]等等領(lǐng)域。隨著該系統(tǒng)地應(yīng)用場(chǎng)景日益廣泛,對(duì)于此項(xiàng)技術(shù)地要求也越來越苛刻,如何保證輸出電平的準(zhǔn)確性和時(shí)效性成了該技術(shù)的關(guān)鍵問題。此前,已有研究人員在解決時(shí)序觸發(fā)控制這個(gè)問題上做了響應(yīng)的研究例如基于DSP 的時(shí)序觸發(fā)控制系統(tǒng)[9-11],但是這些系統(tǒng)僅完成了脈沖電平時(shí)序信號(hào)發(fā)送功能,沒有對(duì)其簡(jiǎn)潔性,安全性進(jìn)行過多的考量。本文給出了上位機(jī)軟件和下位機(jī)嵌入式系統(tǒng)的設(shè)計(jì)方案,并在實(shí)際環(huán)境中對(duì)系統(tǒng)進(jìn)行了測(cè)試,測(cè)試結(jié)果表明該系統(tǒng)有更高的準(zhǔn)確性和時(shí)效性。
整個(gè)系統(tǒng)主體上可以分為兩個(gè)部分,上位機(jī)軟件部分和下位機(jī)嵌入式系統(tǒng)部分。上位機(jī)軟件由QT 編寫設(shè)計(jì),QT 具有優(yōu)良的跨平臺(tái)特性,工具豐富,功能完備,同時(shí)還提供了QT 特有的信號(hào)槽機(jī)制,可以很好的降低代碼的耦合性,提升代碼的復(fù)用性。主要用來處理脈沖數(shù)據(jù),包括數(shù)據(jù)的添加,刪除,修改,通道選擇等等。數(shù)據(jù)在上位機(jī)處理編輯好之后,通過TCP/IP 協(xié)議發(fā)送到下位機(jī)等待輸出命令。下位機(jī)搭載了兩塊STM32 微處理器,與通用性計(jì)算機(jī)系統(tǒng)相比,嵌入式系統(tǒng)功耗更低,可靠性高;功能強(qiáng)大,性價(jià)比高;實(shí)時(shí)性強(qiáng),支持多任務(wù);占用空間小,效率高;面向特定應(yīng)用,可根據(jù)實(shí)際需求靈活定制。當(dāng)上位機(jī)發(fā)出輸出模式的命令之后,下位機(jī)再根據(jù)情況選擇不同的方式將數(shù)據(jù)輸出到中斷設(shè)備中。整個(gè)系統(tǒng)的流程圖如圖1 所示。

圖1 系統(tǒng)流程圖
由于QT 作為一款非常靈活強(qiáng)大的軟件,不僅可以完成后端處理代碼的編輯,也可以完成軟件界面的設(shè)計(jì)工作。通過UI designer 與C++混合編程,或者qml 和c++混合編程,給我們?cè)诮缑嬖O(shè)計(jì)和程序邏輯功能的設(shè)計(jì)上帶來了極大的便利。界面和數(shù)據(jù)邏輯處理之間的通過QT 特有的信號(hào)槽機(jī)制連接起來,只需要給界面上的組件添加相應(yīng)的信號(hào)和對(duì)應(yīng)的槽函數(shù),就可以實(shí)現(xiàn)交互功能,通過簡(jiǎn)單的操作完成對(duì)數(shù)據(jù)的處理。
上位機(jī)部分主要由這幾個(gè)功能模塊組成:數(shù)據(jù)處理模塊;通信模塊;視圖組織模塊;控制器模塊;文件管理模塊等等。這些模塊互相協(xié)作,比如數(shù)據(jù)處理模塊,視圖組織模塊,控制器模塊構(gòu)成一個(gè)MVC 結(jié)構(gòu),便于對(duì)數(shù)據(jù)進(jìn)行觀察和修改,數(shù)據(jù)處理模塊和通信模塊完成數(shù)據(jù)的發(fā)送工作等等。上位機(jī)系統(tǒng)的構(gòu)成見圖2 所示。

圖2 上位機(jī)主要模塊
交互模塊主要處理用戶點(diǎn)擊按鈕的操作,修改數(shù)據(jù)或者展示提示消息,分散于其他各個(gè)模塊中,將其他各個(gè)模塊聯(lián)系再一起,這里就不再詳細(xì)介紹。
下面,將對(duì)其他幾個(gè)模塊進(jìn)行介紹。
該模塊是整個(gè)上位機(jī)的核心模塊,所有的數(shù)據(jù)處理工作均由這個(gè)模塊進(jìn)行處理。QT 本身就提供了對(duì)各種數(shù)據(jù)模型的支持,例如QAbstractItemModel,QAbstractListModel,QabstractTableModel 等,但是這些都不能完全滿足我們的需求,因此選擇繼承QabstractTableModel 并根據(jù)實(shí)際需求添加一些自定義功能。
在該數(shù)據(jù)模型中,數(shù)據(jù)保存在一個(gè)嵌套的向量數(shù)組QVector
這個(gè)數(shù)據(jù)模型有三行N 列,每一列分別代表的是脈沖的起始時(shí)刻,持續(xù)時(shí)間,終止時(shí)刻。
除此之外,還給該數(shù)據(jù)模型添加了批量添加和刪除的接口,方便操作人員對(duì)實(shí)驗(yàn)數(shù)據(jù)進(jìn)行修改,節(jié)省時(shí)間。
為了保證輸出電平脈沖的正確性,給系統(tǒng)添加了糾錯(cuò)機(jī)制。在使用批量添加數(shù)據(jù)或者在表格中直接對(duì)數(shù)據(jù)進(jìn)行修改之后,會(huì)對(duì)判斷新的數(shù)據(jù)是否符合輸出邏輯:這些數(shù)據(jù)反映在波形圖上就是一個(gè)個(gè)方波,當(dāng)檢測(cè)到方波之間有重合或者順序錯(cuò)亂,此次修改將不會(huì)生效,并且彈出對(duì)話框提示操作者數(shù)據(jù)修改失敗。
視圖模塊包括數(shù)據(jù)表格和數(shù)據(jù)波形圖。他們分別將數(shù)據(jù)模型中的數(shù)據(jù)以表格和波形圖的形式展現(xiàn)給操作人員。在UI界面上放置一個(gè)QtableView 表格對(duì)象和一個(gè)QcustomPlot對(duì)象。他們分別調(diào)用setModel(QAbstractItemModel *model)和QCPGraph::setData(const QVector

圖3 表格和波形圖
為了方便管理數(shù)據(jù),還在給表格添加了右鍵菜單,直接點(diǎn)擊目標(biāo)需求的選項(xiàng),之后在彈出的對(duì)話框中輸入?yún)?shù),即可完成對(duì)數(shù)據(jù)的修改工作。
上位機(jī)與下位機(jī)之間的通信和數(shù)據(jù)收發(fā)就是通過這一模塊完成的,其通信協(xié)議為TCP 和UDP。由于下位機(jī)有兩塊控制板,所以創(chuàng)建了兩個(gè)用于通信的套接字。QT 自帶QTcpSokcet 和QUDPSocket 庫,使用起來十分方便。上位機(jī)作為客戶端,下位機(jī)作為服務(wù)器,客戶端與服務(wù)器的通信關(guān)系如圖4 所示

圖4 通信關(guān)系圖
創(chuàng)建套接字之后,信號(hào)和數(shù)據(jù)的收發(fā)主要通過以下函數(shù)完成,首先將要發(fā)送的數(shù)據(jù)寫到結(jié)構(gòu)體中,結(jié)構(gòu)體可以按實(shí)際需求來設(shè)置數(shù)據(jù)類型,然后調(diào)用函數(shù)write(const char*data,qint64 len)將數(shù)據(jù)發(fā)送給下位機(jī)。數(shù)據(jù)接受則主要通過read(char* data,qint64 maxlen)來接受數(shù)據(jù)。發(fā)送過程如圖5 所示。

圖5 數(shù)據(jù)發(fā)送過程
為了保證通信連接的時(shí)效性和穩(wěn)定性,還給系統(tǒng)添加了心跳包機(jī)制,上位機(jī)每隔一秒會(huì)給下位機(jī)發(fā)送一次心跳包,下位機(jī)收到心跳包之后將固定內(nèi)容的信息回復(fù)給上位機(jī),完成一次通信狀態(tài)查詢。當(dāng)超過十秒未收到來自下位機(jī)的回復(fù)之后,系統(tǒng)會(huì)自動(dòng)再次斷開與下位機(jī)的通信并嘗試重連,若連接失敗,將會(huì)以對(duì)話框的形式告知使用者。
由于需要使用該系統(tǒng)進(jìn)行多次實(shí)驗(yàn),因此將實(shí)驗(yàn)數(shù)據(jù)保存到本地,以便后期校驗(yàn)和研究。這部分工作主要由QT 的QAxObject 庫完成,新建一個(gè)QAxObject 對(duì)象excel,然后調(diào)用setControl(“Excel.APPlication”) 函數(shù)來建立起與Excel 的聯(lián)系,之后再對(duì)數(shù)據(jù)保存的方式進(jìn)行設(shè)置,設(shè)置好之后最后再調(diào)用函數(shù)dynamicCall()完成保存。可以將現(xiàn)在各個(gè)通道的數(shù)據(jù)以Excel 表格的形式保存到電腦上,同時(shí)也可以在軟件運(yùn)行過程中讀取之前保存的Excel 表格的數(shù)據(jù)并填入到對(duì)應(yīng)的通道中。
在上位機(jī)中,數(shù)據(jù)是以數(shù)據(jù)模型的方式保存并展示的,在和下位機(jī)對(duì)接傳輸數(shù)據(jù)的時(shí)候就存在一個(gè)問題:八個(gè)通道的數(shù)據(jù)以什么樣的形式發(fā)送給下位機(jī)?在數(shù)據(jù)量太大的情況下,如何高效準(zhǔn)確的發(fā)送?
由于電平信號(hào)是以高低電平的方波形式輸出,可以將高電平視為1,低電平視為0。因此可以用二進(jìn)制數(shù)來表示八個(gè)通道的狀態(tài),八位二進(jìn)制數(shù)正好可以轉(zhuǎn)化為一個(gè)十六進(jìn)制數(shù)。以圖6 所示。

圖6 通道狀態(tài)轉(zhuǎn)化圖
有了這樣的轉(zhuǎn)化方法,就可以將任意時(shí)刻的通道狀態(tài)以一個(gè)16 進(jìn)制方式發(fā)送給下位機(jī),下位機(jī)再將這個(gè)十六進(jìn)制數(shù)解析為二進(jìn)制數(shù),即可得到每個(gè)通道的放電狀態(tài)。
除了要知道每個(gè)通道在任意時(shí)刻的狀態(tài),還需要知道這個(gè)狀態(tài)的持續(xù)時(shí)間,因此上位機(jī)除了給要發(fā)送這個(gè)16 進(jìn)制數(shù),還需要發(fā)送一個(gè)int 類型數(shù)據(jù),表示當(dāng)前通道的狀態(tài)持續(xù)多少秒,再轉(zhuǎn)化為下一個(gè)放電狀態(tài),一個(gè)完整的數(shù)據(jù)包被封裝為一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體內(nèi)容如下:

由于整個(gè)系統(tǒng)涉及到大量數(shù)據(jù)的傳輸,上位機(jī)下位機(jī)之間的實(shí)時(shí)通信,大量數(shù)據(jù)的處理,信號(hào)處理等功能,這就需要有一款合適的硬件設(shè)備來滿足這些需求,而STM32 恰好具備這些條件,具有高性能,高實(shí)時(shí)性,集成度高,易于開發(fā)的特性,因此選擇STM32 作為下位機(jī)硬件支撐。
下位機(jī)由兩塊STM32 微處理器構(gòu)成,其中一塊用于和接受處理上位機(jī)發(fā)送過來的數(shù)據(jù)(主控芯片),并將其保存在SARM 中等待觸發(fā)命令,觸發(fā)命令分為兩種,一種是來自上位機(jī)的輸出命令,另一種是手動(dòng)點(diǎn)擊下位機(jī)上的輸出按鈕,收到輸出命令之后,將保存在下位機(jī)中的數(shù)據(jù)輸出給終端設(shè)備。另一塊主要負(fù)責(zé)通信(從控芯片),當(dāng)接收到上位機(jī)發(fā)送的心跳包之后,發(fā)送信息到主控芯片,查詢主控芯片的狀態(tài),主控芯片的狀態(tài)即為下位機(jī)控制器的狀態(tài),主控芯片在接收到從控芯片的請(qǐng)求之后,會(huì)將當(dāng)前的狀態(tài)發(fā)送給從控芯片,再由從控芯片發(fā)送給上位機(jī),做到實(shí)時(shí)反饋當(dāng)前下位機(jī)的狀態(tài)信息。
下位機(jī)嵌入式系統(tǒng)主要由兩塊STM32 控制板構(gòu)成,主要完成數(shù)據(jù)接受,數(shù)據(jù)處理,輸出輸出,信息反饋,命令接受等工作。下位機(jī)主控芯片,由3 塊STM32 組成,實(shí)現(xiàn)下位機(jī)接收、發(fā)送以及控制等功能,如圖7 所示。

圖7 主控芯片圖
主控芯片供電以及通信接口電路圖如圖8 所示。

圖8 供電以及通信接口電路圖
這部分主要是給下位機(jī)供電,以及和上位機(jī)通信。
下位機(jī)主要由以下兩個(gè)功能模塊組成:數(shù)據(jù)傳輸模塊,命令通信模塊。下面將仔細(xì)介紹這些模塊完成的工作和實(shí)現(xiàn)方法。
3.2.1 數(shù)據(jù)傳輸模塊
數(shù)據(jù)傳輸模塊主要用于從上位機(jī)接受數(shù)據(jù)和將數(shù)據(jù)輸出到終端設(shè)備中。控制板有兩個(gè)DMA,每個(gè)DMA 有8 個(gè)數(shù)據(jù)流,每個(gè)數(shù)據(jù)流有多達(dá)8 個(gè)通道。用于在外設(shè)與存儲(chǔ)器之間以及存儲(chǔ)器和存儲(chǔ)器之間提供一種高速數(shù)據(jù)傳輸方式。它在實(shí)現(xiàn)高速數(shù)據(jù)移動(dòng)過程中無需任何CPU 的操作控制,從硬件層次來說,DMA 控制器是可以快速移動(dòng)于Cortex-M4 內(nèi)核的,通過硬件方式為RAM 與I/O 設(shè)備提供一條直接傳送數(shù)據(jù)的通道。
當(dāng)上位機(jī)的數(shù)據(jù)發(fā)送過來的時(shí)候,下位機(jī)便開始接受數(shù)據(jù),每一次接收到的數(shù)據(jù)分為兩個(gè)部分,第一個(gè)部分表示的是狀態(tài),將這個(gè)數(shù)據(jù)解析為一個(gè)16 進(jìn)制的數(shù),這個(gè)16 進(jìn)制的數(shù)就代表著當(dāng)前8 個(gè)通道的電平狀態(tài)。第二部分是一個(gè)整數(shù),無需額外解析,這個(gè)數(shù)就代表這個(gè)狀態(tài)的持續(xù)時(shí)間。通過收取多組數(shù)據(jù),即可得到一系列脈沖波形的相關(guān)數(shù)據(jù),然后將數(shù)據(jù)保存在外部的SRAM 中,存儲(chǔ)大小可以根據(jù)具體的需求來設(shè)計(jì)。
此外,數(shù)據(jù)傳輸采用兩塊STM32F407ZGT6 單片機(jī)作為控制器的微處理器,實(shí)現(xiàn)兩種輸出模式切換功能,一種是由上位機(jī)觸發(fā)脈沖方波,一種是通過外部輸入的兩路高低電平信號(hào)來觸發(fā)脈沖方波。當(dāng)接收到輸出命令之后,主控芯片便將之前接受到的數(shù)據(jù)以高低電平的形式發(fā)送到終端設(shè)備商,可以同時(shí)輸出8 路脈沖方波,能夠輸出持續(xù)時(shí)間長(zhǎng)的脈沖波形,做到輸出波形誤差小,實(shí)時(shí)性高,數(shù)據(jù)傳輸模塊的流程圖如圖9 所示。

圖9 數(shù)據(jù)傳輸模塊流程圖
3.2.2 命令通信模塊
通信模塊采用LWIP 協(xié)議,在保持TCP 協(xié)議的主要功能基礎(chǔ)上減少對(duì)RAM 的占用,它只需要十幾KB 的RAM 和40K 左右的ROM 即可運(yùn)行,非常適合在嵌入式系統(tǒng)中使用。LWIP 協(xié)議提供了專門的內(nèi)部回調(diào)函數(shù)接口(Raw API),用于提高程序性能,還提供包括阻塞機(jī)制,RTT 估算,快速恢復(fù)和快速轉(zhuǎn)發(fā)的傳輸控制協(xié)議,保證命令和數(shù)據(jù)的傳輸效率和準(zhǔn)確度。
將控制器作為服務(wù)端,上位機(jī)作為客戶端,通過上位機(jī)來建立連接,用一塊STM32F407ZGT6 單片機(jī)負(fù)責(zé)存儲(chǔ)脈沖方波的數(shù)據(jù)并輸出脈沖波形(做主控芯片),另一塊負(fù)責(zé)切換控制器的觸發(fā)模式,并設(shè)計(jì)了心跳機(jī)制,上位機(jī)會(huì)定期發(fā)送信號(hào)到另一塊STM32F407ZGT6 單片機(jī)控制板(從控芯片)查詢主控芯片控制板的狀態(tài),主控芯片通過8 路I/O 將其狀態(tài)發(fā)送給從控芯片,主控芯片的狀態(tài)即為控制器的運(yùn)行狀態(tài),然后再通過LWIP 協(xié)議將信息返回給上位機(jī),并在上位機(jī)的狀態(tài)欄中以文本的形式顯示當(dāng)前運(yùn)行狀態(tài)。
命令通信模塊的流程圖和硬件實(shí)物圖分別如圖10 和圖11 所示。

圖10 通信模塊流程圖

圖11 實(shí)物圖
在上位機(jī)上設(shè)置好對(duì)應(yīng)通道的輸出波形參數(shù),包括起始時(shí)刻,高電平持續(xù)時(shí)間,周期以及脈沖數(shù)量,主要測(cè)試了各個(gè)通道的其起始時(shí)刻是否準(zhǔn)確,測(cè)試了下位機(jī)相應(yīng)通道的輸出波形高電平持續(xù)時(shí)間,驗(yàn)證了使能信號(hào)對(duì)輸出波形的截?cái)喙δ堋?/p>
若無特殊說明,圖12 中的4 條線分別表示:1 號(hào)標(biāo)簽(黃色線)為使能信號(hào);2 號(hào)標(biāo)簽(淺藍(lán)色線)為使能信號(hào);3 號(hào)標(biāo)簽(紅色線)和4 號(hào)標(biāo)簽(深藍(lán)色線)為通道信號(hào)。

圖12 測(cè)試說明圖
①每一個(gè)小方格代表的時(shí)間;
②如圖中示波器紅色豎線距離觸發(fā)信號(hào)跳變?yōu)楦唠娖降臅r(shí)間間隔;
③光標(biāo)A 對(duì)應(yīng)的時(shí)間刻度;
④光標(biāo)B 對(duì)應(yīng)的時(shí)間刻度;
⑤光標(biāo)A、B 之間的時(shí)間間隔。
由于示波器通道限制,每個(gè)示波器只能顯示兩個(gè)通道的脈沖電平的波形,因此取通道一和通道二來展示測(cè)試結(jié)果。
實(shí)驗(yàn)一:通道一和通道二設(shè)置的數(shù)據(jù)如表1 所示。

表1 第一組測(cè)試數(shù)據(jù)
測(cè)試結(jié)果如圖13 和圖14 所示。

圖13 實(shí)驗(yàn)1 中通道1(紅色)、通道2(深藍(lán))的起始時(shí)刻

圖14 實(shí)驗(yàn)1 中通道1(紅)、通道2(深藍(lán))最后一個(gè)起始時(shí)刻
從示波器測(cè)試結(jié)果可以看出通道1、2 的起始時(shí)刻分別為0.206ms、0.306ms,高電平持續(xù)時(shí)間為0.1ms,實(shí)際輸出的波形時(shí)刻相對(duì)于設(shè)置的時(shí)刻誤差為6。最后一個(gè)上升沿時(shí)刻如圖所示,通道1、2 的第五個(gè)上升沿時(shí)刻分別為4.205ms,4.305ms,誤差為5。
實(shí)驗(yàn)二:通道一和通道二設(shè)置的數(shù)據(jù)如表2 所示。

表2 第二組測(cè)試數(shù)據(jù)
測(cè)試結(jié)果如圖15 和圖16 所示。

圖15 實(shí)驗(yàn)2 中通道1(紅)、通道2(深藍(lán))的起始時(shí)刻

圖16 實(shí)驗(yàn)2 中通道1(紅)、通道2(深藍(lán))最后一個(gè)起始時(shí)刻
從示波器測(cè)試結(jié)果可以看出通道1、通道2 的起始時(shí)刻分別為10.006ms、10.106ms,誤差為66;高電平持續(xù)時(shí)間均為0.5ms。最后一個(gè)上升沿時(shí)刻如圖4-5 所示,通道1、通道2的第五個(gè)上升沿時(shí)刻分別為50.005ms、50.105ms,誤差為5。
本文介紹了一套由QT 編輯的上位機(jī)軟件和STM32 微處理器構(gòu)成的可支持多通道的脈沖電平輸出時(shí)序控制系統(tǒng)。由于該系統(tǒng)輸出電平信號(hào)的方式是先將預(yù)先設(shè)置好的數(shù)據(jù)發(fā)送至下位機(jī),等待下位機(jī)接受完所有數(shù)據(jù)之后,等待觸發(fā)信號(hào),接收到觸發(fā)信號(hào)之后才會(huì)開始按預(yù)先的設(shè)置輸出電平信號(hào)。避免了實(shí)時(shí)輸出方式(一邊從上位機(jī)接受數(shù)據(jù)一邊輸出電平信號(hào))會(huì)因?yàn)樯衔粰C(jī)發(fā)送或者下位機(jī)接受數(shù)據(jù)受網(wǎng)絡(luò)波動(dòng)的延遲而影響輸出精度。經(jīng)過測(cè)試,系統(tǒng)輸出延時(shí)誤差已經(jīng)降低至5 左右,大大提升了電平脈沖信號(hào)的精度。