使用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
#============================================================

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