介绍一阶低通滤波器的软硬件实现

电子说

1.2w人已加入

描述

数字电源软件中经常会用到低通滤波函数,如对AD采样数据或对上传监控数据的滤波等,那么本文首先介绍一阶低通滤波器的软硬件实现,最后给出dsPIC33C系列MCU 低通滤波器的代码实现给大家作为参考。

1. 模拟滤波器

MCU芯片

import numpy as np
C = 220e-12
fc = 1000
R=1/(2np.piC*fc)
print("R =", R)

MCU芯片

MCU芯片

图 2 - RC低通滤波器Bode图

获得上面Bode图的Python代码如下:

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl

s = ctrl.tf('s')

C = 220e-12
R = 750e3
fc = 1e3

Hp = 1/(1+(R*C)*s)

f = np.logspace(-1, 6, 1000)
w = 2 * np.pi * f

mag,phase,omega=ctrl.bode_plot(Hp,w,dB=True,Hz=True,deg=True,Plot=True,label='Hp')

plt.legend()
plt.show()

pole=ctrl.pole(Hp)

print("pole =", pole/(2*np.pi), "Hz")

2. 数字滤波器

MCU芯片

获得上面Bode图的Python代码如下:

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl

############ continuous s transfer function. ############
s = ctrl.tf('s')

fc = 1e3    # low pass filter cut-off frequency is 1kHz

t = 1/(2*np.pi*fc)

Hp = 1/(1+t*s)

f = np.logspace(-1, 6, 1000)
w = 2 * np.pi * f

mag,phase,omega=ctrl.bode_plot(Hp,w,dB=True,Hz=True,deg=True,Plot=True, grid=True, label='Hp')

pole=ctrl.pole(Hp)

print("pole =", pole/(2*np.pi), "Hz")

############ discrete z transfer function. ############
z = ctrl.tf('z')

fs = 100e3    # sample frequency is 100kHz, fc is still 1kHz
Ts = 1/fs

Hpd = (1+z**(-1))/((Ts+2*t)/Ts - (2*t-Ts)/Ts*z**(-1))
print(Hpd)
Hpd.dt = Ts

mag,phase,omega=ctrl.bode_plot(Hpd,w,dB=True,Hz=True,deg=True,Plot=True, grid=True, label='Hpd')

plt.legend()
plt.show()

公式(2)进一步转化为软件可实现的差分方程见公式(3)。

MCU芯片

求得上面系数的Python代码如下:

import numpy as np

fc = 1e3      # low pass filter cut-off frequency is 1kHz
fs = 100e3    # sample frequency is 100kHz
Ts = 1/fs

t = 1/(2*np.pi*fc)

Kxn = Ts/(Ts+2*t)
Kyn = (2*t-Ts)/(Ts+2*t)

print("Kxn =", Kxn, "Kyn=", Kyn)

由一阶低通滤波器的离散化差分方程 - 公式(3),可进行软件编码实现该滤波函数,dsPIC33C系列MCU的低通滤波函数参考代码如下。

#include "libq.h" 

typedef struct{
 /* Parameters */
 int16_t Kxn;
 int16_t Kyn;
 int16_t xn;
 int16_t yn;
}LPF_Obj;

int16_t LPF(int16_t x, LPF_Obj *L_obj)
{
 int16_t y;

    //y = Kxn * x + Kxn * xn + Kyn * yn
    //yn = y;
    //xn = x;
 y = _Q15add(_Q15add(__builtin_mulss(L_obj- >Kxn,x) > >15, __builtin_mulss(L_obj- >Kxn,L_obj- >xn) > >15), __builtin_mulss(L_obj- >Kyn,L_obj- >yn) > >15);
 L_obj- >yn = y;
 L_obj- >xn = x;
    
 return y;
}

为了调用定点Q格式数学函数,需要包含头文件libq.h,因此linker需要包含相应的库,生成连接属性-lq或-lq-dsp。操作如下图所示。

MCU芯片

图 4 - 链接属性设置

最后若一阶低通滤波函数不能满足要求可以两个该一阶低通滤波器进行级联获得二阶滤波器的效果。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分