AD5933不同频率下的转换结果
01简介
AD5933阻抗转换模块 是一款基于AD公司的 AD5933 芯片的测量 复阻抗 的电路模块。在 AD5933阻抗转换器、网络分析仪初步实验 中对该模块进行了初步的实验。
由于该芯片的基本原理是采集有芯片内部产生的正弦波电压信号激励下复阻抗相应的正弦电流信号,经由芯片内部的I-V转换,有内部12bit-1Msps的ADC采样1024的数据,通过DFT来获电流的在该频率下信号的实部 R R R和虚部 I I I,最后可以计算出电流的幅度和相位,从而反映了复阻抗 Z ( ω ) Z\left( \omega \right) Z(ω)在不同频率下的取值。
下面是AD5933芯片内部的功能框图。这部分可以想见该芯片的 数据手册。
▲ AD5933内部功能图
在初步试验中,遇到以下问题需要通过实验来回答:
-
AD5933采集数据的频率和时长是多少?
手册给出了AD5933的ADC的转换速率为1Msps。采集到1024点的数据的时间就是1.024ms,这一点也从数据手册中指出数据采集运算的时间大约是1ms左右。这个采集速率和总时间是否不受输出信号频率影响? -
AD5933计算结果是否会受到信号截取的影响?
这是典型的DFT分析信号频谱所带来的问题。当采集分析数据的长度不是周期信号的完整的整数周期的时候,输出的结果会出现 频率泄露 现象的影响。 -
直接使用AD5933可以分析的最低频率是多少?
为了保证DFT所得到的结果足够精确,即需要在1ms的采集时间内采集到足够多的周期的信号,就会限制AD5933能够分析复阻抗的最低频率。那么这个最低频率是多少呢? -
如何继续降低AD5933分析频率的下限?
在一些分析中,如果希望进一步降低,可以通过使用外部的MCLK来实现。这对于测量是否有影响?
下面通过实验逐一回复上面的问题。
02采集数据的时长
在测试程序的串口命令中,增加一个通过STC8G1k定时器(周期为1ms)来记录执行 StartFrequency命令的时间测量。
通过设置AD5933 Settling Period=500,输出频率为5000Hz,执行startf,可以看到返回的测量时间为101ms。其中100ms是输出500个Settling 周期信号所需要的时间,后面1ms则是数据采集和计算所需要的时间。
ad5933.init(500)
ad5933.setsweep(5000, 100, 100)
ad5933.startf(1)
- 1
- 2
- 3
通过设置不同的输出频率,会发现后面的1ms多出的时间始终保持不变,这就证明了AD5933的采集处理信号的时间周期就是1ms,固定的。
由于这个过程中,是通过读取AD5933的Status寄存器中的D1来判断是否数据采集处理完毕,所以更加精确的采集和处理时间的测量也就无法准确的判断了。
03数据截取窗口的影响
分别进行不同频率变化,观察相应的输出结果。
▲ 在没有负载情况下,不同频率下转换的结果
▲ 在没有负载情况下,不同频率下转换的结果
▲ 在没有负载情况下,不同频率下转换的结果
▲ 在没有负载情况下,不同频率下转换的结果
▲ 在没有负载情况下,不同频率下转换的结果
通过以上不同频率下输出的结果可以看出,计算的结果在输出频率低的情况下,会受到截取窗口的影响。下面对于在1000Hz左右的频率前后200Hz内进行扫描,可以看到在频率大约等于 f 0 = 1010.78 H z f_0 = 1010.78Hz f0=1010.78Hz左右时,实部接近于0。
▲ 在没有负载情况下,不同频率下转换的结果
更进一步观察可以看到,当输出频率在2048Hz左右的时候输出的数值为0。这也从另外一个解读到AD5933采集数据的长度大约需要消耗1024us。
▲ 在没有负载情况下,不同频率下转换的结果
下面时对于局部采样结果放大之后显示的情况。
▲ 在没有负载情况下,不同频率下转换的结果
04最低频率为多少?
通过以上分析,输出结果会受到采集数据时间长度的影响。下面显示了输出频率从200Hz变换40200Hz过程中,在阻抗无穷大的情况下AD5933测量的结果。
从图中可以看到,当输出频率大约3k以上,基本上就可以反映出测量电流结果的情况了。
▲ 在负载等于无穷大的时候,不同频率下输出的结果
下面显示了频率从200Hz变化到4000Hz的情况,如果频率在2048H左右,测量得到的电流幅值也基本上接近于0。综合以上分析,可以看到使用AD5933测量复阻抗,实际上可能达到的最频率是2048Hz。
▲ 在没有负载情况下,不同频率下转换的结果
※ 结论
通过实际测量,可以看到AD5933在测量复阻抗的时候,在内部时钟oscf=16.776MHz的驱动下,采集数据的频率大约是1Msps,采集数据的时长为1024us。
由于受到数据长度对DFT的影响,在选取测量复阻抗频率的时候需要:
- 频率尽可能的高,最高大于1024Hz的5倍以上;
- 频率尽可能选择为1024Hz的整数倍数,这是在内部osc=16.776MHz作用下的频率。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2020-06-25
#
# Note:
#============================================================
from headm import *
import ad5933
from tsmodule.tsstm32 import *
#------------------------------------------------------------
printf('\a')
ad5933.init(20)
startf = 200
stepf = 100
numf = 400
#------------------------------------------------------------
ad5933.setsweep(startf, stepf, numf, oscf=16.776)
ad5933.sweep(1)
time.sleep(10)
R,I = stm32memo(2)
f = linspace(startf, startf + stepf * numf, numf + 1, endpoint=True)
A = [sqrt(r**2+i**2) for r,i in zip(R,I)]
plt.plot(f, R, label="Real")
plt.plot(f, I, label="Imaginary")
plt.plot(f, A, label='Amplitude')
plt.xlabel("Frequency(Hz)")
plt.ylabel("Value")
plt.grid(True)
plt.legend(loc="upper right")
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.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
#!/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):
stm32cmd('writeb 81 0')
time.sleep(0.02)
stm32cmd('writeb 80 b1') # Enter standby mode
stm32cmd('writei 8a %x'%settletime)
time.sleep(0.02)
stm32cmd('reada')
time.sleep(0.02)
def temperature():
data = stm32cmdata('readt', wait=200)
if len(data) > 0: return data[0]*0.03
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)
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
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/106969485
- 点赞
- 收藏
- 关注作者
评论(0)