上节课我们在STM32F103C8T6上实现了频率计的功能,我们在上次的基础上进行下一步的操作。
首先,关于数字滤波器分为FIR和IIR两种(如果不明白,需要去查阅资料),在这里我们关心我们怎么得到我们想要滤波器的参数。
我们打开matlab。
在命令行窗口中输入filterDesigner。
我现在想设计一个IIR的低通滤波器,他的截止频率是10Hz,巴特沃斯型,这里的采样频率需要根据我们之前上课的时候设计的ADC的采样频率一致(250Hz)
这个滤波器设计器有很多的功能,这个留给大家探索。
依次点击目标->生成c头文件
直接点击生成,(记住自己保存在哪里了),然后我们找到我们保存STM32CubeMX生成的.ioc文件,接下来把刚刚生成的文件保存在如图所示的文件中。
我们用记事本打开fdacoefs.h文件,他会告诉我们还需要添加一个.h文件
我们找到这个文件,也复 制到这个文件夹下。
到这里基本的参数有关的生成以及,文件的移动已经完成了。接下来我们开始代码的操作。
在main.c中包含刚刚我们添加的这两个文件。然后编译这个工程。
右键这个fdacoefs.h文件。打开它
我们把里面的4个数组都剪切到mian.c中。
我们先定义两个结构体,用来记录我们的滤波器的参数。
其中,Biquad是各个节(这个数字滤波器的知识)中的参数,IIRFilter是整个滤波器的结构体,然后我们在代码合适的地方写下这两个函数。
IIRFilter_Init是对滤波器的初始化,就是把我们刚刚生成的参数填入我们定义的滤波器,
IIRFilter_Process是有数据来的时候,对数据进行滤波。
先定义一个iir滤波器并对其进行初始化。
我们把ADC采集到的电压通过滤波器滤波,我们来看看效果吧!
我左边给的是5Hz的信号,右边给的是15Hz的信号,都是100mVpp,由于低通滤波的截至频率是10Hz,因此5Hz的信号通过了滤波器,而15Hz的信号被滤波器衰减。
By the way,整个代码对初学者来说可能不是这么好理解,这是对你们的一个挑战也是机遇