手持ちのオシロスコープEDUX1052Gは、20MHzまでであればSIN波を出力できるファンクションゼネレータを搭載している。
以前購入したファンクションゼネレータJDS6600は、60MHzまで出力できるのでそちらを使っていたが、50MHzにピークを持っていたり、10MHzから特性が落ち始めていた。そんなものかと思っていたが、考えてみれば、EDUX1052Gの方が確度が高いんじゃないかと思い始めた。
端からやってみればよかったのだが、今回やってみることにした。RFプローブは、ショットキーを使用したものを使用してみた。
もう一つ今回教訓になったことがあった。
マルチメータだ、WH5000は、自動的に電源が落ちてしまうので、据え置き型のマルチメータを検討し始めていたのでした。
そこで、よく見ていなかったWH5000のマニュアルを再度確認してみたところ、SELECTボタンを押しながら、電源をONするとAutoPowerOffが消えることが分かったのでした。マルチメータのデータ出力は、遅いので、分解能を上げると評価に時間がかかるので、困っていたが、何のことはない、ちゃんと機能があったのだ。
これで、機材には問題なし。
前と同じように、1VrmsのSIN波をEDUX1052Gから出力してRFプローブの出力をWH5000でモニタしてみた。
なんと、1MHzと10MHzの中間地点くらいから出力が上がり始めているという衝撃の事実が判明。JDS6600の場合とは正反対の結果となった。
また、今回100Hzからデータをとってみたが、1kHzから10kHzの中間あたりまでレベルが低くなっている。JDS6600では、低い周波数ではフラットだったのに。
今回の評価は、プログラミングで行っているので、データも細かくとることができるし、何より楽だ。
早速JDS6600のデータも取り込んでみた。
1kHz以下の反応はほぼ同じだった。(気のせい)でも5MHz以上の反応が異なるのがよくわかる。
同じRFプローブを使用しているので、信号発生器の振る舞いが異なっているのだ。こんなときに高い周波数のオシロがあれば一発解決なんだが。
以前の検証で、SG入力で約100MHzまではおおむねフラットだったので、1Vrms入力に対して、2.54V程度のはずだ。
EDUX1052Gの20MHzでの出力は、2.667Vだったので、1.05Vrms出ていた計算になる。
JDS6600での20MHzでの出力は、2.498Vなので、0.98Vrms出ていたことになる。
JDS6600でピークを打っている51MHzでは、2.929Vだったので、1.15Vrms出力されていたことになる。
これで、信号発生器出力も補正することで、ある程度真値が得られそうだ。
SGの確度0.1dBに頼っていることにはなるけれど。
今回の検証で、オシロスコープ、信号発生器、マルチメータの連携ができるようになったので、時短にも役立った。
念のため、2つの信号発生器の波形を、EDUX1052Gで観測してみた。
EDUX1052Gの出力は、1.008Vとほぼちょうどの結果。JDS6600の波形は、940mVと6.8%ほど小さい値に観測された。オシロスコープの周波数帯域が50MHzなので、ガウシャンで周波数帯域が落ちる場合は、その1/3程度で概ね3%程度低下しているはずだ。
こう想定すると、信号発生器の出力は、1.05Vrmsと観測されたので、3%低下して1.02Vrms程度の出力だったのではないかと思われる。
JDS6600の出力は、0.94Vrmsと観測されたが、3%増しの0.97Vrmsだったのではないかと思われる。
2.667V/2.498V=1.0676なので、比率としては、ほぼ一致している。
以下は、今回使用したPython のソフトだ。fdivでDecadeあたりの刻みを設定している。
import serial
import math
import time
import statistics
import csv
ser1= serial.Serial('COM5', baudrate=115200, timeout=3.0)#JDS6600 Setting
cmd=':w20=1,1.\r\n' #CH1,CH2 ON
bcmd=cmd.encode()
ser1.write(bcmd)
a=ser1.readline()
bcmd=a.decode()
print(bcmd)
time.sleep(1)
Gfreq_start=100 #スタート周波数
Gfreq_stop=60000000 #終了周波数
fdiv=100 #Decadeを何分割するかを指定
fstep=Gfreq_start*10/fdiv
Gfreq_current=Gfreq_start
time.sleep(1)
from time import sleep
ser=serial.Serial("COM4",2400)#DMM setting
i=int(math.log10(Gfreq_start))
i1=int(math.log10(Gfreq_start))
j=0
A_list=
B_list=
while Gfreq_stop>=Gfreq_current:
cmd=':w23='+str(int(Gfreq_current)*100)+'.\r\n'
#print(cmd) #:w23=10000. means Frequency=100Hz
bcmd=cmd.encode() #encode from text to binary
ser1.write(bcmd)
DMM_list=[]
while j<1:
readedText = ser.readline(5)#DMM Displayed
spc=ser.readline(1)
readedText_range=ser.readline(1)#DMM keta shouji
spc=ser.readline()
kasu=int(readedText.decode())
jousu=int*1
DMM_VAL=kasu*(10**jousu)
siteif='{:.'+str(-1*jousu)+'f}'
DMM_VAL=siteif.format(DMM_VAL)
DMM_list.append(float(DMM_VAL))
j+=1
print(Gfreq_current,statistics.mean(DMM_list))
A_list.append(int(Gfreq_current))
B_list.append(statistics.mean(DMM_list))
Gfreq_current=Gfreq_current+fstep
i1=int(math.log10(Gfreq_current))
if i1!=i:
fstep=Gfreq_current*10/fdiv
i=int(math.log10(Gfreq_current))
j=0
ser.close()
flname='JDS6600_kenpa_1Vrms.CSV'
with open(flname,'w',newline='')as csvfile:
writer=csv.writer(csvfile)
writer.writerow(A_list)
writer.writerow(B_list)
*1:math.log2(int(readedText_range.decode()))-3