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

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


图 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. 数字滤波器

获得上面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)。

求得上面系数的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。操作如下图所示。

图 4 - 链接属性设置
最后若一阶低通滤波函数不能满足要求可以两个该一阶低通滤波器进行级联获得二阶滤波器的效果。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
低通滤波器
+关注
关注
15文章
595浏览量
49095 -
数字电源
+关注
关注
30文章
586浏览量
110783 -
python
+关注
关注
58文章
4885浏览量
90306 -
MCU芯片
+关注
关注
3文章
260浏览量
13022 -
AD采样芯片
+关注
关注
0文章
3浏览量
2482
发布评论请先 登录
相关推荐
热点推荐
一阶低通滤波器的工作原理、电路结构、设计方法以及应用领域
一阶低通滤波器是一种常见的电子滤波器,用于滤除高于一定频率的信号成分。它具有简单的电路结构和容易实现
一阶有源低通滤波电路与最经典一阶低通滤波器电路图
如滤波电路中含有有源元件,如集成运放等,则称为有源滤波器,一阶有源低通滤波电路是组成二阶、高阶有源低通滤
发表于 07-24 20:03
•18.5w次阅读
一阶低通滤波器_一阶低通滤波器公式_一阶低通滤波器原理
滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,而使其它频率的信号大大衰减即阻止其通过。按其工作频率范围的不同,滤波电路可分为低
发表于 08-16 17:28
•9.6w次阅读
低通滤波器的设计与实现
低通滤波器的设计是已知ow(dB3-截止频率 )、LPH0(直流增益 )、Q(在dB3-截止频率时的电压放大倍数与通带放大倍数数值之比)三个参数来设计电路,可选的电路形式为压控电压源低通滤波器和无限增益多路反馈低通滤波器。下面分
发表于 04-22 09:23
•78次下载
一阶低通滤波器(LPF)学习
导读:电压型磁链观测器由于物理概念清晰、简单易用而备受关注。然而电压型磁链观测器包含一纯积分项,被积项的初始相位与直流偏置都会影响积分结果。所以对传统电压型磁链观测器的改进措施有很多,
一阶低通滤波器的截止频率
一阶低通滤波器是一种常见的电子滤波器,它可以有效地滤除高频信号,只保留低频信号。截止频率是指滤波器开始对信号进行衰减的频率。 在这篇文章中,
介绍一阶低通滤波器的软硬件实现
评论