使用AD5933分析复阻抗的时钟频率设置
■ 前言
使用 AD5933分析复数阻抗 时,由于受到内部离散傅里叶变换(DFT)所带来的以下限制:
- 由于采集信号可能带来的频率 频率混叠 现象
- 由于对信号进行截取所带来的频率泄露现象
频率混叠现象决定了分析信号频率的上限,应该低于AD5933采样频率的一半。频率泄露现象决定了分析信号频率的下限,它应该大于AD5933采样数据时长对应频率的3倍(也可以是5倍)以上。下面举例说明频率混叠与频率泄露对于测量结果的影响。
- 1.频率混叠对于测量结果的影响
比如,在AD5933使用外部时钟频率 f e x t = 1 0 6 H z f_{ext} = 10^6 \,\,Hz fext=106Hz时,对应的采样频率为: f s = 59.61 k H z f_s = 59.61\,\,kHz fs=59.61kHz。下图显示了对于固定的电阻 R L = 300 k Ω R_L = 300k\Omega RL=300kΩ测量时,激励频率从10kHz变化到110kHz过程中,输出结果。
理论上,当激励频率大于 0.5 f s 0.5f_s 0.5fs的时候,采集就出现了频率混叠现象。从下面的测量结果可以看,实际上等频率超过了55kHz以上的时候,结果中出现了明显的抖动和噪声。
▲ 信号频率过高对于采集结果的影响
- 2.频率泄露对于测量结果的影响
下面给出了激励信号频率从10Hz变化到410Hz的过程中,在负载 R L = ∞ R_L = \infty RL=∞时,测量的结果。此时AD5933仍然使用外部时钟信号,频率为1MHz,对应的采样频率为59.61kHz。采集完1024个数据,所需要的采集时间:
那么Ts的倒数对应的频率为:58.2Hz,两倍频对应的是116.4Hz。
从下图可以看到,当激励频率大约是116Hz的时候,测量的结果从降低到0。随后又出现了一些波动。所以需要取1/Ts的五倍以上,频率泄露对于测量结果的影响才趋近于0。
▲ 信号频率过低时对应的频率泄露现象对测量结果的影响
下图可以看到,当激励频率为1/Ts的五倍,六倍的时候,测量的结果(在负载等于无穷大的时候,结果应该是0)已经变得比较小了。
▲ 不同激励频率对于负载阻抗为∞时测量的结果
下面通过分析AD5933的工作频率与采集频率之间的关系,进而反过来通过对复阻抗激励信号频率要求,选取合适的AD5933的工作频率。
01工作频率与采集频率之间的关系
AD5933的AD采集频率 f s f_s fs与其工作频率 f o s c f_{osc} fosc有关系,基本上可以通过以下公式来求得:
这个公式可以根据 AD5933 的工作手册上,对于其工作在内部频率16.776MHz,对应采样频率为1Msps来进行计算的。的确,对于AD5933的AD转换所需要的时钟个数,在工作手册中并没有详细的叙述。
AD5933采集数据的周期 T 1 T_1 T1则有一下公式获得:
上面公式中 f o s c f_{osc} fosc的单位是MHz, T 1 T_1 T1的单位就是秒。
根据前面叙述,如果AD5933的工作频率 f o s c f_{osc} fosc确定下来,那么对于复阻抗激励信号的频率应该小于 f s / 2 f_s /2 fs/2,并大于 5 / T 1 5/T_1 5/T1,即:
将上面表达式进行转化,可以变成一下公式。其中 f o s c f_{osc} fosc的单位是MHz, f 0 f_0 f0的单位是Hz。
为了计算方便,可以将上面的公式简化成:
02根据激励信号范围确定工作频率
由于有了以上的分析,可以知道,对于复阻抗分析的时候,在固定的工作频率下,激励信号的频率范围变化不能够超过100倍,即激励信号的最大频率 f max f_{\max } fmax除以最小频率 f min f_{\min } fmin,比值不超过100。这在大多数情况下是满足需求的。
如果当激励信号变化范围超过了100,只能够动态的通过调整工作频率来达到要求。
如果已知所激励信号频率范围: { f min , f max } \left\{ {f_{\min } ,f_{\max } } \right\} {fmin,fmax},而且 f max / f min < 100 f_{\max } /f_{\min } < 100 fmax/fmin<100,那么确定AD5933的工作频率可以通过前面公式(5)来定义,即:
比如,希望激励信号的范围是10~100Hz,即: f min = 10 , f max = 100 f_{\min } = 10,\,\,f_{\max } = 100 fmin=10,fmax=100,根据(6)(7)可以计算出AD5933工作频率 f o s c f_{osc} fosc的上下限为:
即从3.3kHz~33kHz。为了进一步降低频率泄露对于测量结果的影响,所以应该在上述范围内取频率更小的工作频率。比如5kHz。
但是,如果工作频率低,也同样会造成测量时间过长。所以综合起见,选择工作频率fosc为20kHz。此时,测量一个数据大约需要0.85秒。
※ 结论
本文分析了使用AD5933来分析复阻抗时,如何选器最恰当的工作频率,使得测量阻抗是不会因为频率混叠和频率泄露对于结果造成很大的影响。
工作频率范围的选择,除了需要满足公式6,7要求之外,还需要根据测量速度以及测量精度之间做权衡。当工作频率普遍很高的时候,可以尽可能照顾到公式6所给出的下限,这样可以尽可能减少频率频率泄露所带来的影响。当工作频率比较低的时候,则需要适当增加工作频率,以使得测量的时间更短。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# AD5933.PY -- by Dr. ZhuoQing 2020-06-25
#
# Note:
#============================================================
from head import *
from tsmodule.tsstm32 import *
#------------------------------------------------------------
def init(settletime=100, extclock=0):
if extclock > 0:
stm32cmd('writeb 81 8')
else:
stm32cmd('writeb 81 0')
time.sleep(0.02)
stm32cmd('writeb 80 b1') # Enter standby mode
stm32cmd('writei 8a %x'%settletime)
time.sleep(0.02)
def temperature():
data = stm32cmdata('readt', wait=200)
if len(data) > 0:
return data[0] / 32
else: return 0
def setsweep(startf, incf, num=100, oscf=16.557):
startn = int(startf * (2**27) / (oscf*1e6/4))
incn = int(incf * (2**27) / (oscf*1e6/4))
# printff('%x %x %x'%(startn, incn, num))
stm32cmd('writel 82 %x'%startn)
time.sleep(.02)
stm32cmd('writel 85 %x'%incn)
time.sleep(.02)
stm32cmd('writei 88 %x'%num)
time.sleep(.02)
# stm32cmd('writeb 81 0') # D3: 0:Internal system clock 1:External
# time.sleep(.02)
stm32cmd('writeb 80 b1') # Standby
time.sleep(.02)
stm32cmd('writeb 80 11')
time.sleep(.02)
fdim = []
for n in linspace(startn, startn + incn * num, num+1, endpoint=True):
fdim.append(n * oscf * 1e6/4/(2**27))
return fdim
def startf(resultflag = 0):
if resultflag > 0:
stm32cmd('writeb 80 21 1')
else:
stm32cmd('writeb 80 21')
def incf(resultflag = 0):
if resultflag > 0:
stm32cmd('writeb 80 31 1')
else:
stm32cmd('writeb 80 31')
def repeatf(resultflag = 0):
if resultflag > 0:
stm32cmd('writeb 80 41 1')
else:
stm32cmd('writeb 80 41')
def readdata():
return stm32cmdata('readd', wait=100)
def sweep(code=0x1):
stm32cmd('CLEAR')
time.sleep(.02)
stm32cmd('sweep %x'%code)
#------------------------------------------------------------
if __name__ == '__main__':
tdim = []
for i in range(10):
data = temperature()
tdim.append(data)
time.sleep(.1)
printf(tdim)
#------------------------------------------------------------
# END OF FILE : AD5933.PY
#============================================================
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/106987240
- 点赞
- 收藏
- 关注作者
评论(0)