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