龍吉
摘 要:STM32微控制器是ST公司面向嵌入式應用領域開發的微控制器,它具有很高的性價比,由于內核不同,它的產品種類也不同,本文主要針對STM32F4x系列,利用ST公司的DSP函數庫實現在STM32上運行有限單位沖激響應濾波器(FIR)的設計方法,實踐表明,STM32F407在開啟浮點運算后可以流暢運行FIR,滿足微處理器對傳感器信號進行濾波的要求。
關鍵詞:STM32微控器;FIR濾波器;設計
0 引言
在小型的嵌入式應用系統當中,微控制器的主要作用不僅是協調、控制各個外圍電路工作,有些系統還需要微控制器運算一些算法,簡單而有效的算法或者數字濾波器可以替代純硬件電路,具有硬件電路少、成本低、故障率低的優點,但是有些算法規模和復雜程度較大,一般的微控制器如8位、16位微控制器偏重于實時控制、寄存器較多,浮點運算能力很弱運行起來就顯得特別吃力,而現階段ST公司推出的STM32微控制器性能較為強勁,在保證實時性的情況下,也可以運行一些大型的數字濾波器和算法。
1 STM32F407微控制器
STM32F407是一種基于ARM cortex-M4內核的高性能微處理器,它是STM32F4系列的中高端產品,具備168MHz主頻下達到210DMIPS的性能,內置1MB閃存和192KB的SRAM。其內部資源比較豐富,具有2個USB2.0的OTG,3個快速轉換的12位ADC,相比上一代ARM cortex-M3內核產品,STM32F407微控制器集成了單周期的DSP指令集和浮點運算單元FPU,大大提高了微控制器在浮點運算的計算能力,配合ST公司專為STM32微控制器開發的庫函數,可以運行大型數學運算,提升了微控制器的執行效率和運行速度,節約項目開發成本和開發時間。
2 FIR濾波器
在嵌入式應用領域中,微控制器不僅僅需要對傳感器信號進行采集然后送入A/D轉換器進行處理,還要針對處理結果控制外圍設備。在這個過程中,對于傳感器信號進行采集、濾波處理一般由外圍電路組成,如常用的巴特沃斯濾波器、切比雪夫濾波器等,把經過濾波處理過的信號送入A/D轉換器,可以獲得準確度較高的數據。而在實際應用中,某些外界因素對傳感器的影響會使檢測的模擬信號受到干擾,而這些干擾信號是可以利用數字濾波器濾除的,目前應用比較多的數字濾波器是無限沖激響應濾波器(IIR)和有限沖激響應濾波器(FIR)兩種,IIR濾波器具有輸入反饋,所以其輸出值不僅要取決于當前輸入值,還要取決于過去的輸出值,那么理論上,這種濾波器的沖激響應是無限持續的,有不容易被設計的缺點。而FIR濾波器不具有輸入反饋,即輸出值只取決于當前和過去的輸入值,容易被設計,但是同樣功能的FIR濾波器相比IIR濾波器要復雜很多,系數更多,給原本就負擔較重和實時性要求較高的微控制器增加致命的計算量,使系統的實時性降低。所以一些采用數字濾波器的系統,都會將計算數字濾波器的工作量交給其他微處理器運行,如DSP或者FPGA,所以,本文主要提出一種采用STM32F407微控制器運行FIR濾波器的設計方案,在運行一定量的采樣率和階數的FIR下保證系統實時性,滿足控制系統的要求。
3 庫函數中的FIR濾波器設計方法
要在STM32F407上利用DSP庫運行FIR,首先需要利用Matlab的工具箱FDATOOL設計FIR濾波器,然后生成濾波器所需的系數,為了增強其運算性能,還需要在程序中添加開啟FPU的命令。
本設計利用Matlab設計一個帶阻濾波器,所濾波信號由10Hz和100Hz信號組成,截止頻率50Hz,采樣率為1000Hz。為了更好的檢測信號,防止能量泄露,FIR選擇窗函數、hamming窗減少旁瓣,由于DSP庫中的FIR濾波器系數必須是4的倍數,所以選擇200階。設計好FIR濾波器后生成系數,保存為數組形式或者頭文件形式等待移植。
DSP庫中的FIR函數支持Q7、Q15、Q31和浮點四種數據類型,需要用到arm_fir_f32()函數,這個函數可以在DSP_Lib\Source\FilteringFunctions文件夾中的arm_fir_32.c找到,在使用函數前需要對該函數中的參數定義有所了解。
階數越高,系數越復雜,STM32F407的運算時間越長。一般來講,開啟FPU后的STM32F407運行200階左右的FIR濾波器運算時間為毫秒級,是可以保證實時性的。
4 ?開啟FPU的方法
早期的STM32F4xx固件庫中的system_stm32f4xx.c文件默認禁用FPU的,即在CMSIS中沒有定義FPU,雖然文件中添加了FPU相關代碼,但是利用MDK編譯器執行過程中會產生錯誤,為保證系統準確運行,可以在system_init()函數中添加條件編譯代碼或者直接使用FPU即可。如:
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
#endif
或者:
#define __FPU_USED ? ? ? 1
兩種方法不同,但是都需要對各個相關文件進行設置,只需根據相應的#define命令查找定義即可設置,這里不再贅述。
需要注意的是,啟用FPU不代表微控制器處理復雜運算就大大的提升效率了,這里還需要對ARM處理器的math.h頭文件進行替換,因為math.h頭文件中的運算函數都是基于定點處理器和IEEE-754標準來運行的,想要提升微控制器的運算性能,還需要STM32固件庫中的優化函數來解決,即包含arm_math.h頭文件即可。以上兩個設置都需要在工程選項中的C/C++加入define命令:
__FPU_PRESENT=1,__FPU_USED =1
ARM_MATH_CM4
5 結論
通過Matlab運行FDATOOL工具箱來設計FIR濾波器,可以
節省很大一部分時間,對于STM32F407開啟FPU后運行FIR濾
波器能夠在保證精度的情況下具有很好的實時性,在工業控制當中很實用,特別在小型的嵌入式應用系統開發應用中更具競爭實力。