使用AD5933测量电子器件复阻抗

 

■ 前言


下面使用 AD5933阻抗转换器、网络分析仪初步实验 对一些典型的器件测量相关的阻抗。分析测量所对应的工作频率,工作量程等问题。

相关的文献参阅:

 

01基本测量数据


1.电阻测量

使用SWEEP(1)进行扫描。

  • R=304kΩ
    ▲ 电阻300k欧姆时的测量曲线

    ▲ 电阻300k欧姆时的测量曲线

  • R=150k欧姆
    ▲ 电阻150k欧姆测量曲线

    ▲ 电阻150k欧姆测量曲线

  • R=68k欧姆

▲ 电阻68k欧姆测量曲线

▲ 电阻68k欧姆测量曲线

  • R=38k欧姆

▲ 电阻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测量测量曲线

▲ 电容222测量测量曲线

使用SWEEP(6)进行扫描,GAIN=5,可见出现了很大的饱和效应。
▲ 电容222的测量曲线

▲ 电容222的测量曲线

使用SWEEP(3)进行测量:(对应的VPP200mV)
▲ 电容222的测量曲线

▲ 电容222的测量曲线

使用SWEEP(5)进行测量结果:
▲ 电容222的测量曲线

▲ 电容222的测量曲线

使用SWEEP(1)进行扫描:
▲ 电容222的测量曲线

▲ 电容222的测量曲线

SWEEP(2)测量曲线:
▲ 电容222的测量曲线

▲ 电容222的测量曲线

根据比较凌乱的结果,可以看到实际上是由于测量通道的饱和造成了输出结果的失真。其中SWEEP(3),即使用200mV(VPP)进行输出的时候,可以得到相对前期的线性结果。

下面是对电容102进行测量的结果。这相对就比较准确的反映了随着频率增加,测量相应电流线性增加的准确结果了。

此时对应的2000Hz时,容抗大约是79k欧姆。

▲ 电容102的测量曲线

▲ 电容102的测量曲线

根据前面的设置,测量电容对应的数值仍然与前面测量电阻存在着巨大的差别。原因是什么呢?

输入缓冲回路存在着振荡信号!
使用示波器,观察AD5899输出和输入的运放,特别是输入运放中存在着振荡!!!

▲ 缓冲AD8606在振荡

▲ 缓冲AD8606在振荡

至于为什么存在振荡,一个好端端的运放跟随器怎么在电容输入的情况下振荡呢?现在还不知道。

那么将输入中的运放跟随先去掉。重新实验。

4. 去掉输入缓冲对电容继续做实验

实验条件:

  • 电容C= 102
  • 频率扫描范围:50!2050
  • AD5933工作频率:100kHz

▲ SWEEP(3)下的测量结果

▲ SWEEP(3)下的测量结果

▲ SWEEP(1)下的测量结果

▲ SWEEP(1)下的测量结果

▲ SWEEP(5)下的测量结果

▲ SWEEP(5)下的测量结果

▲ SWEEP(7)下的测量结果

▲ 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
#============================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章