论文部分内容阅读
摘 要: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滤
波器能够在保证精度的情况下具有很好的实时性,在工业控制当中很实用,特别在小型的嵌入式应用系统开发应用中更具竞争实力。
关键词: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滤
波器能够在保证精度的情况下具有很好的实时性,在工业控制当中很实用,特别在小型的嵌入式应用系统开发应用中更具竞争实力。