ページ

2022/11/26

ラズパイとラズピコで分電盤センサを作成(14)

回路の実装図作成に取り掛かろうと思ったが、ここで一つ寄り道。
ADCへの入力前に交流電圧に対して直流バイアスをかける手段として、オペアンプを使う方法が出てきた。
アナデジ太郎の回路設計

というか、バイアスをかけたい場合、この方法の方がメジャー・・?

と思ったのだが、オペアンプは以前も勉強しかけて挫折したもの。
製品選定にあたって検討が必要なパラメータが多く、電子工作初心者からすると何を選んでいいのか分からない。
本当は勉強→オペアンプ購入→失敗 みたいなループを繰り返して理解していくものなのかもしれない。(なお、シャントレギュレータの中にもオペアンプが入っているらしい。知らずに使ってきたわけだ。)
まあ、今考えている方法で行けるのならば、当面オペアンプはスルーしたい。

ただ気になっているのは、今考えている方法はVrefをバイアス電圧としてを使っているが、測定信号がVrefの安定性に影響を与えないかということ。
影響を与えないのであれば、複数ch計測時も一つのvrefをバイアス電圧として使用できる。

そこでバイアス電圧について調べていて、このオペアンプにたどり着いたのであった。

このサイトも参考。完全に技術者向けのサイトで難しい。。
信号の A/D 変換を正しく行う 7 つのステップ(シグナル・コ ンディショニングのノイズ計 算)

もう一つ考えていることは測定値の変動。
特に、今回作った測定系で入力ゼロの時の換算交流電流が0.2A前後まで変動するのを解消できないかという探求。

  • Vref由来のバイアス電圧が変動している
  • ノイズが変動している

の2種類の原因を想定している。早速実験してみよう。


このグラフは線が水平であるほどバイアス電圧がぶれていないことを示す。バイアス電圧に対する、この結果からの考察。

  • Vref自体がぶれている可能性
  • Vrefの分圧から作るバイアス電圧がぶれている可能性(Vrefの分圧でバイアス電圧を作っているので、この要因だけ独立している可能性は低い)
  • どちらもぶれていないが、ADCの内部ノイズで計測がうまくいっていない可能性
  • アルコールチェッカーの時もこんな結果のぶれがあった
  • ADCのデジタル分解能4095のうち±3程度のぶれは、手持ちのテスターでは観測できない
  • 青と橙は、実配線上は異なるポイントをプロットしているが(ブレッドボードを使っているため)、結線図上は同一電圧であるはず。なのにこの差は何だろうか?ADC上はCh6と7を使用しているが、ADC内のノイズがch毎に異なるのだろうか?

そして、オシロスコープがここで活躍。
オシロで測ってみると、ADCを動作させている時だけ、バイアス点に10mV程度のノイズがのることが分かった。周期は500us程度で方形波。これは除去したいなー。ただ、上記グラフのノイズとの因果関係は不明。定量的にはあまり関係ないかも。

次にVBus(+5V)のラインに、パスコンを3種類つけたら、6時間放置でバイアス電圧の変動は安定していそうに見える。
計測開始直後のみ大きく変動しているのだが、原因不明。また、このグラフは20000サンプリング1プロットなので、個々のばらつきは平準化される。そのため、ここから言えるのは長期トレンドとしては一定になっている、という程度。


現在の回路と疑問点。多ch化するときのバイアス電圧はどうしたらよいのだろうか?


☆の部分をch4, 5, 6, 7につないで、ノイズのRMSを観測してみる。

どうも、回路に物理的に手を入れるとADCの出力値が大きく変わり、長時間稼働させると安定していくように思える。経験的なものだが。


1プロット40000サンプルのRMS、1日弱の観測。うーん。。


2日目も同じような計測。今度は2に収束している。。

今回は平均もとってみた。RMSと印象が変わる。あまりRMSを取る意味はないか?
ばらつきは少なく、あくまで平均が移動しているように見える

平日は機械も遊んでいるので、、もっと長期的なデータを取ってみよう。
二日間強の結果。またしても謎の変動が。絶対値としては小さいが。




2022/11/01

ラズパイとラズピコで分電盤センサを作成(13)

出来上がった交流電圧(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間の相対的な割合を見る分には問題なさそうだ。



ラズパイとラズピコで分電盤センサを作成(12)

次は測定精度の追及の続きとして、シャントレギュレータの基準電圧の安定度を見てみたい。いろいろなサイトにシャントレギュレータは基準電圧源として使うと書かれているから、精度はよいのだろう。それを実際に目で見たかった。

が、よく分からなかった。
電圧が結構変動している。。パスコンを外して最小構成にしても、変動は減らない。

大量に電圧をサンプリングして分布を見ることで何か原因が掴めるかとも思うのだが、ラズピコはファイル出力ができず、ラズパイのように大量のデータをCSVに吐き出して分布図を作ることができない。
ラズピコの出力はUSB経由でラズパイ上のThonnyのコンソールに出力しているが、ここは何万データも出力する場所ではない。表示できる行数も制限があるようだ。
まあ、大量のデータを見るまでもなく、電圧変動が激しいように見える。0.1Vレベルの変動であるため、分電盤センサとしてはとりあえず見逃すか・・?
シャントレギュレータの特性よりも、自分が作ったプログラムや測定環境の方が疑わしいので。

次に、シャントレギュレータのことは置いておいて、ブレッドボード上の配線がごちゃごちゃになっていたのでこれをスリム化した。
そして、バイアス電圧付きのRMS電圧を出すプログラムでも作ろうかと思っていたのだが、ここで問題発生。
1000サンプル周期の長周期で見ているとADCからの取得電圧値がどんどん下がっていく。計測している電圧は直流で一定であるにもかかわらず。何だこりゃ?

四苦八苦してデバッグしたが、原因がわからない。
SPI通信の受信ビット列を見ても見事に数字が下がっていく。SPI通信の受信クロックがずれているのかとも思ったが、1ずつ下がっていくのでそれはなさそう。見るべきビットが1ずつずれていくなら、10進数としては1/2ずつになっていくはずであるが、10進数で律儀に1ずつ計測値が下がっている。。
ADCを触ってみた。特に発熱はしていない。

もしやVrefが下がっているのか?
→DMMで計測したが、下がっていなかった。
ちなみに、一度計測値が下がると、プログラムを一時停止/再実行しても下がったまま。回路構成を変えたりして電源ON/OfFすると値が戻る。これがヒントになっているか?

次に、プログラムにタイマを仕込んでデータの取得を間欠動作にしてみた。
→値は下がらない(様に見える)。ということは、時間依存ではなくSPI通信の回数依存で下がっていくということか?

ここで原因判明!
何気なくブレッドボードを眺めていたら、ピンが刺さるべき場所の1つ隣の穴に刺さっていた!まさかの配線ミス。。配線スペースを節約しようと圧縮配線したのが真因か。。これで3時間無駄にしてしまった。しかし、それでは、なぜ最初に電圧が計測できたのだろうか。ブレッドボードの隣同士の穴は電気的に結合しているのだろうか?今回間違って刺した穴は、完全に独立ではなく、2本のピンを同じように間違って刺していた。

不正解の回路図(43列目)


正解の回路図


もしかすると、コンデンサが計測値漸減の役割を果たしていたのだろうか。

とりあえず、治ってよかった。


ラズパイとラズピコで分電盤センサを作成(14)

回路の実装図作成に取り掛かろうと思ったが、ここで一つ寄り道。 ADCへの入力前に交流電圧に対して直流バイアスをかける手段として、オペアンプを使う方法が出てきた。 アナデジ太郎の回路設計 というか、バイアスをかけたい場合、この方法の方がメジャー・・? と思ったのだが、オペアンプは以...