2016年5月28日 星期六

利用 Keysight U3606B 測量超級電容

http://4rdp.blogspot.com/2016/05/keysight-u3606b.html?m=0

U3606B 與超級電容器接線方式
因為工作需要,需要測量超級電容 (通常指電容器容量超過 1 F 以上) 的電容量,目前市面上能夠測量超級電容的儀表不多而且非常昂貴,需要能供給大電流充電及放電,我只想大約確認元件 OK 不 OK,因此想到辦公桌上的 Keysight U3606B,可以解決問題,不過需要寫個小程式搭配,用 Python 寫這類測試程式很方便,所以分享我的方法。

量測電容器有兩種方法,有直流電與交流電兩大類,由於超級電容器應用領域多在太陽能板直流儲能與放電,所以超級電容器原廠亦採取直流放電測量,把電容器充電至 +2.5 V 並維持 30 分鐘,確保電容器充飽電,然後約以 0.001 C 定電流放電,同時以電壓表監測電容器端電壓 2 V 到 1 V的時間。電容器容量可用下列公式計算而得:
C = I x dt / dV      (1 法拉 = 1 安培電流充電或放電 1 秒鐘,而電壓上升或下降 1 伏特)

也就是,
電容量(F, 法拉) = 電流(A, 安培) x 時間差(sec, 秒) / 電壓差(V, 伏特)
0.001 C 代表以電容量的千分之一充放電電流,可約 1000 秒時間充放電壓 1 伏特變化
例如 4.7 F 電容量,定電流充放電 4.7 mA,可以 1000 sec,產生 1 V變化,為什麼要用這麼小的電流測電容?雖然用大電流可以縮短測量時間,但是想達到顯示數值三位半以上的精度,還是需要用時間來換取,因為一秒鐘就有 0.1 % 誤差
4.7 mA x 1000 sec / 1V = 4.7000 F
4.7 mA x 1001 sec / 1V = 4.7047 F

請注意,我的方法雖然不是原廠所用的標準測試方法,但是數值還蠻相近,由於 U3606B 有直流電流電源輸出及數位電表功能,雖然不具有電子負載的功能 (負電流輸出),不過能利用它直流定電流充電方式測量就足夠了,先將超級電容器放電 0 V至少 30 分鐘,然後以 0.001 C 定電流充電,同時以電壓表監測電容器端電壓 1 V 到 2 V的時間,最後以公式換算電容值。

原理說明完畢,再來就是電腦端的 Python 程式,輸入儀器 VISA 位址或名稱,估計電容量大小,大約等候半小時,就可以獲取超級電容數值,記得要先放電 0 V 至少 30 分鐘以上

# (C) 2016, Bridan, CC BY-SA 3.0 TW
# The program is for super cap measurement
# https://4rdp.blogspot.tw

from __future__ import division, unicode_literals, print_function, absolute_import
import visa
import time
import math

print("VISA list:")
print(visa.get_instruments_list())
addr = input("Input U3606B VISA address: ")
hybrid = visa.Instrument(addr, term_chars=b"\r", timeout=5)
hybrid.write(b"*RST")
time.sleep(3)

cap = input("Input CAP value (F): ")
current = cap / 1000.0;
hybrid.write(b"SOURCE:CURR:RANGE "+ str(current))
hybrid.write(b"CURR "+ str(current))
hybrid.write(b"OUTPUT ON")

hybrid.write(b"CURR?")
a = hybrid.read()
i = float(a)
t = -1
while True:
    hybrid.write(b"SENSE:VOLT?")
    a = hybrid.read()
    v = float(a)
    if (v >= 1):
        t += 1
    if (t == 0):
        v1 = v
        t1 = time.time()
        print(t, ",", v, ",", t1)
    elif (v >= 2):
        v2 = v
        t2 = time.time()
        print(t, ",", v, ",", t2)
        break
    else:
        print(t, ",", v)

hybrid.write(b"OUTPUT OFF")
c = i * (t2-t1) / (v2-v1)
print("CAP =", c)

沒有留言:

張貼留言