數(shù)字電源軟件中經(jīng)常會(huì)用到低通濾波函數(shù),如對(duì)AD采樣數(shù)據(jù)或?qū)ι蟼鞅O(jiān)控?cái)?shù)據(jù)的濾波等,那么本文首先介紹一階低通濾波器的軟硬件實(shí)現(xiàn),最后給出dsPIC33C系列MCU 低通濾波器的代碼實(shí)現(xiàn)給大家作為參考。
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. 數(shù)字濾波器
獲得上面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)進(jìn)一步轉(zhuǎn)化為軟件可實(shí)現(xiàn)的差分方程見(jiàn)公式(3)。
求得上面系數(shù)的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),可進(jìn)行軟件編碼實(shí)現(xiàn)該濾波函數(shù),dsPIC33C系列MCU的低通濾波函數(shù)參考代碼如下。
#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;
}
為了調(diào)用定點(diǎn)Q格式數(shù)學(xué)函數(shù),需要包含頭文件libq.h,因此linker需要包含相應(yīng)的庫(kù),生成連接屬性-lq或-lq-dsp。操作如下圖所示。
圖 4 - 鏈接屬性設(shè)置
最后若一階低通濾波函數(shù)不能滿(mǎn)足要求可以?xún)蓚€(gè)該一階低通濾波器進(jìn)行級(jí)聯(lián)獲得二階濾波器的效果。
-
低通濾波器
+關(guān)注
關(guān)注
14文章
471瀏覽量
47287 -
數(shù)字電源
+關(guān)注
關(guān)注
28文章
509瀏覽量
109248 -
python
+關(guān)注
關(guān)注
55文章
4766瀏覽量
84362 -
MCU芯片
+關(guān)注
關(guān)注
3文章
246瀏覽量
11348 -
AD采樣芯片
+關(guān)注
關(guān)注
0文章
3瀏覽量
2251
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論