出来上がった交流電圧(RMS)測定プログラムはこんなかんじ。
import machine
import utime
from machine import Pin, SPI
led_onboard = machine.Pin(25, machine.Pin.OUT)
Vref = 2.495
Resistance = [100, 100, 100, 100, 100, 100, 100, 46.7]
sampling_count = 1000
CT_ratio = [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000]
bias_voltage = 1144
#1MHz
spi = SPI(0, baudrate=100000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
cs = machine.Pin(5, machine.Pin.OUT)
cs.value(1)
ite = 0
CHNs = [0, 1, 2, 3, 4, 5, 6, 7]
write_buf = []
for i in CHNs:
write_buf.append(bytearray([((0b1000+CHNs[i])>>2)+0b100,((0b1000+CHNs[i])&0b0011)<<6 -="" 0.0="" 1="" 8="" adc_rawdata_sum="" avg_current="[0.0," avg_voltage="[0.0," bias_voltage="" bit12_0="" chns:="" cs.value="" for="" i="" if="" in="" ite="" read_buf="" spi.write_readinto="" true:="" while="" write_buf=""> sampling_count - 1:
ite = 0
for i in CHNs:
avg_voltage[i] = ((adc_rawdata_sum[i] / sampling_count) / 4095) * Vref
avg_current[i] = (avg_voltage[i] / Resistance[i]) * CT_ratio[i]
adc_rawdata_sum[i] = 0.0
print(avg_current)
led_onboard.toggle()
spi.deinit()
そして、実際に交流電圧を計測し、自作のプログラムから電圧測定値として出してみる。緊張の瞬間。その計測結果はこう。1プロットで1000サンプリングの平均値。
DMMでの指示値は6.1A。これに対して、大分差がある。また、ぶれも大きい。
絶対値の差については、サンプリング周期の長さ、CTの各種誤差、ADCの誤差の蓄積など、要因が色々重なっているかもしれないので、現時点での原因分析は難しい。入力値に対して出力値がリニアになっていれば、結果を補正するだけなので簡単なのだが。。
ぶれについてはやはりVrefのぶれか、ADCがノイズを拾っているということだろうか?
ちなみに電流を流していないときの0点はかなり落ち着いた値になっている。ということはADCに入るノイズは少ないのだろうか?
→DMMで計測した値もよくみると交流電流の時は結構ぶれていた。ということは、このぶれは精度として問題ないかも。
特性はこんなかんじ。
線形を見て、ん?となったが、線形になっていない2プロット分はいずれもカーボンヒーター300Wを使ったもの。
つまり、電圧のRMSを測るようにプログラムしたつもりだが、うまくいっていない(誤差が大きい)ということになる。
もしくは8ch分を一気に計測しているので、1ch当たりのサンプリング周期が長くなってしまっているのが原因か。交流電流を1chのみ測った場合は、元の交流電流波形にかなり追随できていたため。
そこでサンプリング周期を短くすることを試したが、非正弦波の部分の測定精度がよくなるということはなかった。
改めて、RMSの出し方についてよく見てみると、サイトに書いてある数式と自分の実行順序が少し違うことに気づく。
自分は、(Σ((電圧^2)60.5))(1/N)だった。
サイトに書いてあるのは、((Σ(電圧^2))(1/N))^0.5という感じ。
このやり方に書き直したところ、非正弦波部分の乖離が減った!ゼロではないが。
そして、全体の測定結果も真値に近づいた。
さてそろそろ、測定精度の追及は終わりにしようか。
0A測定時のフロアノイズは、DMMでも同じように発生していた。
DMM指示値で0.1A弱程度のノイズ。0.1A以下はすべて0Aとして処理してしまおうか。
また、バイアス自体、もしくはその計測値が変動する問題は、お手上げ状態。
しかしそれは±0.2A程度の変動なので、これも無視してしまってもよいかと思う。
各chの絶対値ではなく、ch間の相対的な割合を見る分には問題なさそうだ。
しかしそれは±0.2A程度の変動なので、これも無視してしまってもよいかと思う。
各chの絶対値ではなく、ch間の相対的な割合を見る分には問題なさそうだ。


