使用AD5933测量电子器件复阻抗
■ 前言
下面使用 AD5933阻抗转换器、网络分析仪初步实验 对一些典型的器件测量相关的阻抗。分析测量所对应的工作频率,工作量程等问题。
相关的文献参阅:
01基本测量数据
1.电阻测量
使用SWEEP(1)进行扫描。
-
R=304kΩ
▲ 电阻300k欧姆时的测量曲线
-
R=150k欧姆
▲ 电阻150k欧姆测量曲线
-
R=68k欧姆
▲ 电阻68k欧姆测量曲线
- R=38k欧姆
▲ 电阻38k欧姆测量曲线
由于电阻降了一半,但是幅值到了20000不再增加,说明现在已经饱和了。
2.使用SWEEP(7)进行测量
电阻(kΩ) | 测量值 | R * V |
---|---|---|
304 | 3026 | 919904 |
150 | 6037 | 905550 |
68 | 13431 | 913308 |
51 | 17362 | 885462 |
55.1 | 16409 | 910043 |
39 | 18734 | 730626 |
通过以上分析,可以知道,输出的测量值出现了饱和。对于取值范围0xffff(65535)所能够测量输出的最大值应该是:0x4000(16384),此时对应的应该是56k欧姆。
使用51k和5.1k欧姆串联,形成56.1k欧姆,重新做上述实验,得到的输出结果为16409,R*V的数值为910043。
基本上满足前面的线性关系了。
3.测量电容
下面使用SWEEP(7)测量得到的电容(C=222)的测量数值。 太奇怪了呀!
▲ 电容222测量测量曲线
使用SWEEP(6)进行扫描,GAIN=5,可见出现了很大的饱和效应。
▲ 电容222的测量曲线
使用SWEEP(3)进行测量:(对应的VPP200mV)
▲ 电容222的测量曲线
使用SWEEP(5)进行测量结果:
▲ 电容222的测量曲线
使用SWEEP(1)进行扫描:
▲ 电容222的测量曲线
SWEEP(2)测量曲线:
▲ 电容222的测量曲线
根据比较凌乱的结果,可以看到实际上是由于测量通道的饱和造成了输出结果的失真。其中SWEEP(3),即使用200mV(VPP)进行输出的时候,可以得到相对前期的线性结果。
下面是对电容102进行测量的结果。这相对就比较准确的反映了随着频率增加,测量相应电流线性增加的准确结果了。
此时对应的2000Hz时,容抗大约是79k欧姆。
▲ 电容102的测量曲线
根据前面的设置,测量电容对应的数值仍然与前面测量电阻存在着巨大的差别。原因是什么呢?
输入缓冲回路存在着振荡信号!
使用示波器,观察AD5899输出和输入的运放,特别是输入运放中存在着振荡!!!
▲ 缓冲AD8606在振荡
至于为什么存在振荡,一个好端端的运放跟随器怎么在电容输入的情况下振荡呢?现在还不知道。
那么将输入中的运放跟随先去掉。重新实验。
4. 去掉输入缓冲对电容继续做实验
实验条件:
- 电容C= 102
- 频率扫描范围:50!2050
- AD5933工作频率:100kHz
▲ SWEEP(3)下的测量结果
▲ SWEEP(1)下的测量结果
▲ SWEEP(5)下的测量结果
▲ SWEEP(7)下的测量结果
上面的结果也实在是太奇怪了!
※ 结论(太奇怪了)
上面的实验结果,可以看到:第一部分对于电阻的测量基本上与理论计算结果还是很符合的。对于电容的测量,突然出现了非常奇奇怪怪的事情了。
▲ 实验电路板
对于AD8606输入运放跟随,由于外部的引线引起的震动(这是猜测)。跟随去掉,输出的上述结果仍然无法得到与理论相符结果。这是在令人不可思议。太不可思议了。
现在,我需要回去休息了,时间是23:03分,今天这些奇怪的结果可能是由于太劳累的原因。明天在看看是否可以得到好的解释吧。
-
问题讨论
在第二天,通过实验验证,这个震荡现象是由于AD5933输出的DSS信号中存在着阶梯(0阶保持)在纯电容负载下所产生的尖峰电流所引起的。具体参见博文: AD5933测量容性负载时的神秘振荡信号 。
#!/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
#============================================================
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/106988386
- 点赞
- 收藏
- 关注作者
评论(0)