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

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

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

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

圖4 通信關系圖
創建套接字之后,信號和數據的收發主要通過以下函數完成,首先將要發送的數據寫到結構體中,結構體可以按實際需求來設置數據類型,然后調用函數write(const char*data,qint64 len)將數據發送給下位機。數據接受則主要通過read(char* data,qint64 maxlen)來接受數據。發送過程如圖5 所示。

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

圖6 通道狀態轉化圖
有了這樣的轉化方法,就可以將任意時刻的通道狀態以一個16 進制方式發送給下位機,下位機再將這個十六進制數解析為二進制數,即可得到每個通道的放電狀態。
除了要知道每個通道在任意時刻的狀態,還需要知道這個狀態的持續時間,因此上位機除了給要發送這個16 進制數,還需要發送一個int 類型數據,表示當前通道的狀態持續多少秒,再轉化為下一個放電狀態,一個完整的數據包被封裝為一個結構體,這個結構體內容如下:

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

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

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

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

圖10 通信模塊流程圖

圖11 實物圖
在上位機上設置好對應通道的輸出波形參數,包括起始時刻,高電平持續時間,周期以及脈沖數量,主要測試了各個通道的其起始時刻是否準確,測試了下位機相應通道的輸出波形高電平持續時間,驗證了使能信號對輸出波形的截斷功能。
若無特殊說明,圖12 中的4 條線分別表示:1 號標簽(黃色線)為使能信號;2 號標簽(淺藍色線)為使能信號;3 號標簽(紅色線)和4 號標簽(深藍色線)為通道信號。

圖12 測試說明圖
①每一個小方格代表的時間;
②如圖中示波器紅色豎線距離觸發信號跳變為高電平的時間間隔;
③光標A 對應的時間刻度;
④光標B 對應的時間刻度;
⑤光標A、B 之間的時間間隔。
由于示波器通道限制,每個示波器只能顯示兩個通道的脈沖電平的波形,因此取通道一和通道二來展示測試結果。
實驗一:通道一和通道二設置的數據如表1 所示。

表1 第一組測試數據
測試結果如圖13 和圖14 所示。

圖13 實驗1 中通道1(紅色)、通道2(深藍)的起始時刻

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

表2 第二組測試數據
測試結果如圖15 和圖16 所示。

圖15 實驗2 中通道1(紅)、通道2(深藍)的起始時刻

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