sanguisorba が 2020年05月29日23時59分13秒 に編集
初版
タイトルの変更
Arduinoを使った簡易交流電流計を考える(暫定版・メモ)
タグの変更
Arduino
本文の変更
前回までのあらすじ https://elchika.com/article/e90ae4bb-4985-4206-912d-5c918cae5c01/ 直流電流計を作ったら交流電流計も作りたくなる。 **今回は誤差についてわかりやすくするため出力を0~10Vの2倍にしています。オペアンプの電源が全て+12V, -12Vと書いていますが、回路図通り0~10Vの範囲で実際に出力する際は電源電圧として+15V, -15Vが必要です。 0~5Vの際は+12V,-12VでOKです。出力を0~5Vにする方法は前回の記事を参照。** お気づきの点がございましたらコメントを頂けると喜びます。 # 交流ではどうなるか 結局Arduinoを用いるとなると、直流交流計で考えたようなシステムを用いて電流を電圧に変換するしかありません。 ただし、交流となると直流に変換しなければならない作業が発生します。 今回、足枷となるポイントは次のポイントになるだろうと考えました。 * 交流と直流を電圧損失無しで変換する * 測定のために電圧を一定に保たなければならない 地道に問題を解決していきます。 # 理想整流回路・理想ダイオード 損失が許されるのであれば例えばブリッジダイオード方式が考えられますが、今回の場合は微小な電圧を読み取るため少しの損失も許されません。 そのため、今回は電圧低下の無い理想整流回路を用います。これにはいくつか方式があるようです。 ### 理想ダイオードブリッジモジュール LT4320や、LT4358などが手に入りやすいと思います。秋月にもLT4320を用いたモジュールがあるようですが、交流入力から自身の電源を取る事が前提とされており今回入力される交流電圧はとても微小なので使う事ができません。 モジュールが無いのでゼロから設計を考える必要があります。 ## オペアンプを使った理想ダイオード いろいろ調べてみましたが、理解できたのが「ダイオードの電圧降下をオペアンプを使って補正する」という方式だけだったので、今回はこれを用います。調整回路は置いといて、理論上は次のような回路で表されます。  この回路はダイオード1個分の働きをします。ダイオード1個でも整流は可能で、いわゆる半波整流と呼ばれるものになります。 回路通りに組むと正の電圧のみが、ダイオードを逆にすると負の電圧のみが整流されてでてきます。 この回路はとてもシンプルな例ですが、今回のように微弱な電圧下、また高周波では、波形がきれいに出力されません。解決するには最初の増幅回路で電圧を高くすればよいのですが、18V以上の電圧を生成するのはなかなか面倒なので前回と同じ方式に頼らざるを得ません。 今回はトランジスタ技術に掲載されていた、反転加算器を用いた両波整流回路を採用します。 **(訂正: 500Ω ではなく 5.1kΩ)**  この回路を前回作成した電流変換回路に組み込みました。やはり微弱な電圧だと無視できない差が生じます。 ※5.4kΩの下は14.6kΩ   アンプで補正しているとはいえダイオードを通っている区間は電圧が下がっています。 今回の主要因もオフセット電圧と思われますが、オフセット電圧調整を行うと0V電圧も上がってしまいます。   この整流回路はオペアンプの仕様上、あまりに電流が微弱だとオフセット電圧と相殺されて整流を行わなくなります。オフセット電圧調整無しの整流回路部に2mVの交流を入力してみても、周波数が2倍になっておらず整流していないことがわかります。  どのみち微弱な電圧に対して誤差が大きくなるという事に変わりはないので、10mV時のオフセット電圧調整を行う事で微弱な時の電圧補正には大いに役立ちます。しかし、10000mAまで測れる大電流計で10mA~50mAの微弱な電流を考慮する必要性が私には感じられなかったので、実製作時はオフセット電圧調整回路は要りません。仮にオフセット電圧調整回路を組まなければならないようなレベルの誤差許容が要求されるとなると、全ての抵抗器に対して抵抗値誤差の補正を実施する必要があり、またオペアンプの電源ライン+12V, -12Vも0.1mV単位の誤差補正が要求されるため、現実的でないです。 ドライブ能力の問題もあり、私はこれが最適解だと思いますが、もしかするともっと良い方式があるかもしれません。アイデア募集中。 # どうやって平滑をするか 変換後の電流を平滑する際、リップル電圧が許されるのであれば例えば平滑コンデンサを用いた方法がありますが、今回は計測時に電圧を維持し続ける必要がありリップル電圧は許されません。その上、微弱な電圧なので充電に時間がかかり、コンデンサによって下がる電圧がどれくらいか(理論上は可能でも現実では様々な誤差要因があり)予測不可能です。 バッファ回路についてはいろいろ検討しシミュレートしてみましたが、微弱な電流下では予測不可能な無視できない電圧低下が発生し、うまくいきませんでした。コンデンサを使わない方法があればうまくいく可能性がありますが、思いつきません。 現状の最適解について記述します。 # Ardiuino側で補正をする 一切のバッファ回路を搭載せずに、Arduino側で補正してしまえば電圧降下を気にする必要がありません。 一定時間電流のデータを読み取り、その中での最大値を電流として表示してしまおうというアイデアです。 最大の電流値は理論上、実効値となる電流値の√2倍が出てくるので、√2(=1.414)で割れば良いです。 計測時間を十分にとればダイオードを通った電圧の低下についてもカバーする事ができます。 以下はプログラムの例です。 :::plantuml:方式 @startuml "temp=0, max=0, count=0;"--> "temp = analogRead(Pin)" --> "count = count + 1" --> "今までの値よりも大きいか?" If temp >= max --> [true] "max = temp" -->"規定回数行ったか?" else --> [false]"規定回数行ったか?" Endif If "count >= x" then --> [true] "i = max * 10 / 1023 / 1.414" --> "println (i);" --> "これを何度も行う" -->[初期化]"temp=0, max=0, count=0;" else -->[false] "読み取りに戻る" -->"temp = analogRead(Pin)" Endif @enduml ::: # 課題・メモ * 現状バッファが無いところをArduinoでカバーしているが、これがもっと単純な直流電圧メータを用いる場合の時の、本来採用する予定であった平滑回路・バッファ回路の方針がまだ見いだせていない。電流を電圧に変換する抵抗を0.5Ω(できれば0.1Ω)にしているが故に、起電力が非常に微弱であることが大きな足枷となっているが、この微弱な交流電流を直流に変換する事はできないだろうか。 * 電圧降下が気になるので0.5Ωを回路図上で指定しているが、0.1Ωを選択すると恐らく0.5Ωの時よりも誤差の大きい電流計になるのではないだろうか。もちろんオペアンプの特性に影響されるというのもあるが、0.1Ωというと殆ど導通状態なので、抵抗の両端から負荷までの距離を考える必要がある。電源コードの内部抵抗のほうが大きい場合がある可能性がある。とすると、0.5Ω乃至1Ωが最適な可能性がある。直流の時は乾電池で駆動する豆電球の消費電流を測る事を想定していたので0.1Ωが必要と言っていたが、仮にコンセントからの交流電源に対して電流を測る場合は、もっと抵抗値が大きくても電圧降下は問題にならない筈。