1年ほど前に、中華性のXL6019という両電源モジュールを使ってトラッキング電源を作りました。
このとき、正電圧側はINA219で電圧と電流を計測し、ArduinoでLCDへ表示させました。一方、負電圧側(ネガティブレール)で電圧と電流を測れるようなモジュールを見つけることができず、電圧については抵抗分圧を使って負電圧を正電圧にレベルシフトして、AdruinoのADCで読み込む方法としました。また、電流はホール素子式のACS712をだましだまし使うことにしました。
だましだましと言ったのは、ACS712は周辺の磁場の影響を敏感に受けるので、調整しても後日に測ると値がずれるといったことを繰り返していたからです。とは言っても、適したセンサーを見つけることができなかったので、仕方なくこれを使い、値は見ないことにしていました。
最近、誤った値を何とかしようと思い立ち検出方法をネットで探しているときに、Analog Devices のLT1797のデータシートに負電圧レールでの測定方法を見つけました。そこで、これを参考にシャント抵抗で測定モジュールを自作することにしました。
また、出力のON/OFFの切れが良くないことの対策と過電流保護機能の追加を行いました。
- ネガティブレールでの電流測定方法
- LTspiceシミュレーション
- 計測用オペアンプ
- ネガティブレールでのハイサイド電流測定
- 出力スイッチ対策
- 今までの方法と対策
- 対策の実験特性
- 過電流保護
- 新スケッチ
- 補足:
- マイナス電源の用途と利用範囲
- 測定回路での失敗
ネガティブレールでの電流測定方法
LTspiceシミュレーション
I1が負荷に相当します。V1が負電圧電源です。Rsがシャント抵抗です。したがって、ハイサイド電流の測定回路になります。計測用オペアンプの電源電圧はマイナス側が負電源の電圧で、プラス側はツェナーダイオードD1で持ち上げた電圧になります。
シャント抵抗Rsに対して、出力ゲインが10倍となるように各抵抗を決めました。INA219のシャント抵抗は0.1Ωなのですが、この回路ではAtduinoの10bit (1024分割)のアナログポートで読み込むので、0.5mA/1bit となるよう1Ωのシャント抵抗にしました。
マイナス電源の用途は主にオペアンプ電源なので、100mAもあれば十分です。このとき、シャント抵抗で0.1Vロスする設計です。電圧ロスよりも精度を優先させた設計です。
測定電流:V(out)/10Ω と実電流:I(Rs) を比較すると図のようになります。100mAのときに両者の誤差は1mAです。
計測用オペアンプ
オペアンプを比較すると下表になる。手持ちにAD8628があったので、これを使うことにした。
ネガティブレールでのハイサイド電流測定
KicadではAD8628が出てこなかったので、同じようなシングルアンプのシンボルを利用して回路図にした。
上記回路の出力(OUT)は負の値になるので、オペアンプで反転させて正の値をArduinoで読み込みます。
電圧は負荷に加わる電圧Vsを使い、これもオペアンプで反転させます。
ArduinoのアナログピンA0のADC値と負荷に流れる実電流をグラフ化すると下記になります。相関係数1で、完全に線形化できます。実際に作った回路では、手持ちの都合でシャント抵抗に2Ωを使いました。
ここで、
i_Real(mA)=−0.247×x+(−0.216)について説明します。
シャント抵抗Rs検出した電流I1による出力Voutは以下の式で与えられ、ゲインは 20 です。
VOUT=I1×R1Rs×R5=I1×1002×1k=I1×20
この関係式を変形して、電流I1に関する式にします。
VOUT(mV)は負の値なので、Arduinoでアナログ変換すると次式になります
I1=VOUT×201000=1024−ADC×5×201000=ADC×(−0.244)
実測した電流とArduinoのアナログ値ADCの関係は、測定回路に1%の誤差があったことになります。"誤差"は言い方として、適切ではないかもしれません。シミュレーションのようにピタリの抵抗を使っていませんので、、"製作上のバラツキ"が正しい言い方です。
−0.244×1.01=−0.247
完成した電流・電圧測定モジュールです。
出力スイッチ対策
今までの方法と対策
スイッチのチャタリング対策として、カットオフ周波数 3.3Hz のローパスフィルタをつけていました。なぜ、この値にしたかは覚えていません。
不満点は、
- スイッチを押してから切り換わりまでの遅れがおおきい。
- 結構な頻度で切り換えミスが起きる。
対策は、
- 接点周波数の変更。(R10:470kΩ → 100kΩ によって、3.3Hz → 16Hz に変更)
- LPFのあとに、シュミットトリガー74HC14Nを2重(反転 x 2)にかませる。
- スイッチの2番ピンを割り込みにする。
対策の実験特性
スイッチを押したときの挙動をオシロで測定しました。下から、黄色:2ピンスイッチ信号、水色:LPF出力、ピンク:シュミットトリガー出力、青色:切り換わり出力です。2ms/div の波形になります。
測定したときにはスイッチ(黄色)にチャタリングはほとんど見られません。LPFを通した信号が約10ms でシュミットトリガーの閾値2V になり、その瞬間に出力(青色)が切り換わっています。
 |
出力ON:青色0V→ 5V |
 |
出力OFF:青色5V→ 0V |
過電流保護
過電流保護はソフトで行いました。市販の実験電源には CCモードがあり、設定した電流以上にはならない機能があります。これと同じことを行おうとすると、出力回路の大改造になるので非現実的です。
そこで、次のようにしました。
- 電流制限を設け、その値を超えたら出力を遮断する。(INA219と新設した負側測定モジュール)
- 電流制限はプラス側とマイナス側に個別に設ける。
- 電流制限は可変にする。可変抵抗出力をArduinoで制限値に変換。
下図の左のノブが電流制限値の選択用で、6段階の設定が可能です。設定値は中央のLCDに表示され、この値を超えたらOUTPUTが遮断されるしくみです。
この際だから、フロントパネルデザインをInkscape で行いました。2L版のシール紙に印刷したものを貼り付けています。
新スケッチ
手作業でやると嫌になってくる変更をCopilot の力を借りで行いました。同様の処理を関数化したり、移動平均を指数移動平均に変更したりして、随分簡素化できました。
補足:
マイナス電源の用途と利用範囲
用途 | 電圧範囲 | 電流範囲 |
オペアンプ回路 | ±5V~±15V | 数mA~数十mA |
CCDイメージセンサ | 5V~15V | 数mA~数十mA |
TFT-LCDディスプレイ | 3.3V~12V | 数mA~数百mA |
電話交換機 | -48V | 20mA~120mA |
特定のセンサ | 2.7V~48V | 数μA~数A |
測定回路での失敗
これはオペアンプの電源電圧を保証するためのダイオードです。Power ON でXL6019と5V生成のレギュレータに通電するという正常な使い方なら不要です。XL6019 の作った低電位電圧とそれをツェナーダイオード1N4732で持ち上げた高電位電圧がオペアンプの電源になります。
自作した基板は、後からソフトの書き換えができるようにシリアル変換モジュールを介してPCとArduinoを繋ぐことができます。つまり、Power ON しなくても、PCと繋いでLCDを見ながらソフトを開発できます。前のACS712のときは、こうやってました。
これを行っていたら、極性反転用のLM358Nが焼損しました。幸い、計測用のオペアンプAD8628は正常でした。原因について、回路をつぶさに検証した訳ではありませんが、LM358Nの電源に原因がありそうだと予測を立て、近い構成でシミュレーションしたのが下記です。
Power ON しない状態(負電源V1 を未接続)ですが、負荷とした定電流源I1から電流が供給されるので回路は動きます。負電源がないので、VNは正の値を持ちます。そして、電流を増やしいくと、LM358Nの高電位電源VCC と低電位電源VN が逆転します。これに近いことが起こっていたと推定します。
対策として、負電源の出力部位にGNDに向かってダイオードを入れたときのシミュレーションです。これはBAT43(順方向電圧 0.2V)にしました。ほぼこの電圧で推移し、VCC 5Vを超えることはありません。