U3606B 與超級電容器接線方式 |
量測電容器有兩種方法,有直流電與交流電兩大類,由於超級電容器應用領域多在太陽能板直流儲能與放電,所以超級電容器原廠亦採取直流放電測量,把電容器充電至 +2.5 V 並維持 30 分鐘,確保電容器充飽電,然後約以 0.001 C 定電流放電,同時以電壓表監測電容器端電壓 2 V 到 1 V的時間。電容器容量可用下列公式計算而得:
C = I x dt / dV (1 法拉 = 1 安培電流充電或放電 1 秒鐘,而電壓上升或下降 1 伏特)
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
# 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)
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;
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 "+ str(current))
hybrid.write(b"OUTPUT ON")
hybrid.write(b"CURR?")
a = hybrid.read()
i = float(a)
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")
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)
print("CAP =", c)
沒有留言:
張貼留言