呂新 張博 劉志堅 王瑞 闞京波
(中車大連機車研究所有限公司 遼寧省大連市 116000)
STM32F4 系列是意法公司基于arm 內核的中端產品,擁有數量較多的通用定時器[1],及DMA 通道。針對捕獲頻率方法,通用定時器擁有豐富的配置方案。
工控系統中,頻率采集是一項基本功能。頻率輸入量一般為PWM 波或者正弦波樣式,通過硬件光耦轉換為高低電平。軟件計算頻率方法根據ST 系統配置模式的不同,會稍有區別。但為了精度要求,都要滿足奈奎斯特采樣定律,在大于10 倍采樣頻率才會有較高的精度[2]。對于一般捕獲模式及計頻方法,通過電平變化時間差,計算頻率;對與PWM 輸入捕獲模式,只需要設置定時器采樣頻率,計數上升沿或者下降沿數量,可計算出頻率,通過DMA模式,不中斷實時系統的任務,很大程度減輕系統的工作量。
配置定時器模式為捕獲模式,捕獲上升、下降沿時間,若捕獲周期過低,則會存在N 次溢出,就需要對可能溢出次數預估,做出判斷。如圖1所示,若定時器周期為T,t1 時刻計數值CNT1,t2 時刻捕獲值為CNT2,兩次捕獲值相減,需要注意,加上溢出次數,否則會丟失頻率。若預分頻設為0,自動重裝值設為T,計算公式為CNT1>CNT2 時,(CNT1-CNT2) * N*T,若CNT1<CNT2 時,計算公式為N*T-CNT2 +CNT1。

圖1:捕獲采樣原理
捕獲采樣面臨的問題是,定時器的周期設置不能過小,否則采樣精度會下降。此時中斷會對系統任務有很大影響,尤其當多通道采集頻率時,實時任務響應不及時的現象時有發生,CPU 占用率高。
計頻模式是利用STM32 自帶的ETR 引腳計算脈沖數,捕獲步驟如圖2所示,設置為向上計數器,分頻一般設置為0 即可,濾波器在這里設置為5 次濾波,設置為外部計數模式2。

圖2:計頻方式時鐘原理圖
可以利用實時系統時間鉤子函數,每隔N 毫秒中斷一次并讀取計數,兩次相減即為N 毫秒的計數值cnt,再算出次數cout = 1000/N,頻率即為cnt * cout。
捕獲模式的問題是,為了采集精度,計數值計算需要頻繁中斷累加計數值,頻率采集和實時系統會互相影響,CPU 占用率高。
DMA 是直接通過外設到內存的處理模式,廣泛應用于高速信號處理相關領域[3],在本方法中主要發生在捕獲采樣階段,通過FIFO 不斷刷新內存緩沖數組中的數據,避免了CPU 被占用過多的資源,PWM 輸入捕獲以定時器1 通道為例,如圖3所示,通過濾波器,設置為5 次,邊沿檢測通過配置設置,一般設置為上升沿,本次利用從控制器的捕獲控制。一般PWM 輸入捕獲有兩個通道,分別為TI1FP1 和TI2FP2,利用其中一個計算頻率,另一個計算占空比。通過定時器DMA 相應通道傳輸數據。捕獲計數為cnt,根據PWM 輸入捕獲的模式方法,與捕獲方法的最大不同為,每一個新周期cnt 重新清零。定時器時鐘周期為F,則頻率為F/cnt。

圖3:PWM 輸入捕獲方法模塊原理圖
PWM 輸入捕獲獲DMA 傳輸方法的問題是,數據DMA 中采集有一定波動,需要利用中值濾波進行濾波。
利用通用定時器配置計數周期,根據引腳外圍定義設置IC 通道,設置相關的IC 捕獲屬性。同時配置NVIC 中斷管理器相關優先級,使能定時器的捕獲中斷配置信息。在中斷中計算兩次上升沿計數差值,在實時系統fi 任務中對頻率量作中值濾波[4]。計算頻率具體核心配置代碼如下:
TIMx_ICInitStructure.TIM_Channex = TIM_Channel_x;
TIMx_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIMx_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIMx_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIMx_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIMx, &TIMx_ICInitStructure);
根據引腳定義,初始化相關引腳為外部捕獲引腳,系統設置定時器參數,預分頻設置為0,周期設置為0xffff,模式為外部時鐘模式2.需根據采樣精度需要設置定時器中斷,本設計中利用系統自帶時間鉤子函數,在鉤子函數中對外部捕獲(時鐘)信息計數,精度精確到1HZ。在實時系統fi 任務中對相鄰的兩次計數值相減,對此值累加1000 次,即為周期數。


PWM 輸入捕獲是一種特殊的捕獲方式,也可以說是一種簡化的捕獲方案。定時器配置方案與捕獲采樣基本相同,只需要多配置一個模式選擇,同時根據圖3配置相應時鐘從模式相應參數,如下代碼所示。重點需要考慮DMA 的相關配置。
(1)DMA 配置基本信息;DMA 通道、DMA 外設基準地址、DMA 內存基準地址、DMA 傳輸方向、DMA 傳輸數組大小、數據格式等;
(2)DMA 模式設置為循環模式、FIFO 模式禁止。
(3)使能DMA。
(4)使能相應定時器DMA 請求。
TIM_PWMIConfig(TIMx, &TIMx_ICInitStructure); // 使能PWM 捕獲模式
TIM_SelectInputTrigger(TIMx, TIM_TS_TI1FP1); //選擇輸入捕獲的觸發信號
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);// PWM 輸入模式時,從模式必須工作在復位模式,當捕獲開始時,計數器CNT 被復位清零;
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);
根據系統的采樣精度要求,系統采樣頻率上限為5000HZ,那么若一個DMA 緩沖區數據長度設置為10,在實時系統fi 任務中周期設置為10ms,讀取一次DMA 的傳輸結果的在一個任務周期中會有50 個周期,若一個fi 任務中周期設置為100ms,讀取一次DMA的傳輸結果的在一個任務周期中會有500 個周期,并在任務中作中值濾波,基本滿足性能要求。
在實時系統中分別建立不同的功能任務,且主要邏輯任務為motor_task,motor_another_task,實時任務在系統運行過程中處于不同的三種狀態[5],在這些任務中調用了fi/fi_detect_task 中的頻率頻率采集值,系統中分別多次調用三種采集方式,為了保證實驗的準確性,剩余部分代碼未變化,計算系統信息參數配置相同。如圖4所示,觀察CPU 剩余堆棧及占用率及變化,可以得到以下結果:

圖4
(1)主要實時主要邏輯任務motor_task 對應上述三種采集方式所剩堆棧數量,可以得到采用中斷捕獲中任務處于阻塞態,剩余堆棧數179;采用計頻方法,任務處于運行態,剩余堆棧數179;采用PWM 輸入捕獲DMA 方式,任務處于運行態,剩余堆棧數187;另一個實時任務motor_another_task,對應上述三種方式,分別為阻塞態,運行態,運行態。所剩堆棧數分別為168,179,187。
(2)主要實時主要邏輯任務motor_task 對應上述三種采集方式運行計數值,可以得到采用中斷捕獲中任務處于阻塞態,任務運行計數為6228;采用計頻方法,任務處于運行態,任務運行計數為3450;采用PWM 輸入捕獲DMA 方式,任務處于運行態,任務運行計數為357;另一個實時任務motor_another_task,對應上述三種方式,分別為阻塞態,運行態,運行態。任務運行計數分別為15276,72941,310。
從上述數據可以看出,使用捕獲采樣中斷方式對CPU 的運行效率影響是最大的,第二是計頻采集方式,對CPU 影響最小的是PWM 輸入捕獲DMA 方法。
使用頻率信號發生器對三種采樣方式在實時系統中測量分析,數據對比表如表1所示。

表1:頻率測量對比
從表1可以看出,基于PWM 輸入捕獲DMA 采樣值在1kHz以內,相比其他兩種方法有更高的精度,當大于1kHz 小于3kHz 時,小于等于1Hz 的誤差,也基本滿足一般條件工況的測量精度要求,當大約3kHz 時,誤差逐步增大,精度下降。
本文提出的PWM 輸入捕獲DMA 方法配合實時系統應用,能夠很大程度的減輕實時系統中對CPU 的資源的占用,提高了系統的實時性響應性,提升了軟件的執行效率;且在一般應用條件下滿足對頻率采集的精度要求。不額外增加頻率采樣器件,減少了額外的硬件成本。