員玉良, 馮 強, 楊麗麗, 王方艷
(青島農業大學機電工程學院,山東青島266109)
目前,多路數據信號參數的采集分析大多采用技術較為成熟的數據采集卡來實現。桑志國等[1]利用虛擬儀器以及數字信號處理等技術設計了多通道數據采集系統,該系統基于LabVIEW上位機軟件,可以測量方波信號的脈寬與頻率等參數,能夠很好地還原信號波形。但是,由于測量頻率范圍的限制,該方法在進行高頻率段的連續周期脈寬測量時,所得測試數據的準確度降低,誤差增大,而且該方法需要上位機的聯機支持,靈活性較差,便攜程度低,不適應于現實環境中的操作與實施。當然,很多具體項目中的數據采集裝置已經開始使用單片機[2-3]作為主控CPU進行數據采集。然而,受限于傳統單片機技術的自身缺陷,數據的采集、處理以及傳輸需要并行處理,CPU執行效率較低,尤其對于較高頻率的連續周期脈寬數據采集時經常出現漏采、漏讀現象,無法保證有效信息的完整性。為此,潘宇等[4]提出用FPGA[5-8]對高頻信號進行分頻,降低輸入信號頻率,利用脈寬測量法測得頻率,但極易造成有效信號丟失,無法測得脈寬數據。而且該方法需要分別對FPGA和單片機[9-10]進行編程,者配合使用才能實現采集要求,程序較為復雜,成本較高。
本文設計了基于直接存儲器訪問(Direct Memory Access,DMA)[11-14]的連續脈寬數據采集裝置,利用STM32F7系列單片機集成的DMA,由外設直接訪問存儲器,加快數據傳輸速率,減少控制器處理數據的時間,提高CPU執行效率,實現較寬頻率范圍內的多通道[15]連續脈寬參數的等精度獲取。
為保證能夠進行較寬頻率范圍內的連續信號采集,減少控制器處理數據的時間,增加數據的采集深度,避免漏采、誤采等現象,采用直接存儲器訪問技術實現外設與存儲器之間的數據快速搬運工作,在無需CPU參與的情況下,后臺快速移動數據。在DMA搬運數據的同時,CPU可執行其他程序,節省出大量時間,極大地提高CPU的執行效率。
DMA基于AHB總線結構,結構原理如圖1所示。集成于片上的定時器、A/D模塊、D/A模塊以及串口等,可借助于DMA直接訪問存儲器。進行連續脈寬測量時,定時器捕獲脈寬長度,并向DMA控制器提出外設請求,DMA控制器收到請求后,向CPU發出總線接管控制請求,CPU會在執行完當前周期的總線任務后,掛起自身總線任務,將總線控制權轉交DMA控制器,返回請求響應,最終建立數據搬運通道,定時器輸入捕獲寄存器暫存的脈寬值就可快速搬運至事先開辟的內存區域存儲,且無需CPU參與。

圖1 結構原理圖
基于DMA的連續脈寬數據采集裝置采用STM32系列單片機定時器的PWM輸入模式進行脈寬測量,其測量時序圖如圖2所示。
在PWM輸入模式下,通過軟件設置輸入映射,即同一路輸入信號,在定時器內部映射到兩個捕獲/比較寄存器上,分別對其邊沿(上升沿與下降沿)進行測量。在輸入引腳的信號發生由0->1的電平正跳變時,內部邊沿檢測器檢測到躍變信號的同時,由觸發捕獲/比較寄存器(TIMx_CCRx)鎖存計數器的當前值。同時,計數器復位,重新開始計數,等待輸入信號發生與前一個信號沿相反極性的跳變。相應地邊沿檢測器觸發第2個捕獲/比較寄存器(TIMx_CCRx),并鎖存下降沿躍變時計數器的值,至此完成兩次沿捕獲。一次輸入捕獲,由定時器生成DMA請求,觸發DMA進行數據搬運,將所測的脈寬時長快速轉移至事先開辟的內存區域進行存儲。

圖2 等精度脈寬測量時序圖
單片機定時器輸入捕獲預分頻系數PSC,定時器時鐘頻率Tclk,則定時器外部時鐘輸入脈沖間隔(或稱計數間隔)為

當發生一次完整的輸入捕獲時,在整個高電平時間內計數個數為N,其脈寬測量時間為

理想狀態下,只要將定時器與分頻系數設置足夠小,即可達到無限精確,定時器的預分頻系數需要在0~65 535之間取整設定。在此,設定預分頻系數PSC為26,那么由式(1)可得知計數間隔為0.125 μs。
根據公式

顯然,在較低頻率下,信號的周期會變長,相應正脈寬的時間也會延長。為滿足低頻條件下較長時間的測量,需要設定重裝值ARR最大。因此,由

即可得出,在定時器未發生溢出前提下所能測得的最大時間Tmax為8 191.875 μs,取整為8.0 ms。進而,由式(3)可算出對應的最低可測頻率為125 Hz。
通常情況誤差僅存在于定時器計數間隔的間隙誤差中,因此定時器的預分頻系數越高,單位時間內的計數頻率越高;高電平時間內的采樣速率越快,采樣數據越準確。此采集裝置所選用主控制器STM32F767系列單片的主晶振時鐘為216 MHz,定時器計數頻率最高可達216 MHz。
為實現對較寬頻率范圍內的連續脈寬進行等精度的高速動態測量,數據采集裝置的主控制器采用了基于ARM Cortex-M7內核的STM32F767ZI單片機,由其完成每個脈沖周期內正脈寬的數據采集、存儲以及顯示輸出等任務。系統軟件采用C語言編寫,可實現多路信號數據同時采集。
數據采集裝置主要由單片機控制實現測量、存儲以及數據的輸出顯示。裝置在上電初始化后,開啟定時器的PWM輸入捕獲功能,即開啟脈寬測量,第1次捕獲到上升沿時,記錄此時的捕獲時間,直至捕獲下降沿,完成一次輸入捕獲。啟動DMA傳輸的同時在屏幕上顯示脈寬數據,傳輸完成后清空寄存器數據,準備再次捕獲脈寬信號。軟件流程圖如圖3所示。

圖3 軟件流程圖
在Cube MX軟件與Keil中編寫并下載單片機程序,輸入信號由函數信號發生器提供。函數信號發生器選擇RIGOL-DG1022U雙通道函數信號發生器,采樣速率最高可達100 MSa/s,能夠同時輸出兩路5 MHz頻率的方波信號。在此,由信號發生器提供0.125、0.500、1、5、10、50、100、250、500 kHz、1 MHz 等跨度為3個數量級的10個示例方波信號,分別由示波器和采集裝置對其每個連續周期的高電平脈寬信號進行采集。
波形顯示由示波器完成。選用RIGOL-DS1074四通道示波器,示波器最大分辨率1 GSa/s,最高可測量70 MHz輸入信號。
(1)精度測試。通過與函數信號發生器的標準輸出量、示波器的示數以及數據采集裝置測得的數據三者進行對比,驗證數據采集裝置的精確度,采集測試現場如圖4所示。
(2)丟數測試。在程序軟件上拓寬內存區的數據存儲深度,加以定時器輔助控制單位時間長短,通過單位時間內(設置為1 s)的數據存儲量驗證數據采集裝置是否發生數據丟失現象。

圖4 裝置測試圖
圖5表明,該數據采集裝置實現了對頻率125 Hz~1 MHz的等精度連續高電平脈寬的測量,測量相對誤差均小于0.05%。高頻率段(5 kHz~1 MHz)時,實現零誤差測量,顯示了良好的準確度與實時性。

圖5 測試數據誤差分析
由圖6可以看出,整個數據測試周期內無丟數現象,解決了傳統的單片機高頻數據采集時易漏采、丟數的技術難題。

圖6 丟數驗證
在STM32F767單片機平臺上使用C語言對單片機進行程序編寫,基于單片機定時器實現對方波連續脈寬數據的等精度測量。利用DMA傳輸技術,減少系統耗時,增強系統即時性,保證數據采集的準確性。該數據采集裝置不僅突破了傳統高頻連續脈寬信號采集存在的諸多技術瓶頸,實現了對多路較寬頻率范圍內連續脈寬信號的高精度測量,而且拓寬了DMA技術的應用場景,具有一定的現實意義。