■ 前言
下面使用 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
#============================================================