というか、ノイズをなるべく減らして、正負の電圧と電流をLCDに表示させたいと思っています。色々と遊んでみます。
供給電源
素性の測定に汎用の安定化電源を使うよりも、実際に利用するACアダプターを電源にして測定します。電源は手持ちのACアダプタのうちから以前、調査した時ノイズの少なかったWii 用のACアダプター 12V/3.7A(RVL-002)を使います。下図の左端のアダプタ(No1)です。
商品ページに記載されているデータを使うと、供給電源が12Vの場合には両電源の出力電圧と電流は下図のようになります。12Vで0.78A出力です。このとき、入力電流は 2.20A と書いてありますので、Wii 用のACアダプター 12V/3.7A(RVL-002)で行けると思います。
なお、出力電流に注目すると、供給電圧を12Vから大きくしても12V出力では0.78Aで頭打ちになるような特性です。$2 \times 12 \times 0.78 = 18.7 \ [W]$ なので、出力仕様の20Wが効いているのだと思います。
電源ラインのノイズ
XコンとYコンはEMCの民に解説されている容量にしました。(解説の範囲で容量変更してみましたが、オシロでは差をとらえることができませんでした。)
コモンモードチョークのある無し、スパイクノイズに効くであろうYコンの容量、平滑コンデンサのある無しをパラメータとして変えながらノイズを観察したところ、コモンモードチョークなしの方が高周波のスパイクノイズらしきものが小さいという結果になりました。ブレッドボード上で組んだのでYコンのアースを取るシャシがなく、周囲の色々なものに接触させてみましたが、違いを見分けることはできませんでした。コモンモードチョークを使い切るには自分は知識不足です。
平滑コンデンサC4はジャンク箱で見つけた2700uFにしてみました。これはスイッチング周波数のリップルを取るのに効果がありました。
コモンモードチョークあり
黄色の波形がスパイク部の時間軸(20ns/div)波形です。振幅88.5mVp-p、周波数は122MHzと出ています。それをFFT解析したものが青色の波形で、横軸はリニア表示で500MHz/divです。ピークにカーソルをあてて周波数を読むと、左側のカーソル位置が181MHz、右側のカーソル位置が2.5GHzです。
コモンモードチョークなし
上のチョークあり波形と見間違うくらい同じです。詳細に見比べると時間軸波形の収束具合がわずかに違うくらいです。数値上では、時間軸の黄色波形の周波数が132MHzになったくらいで振幅88.5mVp-pは同じ値です。青のFFT波形での2か所のピーク周波数 181MHz、2.5GHzは同じです。
出力部LCフィルタ
ジャンク箱から見つけたコイルとコンデンサで、出力部用にπ型のLCフィルタを作ってみました。入出力インピーダンスを200Ωとするとき、22uHと470uFを使って、カットオフ周波数 2kHz、ゲイン -60dB/decade です。XL6019のスイッチング周波数 180kHzの時には計算上 -183dBになります。
測定条件は正負とも125Ωの抵抗負荷です。電流は94mA流れています。Neg(-V)側ではリップルノイズの低減に効果が出ています。Pos(+V)側は効果がみられません。また、スパイクノイズに対しては効果がありません。
電圧と電流をモジュール化されたセンサで測る
INA219
電圧と電流をクールに表示したいと考えています。Arduino で動く電流センサーモジュール(INA219)を使ってみます。正規品は測定精度によってA、B2タイプあるようですが、手にしたのは例によってAliexpressで買ったNo Brand コピー品です。送料別で1個 200円ちょっとでした。
正電圧専用(負電圧は使用不可)
インラインで負荷の手前(ハイサイド)に入れると、VIN-とGND間の電位をBUS電圧(負荷に働く電圧)として計測し、加えてVIN+とVINー間に設けられた0.1Ωのシャント抵抗によって電流を計測できるという便利で安価なモジュールです。これを使うために、Arduino とLCDも用意します。Arduino Nano と 1.8" Displayの ST7735です。
XL6019モジュールはハイサイドでの測定専用です。そこで、負荷から見てLCフィルタの手前に入れました。INA219から出るノイズはLCフィルタでカットという目論見です。
Datasheetには下記のようになっていたので、負電圧でもOKと勝手に思い込み、負電圧に繋いで1個壊してしまいました。
私には次のことが何を言っているのかわかりません。however, 以下が肝なのでしょうか。
Differential (VIN+ – VIN–)(2) –26 26 V
(2) VIN+ and VIN– may have a differential voltage of –26 to 26 V; however, the voltage at these pins must not exceed the range –0.3 to 26 V.
INA219は負電圧に使うのがNGなのですが、さらに2点ほど注意点があります。これらについて書いておきます。
- ノイズがでる
- 測定精度がイマイチというか、NG(中華製が原因かも知れません。はずれ‼)
ノイズ
INA219モジュールをプラス出力部に挟むと、スパイクノイズが大きくなりました。従来からと同じノイズで周波数125MHz前後です。振幅が大きくなります。さらに、マイナス側にも影響が出ています。
測定条件は前回と同じで、正負とも125Ωの抵抗負荷です。電流は95mA流れています。負荷抵抗の手前の電圧を見ます。
測定精度
Web上にある情報を見て、精度はそこそこ良いものと期待していたのですが、実測してみるとびっくりするくらい悪いです。2つ買って、2つとも同じでした。ノーブランドのコピー品なので仕方なしかとも思いますが、これはダメです。測定値は我が家のDMM原器 R6552 との比較です。正規品を買おうかとも考えたのですが、電圧はあっているようなので、電流のキャリブレーションをソフトで修正することにしました。
ちなみにDatasheetでは、–25°C ~ 85°C の範囲で、電流の誤差がAタイプで±1%、Bタイプで±0.5%となっています。これに比べて、今回測定した数値は論外です。このなかに、Adafruit_INA219.cpp があり、221行目からの ina219_calValue がシャント電流を計算するキャリブレーション係数のようです。
// 5. Compute the calibration register
// Cal = trunc (0.04096 / (Current_LSB * RSHUNT))
// Cal = 4096 (0x1000)
ina219_calValue = 4096;
ina219_calValue = 4096 / 1.278 ;
実際に使うであろう範囲で電流を何点か変えて、測定した結果が次表です。Adafruit_INA219.cpp はコンパイル時に読み込みますので、他の個体(例えば正規品)を使う場合はオリジナルに戻す必要があります。
測定精度 Part II
訳あってINA219を新しく入手し、測定してみるとほぼDatasheetの値が出ました。入手したINA219はAmazonで扱っていたものです。5個で1600円位です。よく見かけるものと外観が違うので心配していたのですが、ちゃんとした精度でびっくりです。(前のがおかしい。(-_-メ))
電流のキャリブレーションを変更できるので、高精度(フル400mA)と中間精度(フル1A)で測定してみました。中間精度でも誤差が1%未満に収まっています。
シャント抵抗
興味本位で、INA219に搭載されている0.1Ωのシャント抵抗を4ワイヤー式で測定してみました。DMMは我が家の測定原器である中古のR6552です。
測定値が25%増しの青INA219では、モジュール状態で抵抗値は0.125Ωです。しかし、ハンダを外して抵抗単体で測定してみると、表示(R100)どおりの抵抗値の0.104Ωでした。電流はシャント抵抗間の電圧をシャント抵抗で割って求めているので、測定値が25%増しになる理由は推定もできません。新しい紫INA219を測定すると、モジュール状態で0.112Ωです。さすがにハンダを外すことまではしませんでした。2件の事例から、シャント抵抗との相関を考えるのをやめました。
実は、ダメなINA219を弄っている最中、2個目も壊してしまいました。さらに、つなげていたArduiino Nanoも壊れてしまいました。
壊れた原因は恐らく、ノイズへの影響を見ようとINA219のVIN+とVIN-間に100nFのコンデンサを繋げたり離したりしてしまったことだと思います。接触と放電のタイミングでDatasheetの注意書きを起こしたのかもしれません。
however, the voltage at these pins must not exceed the range –0.3 to 26 V.
これが原因でINA219のVCCとGNDがショートし、そこに繋げていたNanoの3.3Vが死にました。そしてWindowsのデバイスマネージャから消えました。
負電圧を測る
マイナス電圧を測定してLCDに表示させようと考えたとき、Arduinoには負電圧を入力できません。オペアンプで負電圧を反転させて測るとか、バイアス電圧をかけて正側にシフトさせるとかの方法があるようです。また、Arduinoのアナログ入力は0~5Vなので、XL6019モジュールの±30V出力をこの範囲に減衰させなければなりません。このため、オペアンプや諸々の部品が増える回路になります。
Arduinoでマイナス電圧を測定する方法
簡素にできる方法はないものかと探し回っていると、次の記事に出会いました。この方はなんと賢い方でしょうか!!。Arduinoの5V電圧を使って、負のADCにバイアスをかけるようです。直ぐには理解できませんでしたので、エクセルとLTSpiceで具体的に数値をあたってみました。
考え方
バイアス電圧をArduinoの持つ5Vにして、LTspiceを使って、この特性を計算してみました。±3Vの入力を0~1Vのプラス出力に変換できています。
パラメータ調整
欲しい特性の得られるR1, R2, R3 の組み合わせはExcelを使って数値で検討します。ATTとOff setなどを計算すると、入力Vinと出力ADCの関係が見えてきます。下記に色付けした値だと、入力-27VまでをADCがプラスの範囲に変換できます。
LTSpiceで試算
Excelで求めた各々の抵抗値を使って、LTspiceで特性を計算してみました。横軸がVin、縦軸がADC電圧になります。Vin 0~ -24V を ADC 2V ~ 0V に変換できます。線が3本あるのはArduinoの5V電圧を4, 4.44, 5Vと変えて計算させたためです。勾配は3本とも同じで、0.0810 (V/V)です。これはATT量を表しています。Arduino Nano は10bitなので分解能は、
実測値
測定に使ったテスターの精度は良くないのですが、実測してLTSpiceのグラフと同じ表し方をしてみます。勾配0.0787でゼロ切片 2.032と、計算とほどほど近い値になりました。
この方法を使うと、Arduinoでマイナス電圧の測定ができます。ネックは60mVと分解能が粗いことです。
実験的に確認ができたので、今後、修正係数の微調整をして使おうと思います。INA219で測った正電圧と比較すると、現状でもそこそこ許容範囲の値が表示されています。(もっとも、XL6019両電源モジュールの正負電圧がどのくらい一致しているのか、まだ未確認です。)
負電圧回路を流れる電流を測る
ACS712
負電源の電流をINA219で測ろうとして失敗しました。そこで、しつこく探したらACS712という秋月扱いの電流センサーがありました。
センサー部にホール素子を使用していますので、測定電流に対して、電圧出力と電源は、絶縁されています。
こう書いてありますので、負電圧中の電流を測れるはずです。
オペアンプが搭載されていて、オフセットとゲインを調整できます。実際に使ってみると「負電圧中の電流を測る」という目的は達成できるのですが、非常に使いにくいという印象です。
その理由は、ホール素子なので周囲の磁場の影響をもろに受け値が変動します。調整用のドライバを近づけただけで、まったく違う値を出力します。それに、ノイズなのかIC固有の発振なのかわかりませんが、出力信号は数10kHzでランダムに振動していて、その都度、値が変わります。
出力調整
秋月モデルはオペアンプ内蔵で、出力オフセットゲインを調整できます。5A版のACS712は本来185mV/A (5.41A/V)なので、Arduino Nano では、 $5.41 \times \frac{5}{1,024} = 0.026 \ [A/LSB]$ となり、結構大きな数値です。ここは、500mA/V程度にゲイン調整しようと思います。この場合、2.4 mA/LSBになります。10LSBくらいは変動すると思うので、20~30mAは測定にバラツキがでるという腹積もりが必要です。
Datasheetによると入力電流と出力電圧はリニアリティがあるようなので、ひとつの電流値だけで調整を行いました。ピタリと合わせるのは無理なので、だいたい合わせておいて、最後はソフトで調整するつもりです。
センサ、電源、負荷だけで回路を作り、オフセットとゲインを事前に調整した状態で、負電源回路に組み入れました。しかし、ここでオフセットが1Vずれました。ゲインも変わってしまうようです。
薄い鉄板で作ったドーム状の磁気シールド被せたので、ドライバーなどの磁場変化には強くなりました。ただし、磁気シールドを被せたままでは調整ができないので、シールドを外すと値が変わります。
結局、負電源回路にACS712モジュールを組み入れてから、ほぼ半日かけて、オフセットとゲインを調整をやり直しました。さらに、ソフト上での微調整も行いました。
測定と表示
正電源の電圧と電流、負電源の電圧と電流を仮表示させるとこのようになります。
表示を眺めていると、負電源電流の表示が結構ばらつきます。それをArduino IDEのプロッターで表示したものが下図です。現状では100個の平均を取って表示させているのですが、それでも20mAほど値が跳ねまわっています。
ソフトウエアのCRフィルタやメディアンフィルタを試してみましたが、どれも代わり映えはしませんでした。むしろ表示遅れに違和感を覚えます。Datasheetを詳しく読んでみると、ノイズは出るものみたいです。C5がローパスフィルタで秋月品では1000pF (1nF) が使われています。
私のものは490mVp-pでした。
ノイズフィルタ追加
知識と経験が乏しいので、やることが場当たり的です。最初にACS712の出力波形を観察し、LPFを入れることをまず最初にやるべきだったと思います。オフセットやゲインの調整はLPFの効果を確認してから実施すべきでした。
そこを反省しながら、10uHと100uF 2個で3次のπ型LPFをACS712の出力部に入れました。フィルタなしの490mVp-pのノイズは電流換算すると約250mAp-pに相当します。周波数成分は6.3kHzを1次成分として、多数出ています。
フィルタを入れると、77mVp-p(約38mAp-p)に低減できます。FFTで37kHzくらいに成分のピークが出ていますが、それはわずかで全域でノイズを消すことができています。
調整はこれからですが、LCDに表示させてみました。目視で90mAに対して数mA、600mAに対して20mA程度の変動です。許容範囲です。
電流が増えると値の変動が大きくなるのは仕方ないです。(546mVp-p)このケースでも周波数全域で特異なピークはありませんでした。
オペアンプの両電源に使ってみる
電源電圧±12V
電源電圧±5V クリープ発生
正負電圧を測定
電圧が低いときは負電圧が大きく、電圧が高くなると正電圧が大きくなる結果です。正負の電圧比は、+0.55%~-0.30%と実用上は全く問題にならない違いです。