微少電流計の自作2|INA226+mbed(LPC1114)|マイコン入門

当ページのリンクには広告が含まれています。

RL78版の微少電流計を基にして、改めてINA226で作り直しました。
今回はLPC1114を使い、開発環境にはmbedとμVision5+ULINK2を使用。
パソコン側(表示)はVisualStudioでC#。
かなり正確に測れています。

興味があるところを読む

概要

仕事でバッテリー駆動の製品を作っていて、これの間欠動作時の消費電流をグラフで見たいので作ることにしました(貧乏人なんで電流プローブを買えない)。
RL78に移植するのが面倒なのでLPC1114で作りました。

ハードウエア

どれも仕事で余った手持ちの部品なのでやっつけです(計測する電流が小さいので、全体的に細い線を使ってる)。

こちらのINA226のシャント抵抗を外して、1Ωと10Ωのシャント抵抗(3Wで1%誤差)をくっつけた。
こちらは高級品の金属箔抵抗
1Ω0.3W:誤差0.5% 15ppm/°C OLINAS
10Ω0.3W:誤差0.1% 5ppm/°C OLINAS
もっと精度が必要ならINA226のVSに電圧リファレンスICの出力を使うとか?

抵抗の切り替えにリレーを入れてみました。
これでパソコン側から抵抗を切り替えられるんで便利です・・・うむ~こんな素晴らしいアイデア見たことない(^^;
ところでINA226はAliExpressなら$1程度で売ってるので、時間があるならこれで良いかも。

USBCDC部分は秋月の例のFT232RLを使い、3.3V電源もここから貰ってる。
この3.3V電源はFT232内蔵のレギュレータからの出力で、秋月の資料にはMAX24mAとか書いてあったと思うけど本家の資料には50mAと書いてあるような?んま、リレーを50mAで動かしても平気みたいなんで気にしないって事で・・・仕事じゃないし(^^;

開発環境

LPC1114側のファーム作りには、mbedとμVision5+ULINK2を使用。

mbedはOS2って言うのかな?今のRTOSじゃない昔のバージョンを使ってます。
ソースを全部持ってるんで、いざという時にはμVisionでポートの入出力までソースレベルで追いかけられるってのは良い。
これが出来ないと怖くて仕事じゃとても使えない・・・今回は仕事じゃないけど。

CPUのクロックは遅くする必要がないので、system_lpc11xx.cの #define CLOCK_SETUPはいじらずにそのままなんで、CPUは48MHzで動いてる ← ソースがあるとこう言うことが出来ます。

μVisionは高級品の有料版を使用・・・顧問先の会社で買ってもらったんだけど凄い値段だ。
でもやっぱ出来が良くて、これを使ってるとCS+がイヤになる。
CS+はタダだから使うけど有料だったらかなり文句が出ると思う。
e2studioなんてもっと文句あり。

ULINK2は中華製で$12~15。
これで高速デバッグが実現する。
mbedのUSBデバッグは遅くてイライラするけど、ULINK2で直に接続しちゃえば高速にデバッグ出来て最高。
しかもCPU直接続だから秋月でCPUを¥400で買えば済む。

PCとの通信ボーレート

INA226の電圧サンプリング速度はマニュアルを見ると最高で140μSらしいので、この時間内にバス電圧とシャント抵抗の電圧をパソコンに送信する必要が有る。

それぞれ16bit=2byteだから合計で4byte、念のためにチェックサムをくっつけて5byteを140μS以内に送信するんだから、500,000(50万)bps出てればOKっしょ?

9600(約1万)bpsは1秒間に約1,000byte送信だから1mSに1byte送信、10万bpsなら100μsで1byte送信、50万bpsなら100μsに5文字送信・・・だよね?

I2Cの通信速度


I2Cは400Kで接続した。
mbedのデフォルトのままだと遅いんで、忘れずにi2c.frequency設定で速度を上げること。1Mも試してみたけど、INA226は対応してるらしいけどCPU側が追いつかない 。

I2C速度400K、変換速度140uS(最高速度)で2個のREGの読み出し(2byte書き込み+4byte読み出し)をしたら、50,000回の読み出しに15秒ぐらいかかるから、一度の変換結果を取り出すのに300uSかかってる。

I2C速度を800Kにすると11秒、I2C速度を1600Kにすると8秒程度になるけど、CPUが追いつかず読み取れない。
と言うことなのでI2C速度は400Kで行く。

試しにCVRF(AD変換終了フラグ)を読み出してみたら50,000回で15秒かかる。
つまりもっと高速なI2Cを使わないとINA226の最高変換速度の140μSに追いつかないって事のようだ。
いずれは別のCPUにしないとでしょう。

ってことなんで、INA226のサンプリング速度(変換速度)は最高でも588μS迄にすることにした(なのでデフォルトが1.1mSになってるのかも)。
なおコードはmbedなんで相変わらず簡単。数行書けば終わり。
やっぱmbedは良いよね~

パソコン側のアプリ

パソコン側は例によってVisualStudioでC#。
C#を使っちゃうと他は使えねっす。
TurboCやらModula2やらMS-CやらDelphiで食ってきたけど、C#はとてもエエっす。
VBみたいにダサくなく、C++ほどの気遣い不要、しかも情報がいくらでも落ちているんで、自分で考える必要が無い。
落ちてるコードをコピペするだけ・・・バカでもアプリが作れる(^^;

INA226のレジスタ

INA226マニュアル
INA226から電流(電力)を読み出すためには、CalibRegへの設定が必要だけど、今回のように1Ωとか10Ωのシャント抵抗を使うと割り切れない値を設定しないとならずで、そうなると誤差が出るんで使っていない。

INA226のバス電圧レジスタを読み出して電圧を取得し、INA226のシャント電圧レジスタを読み出して、パソコン側で計算で電流と電力を出してるんで、そのつもりで読んでください。

レジスタ0

INA226のレジスタにアクセスするときは、レジスタ番号を指定しておいてR/Wする。
レジスタ0は、Configuration Registerで測定方法を設定するためのレジスタ。
D15-12:無視
D11-9:平均化の回数指定・・・INA226が内部で勝手に平均化してくれるけどアプリでやるから不要
D8-6:バス電圧の計測時間指定・・・意味不明だけど変化させると値が安定する感じ
D5-3:シャント電圧の計測時間指定・・・上のバス電圧と同じにしてる
D2-0:常に連続で電圧を読み出すからデフォルトのままでOK

レジスタ6

それと割と大事なのがこれ。
要するにAD変換終了フラグみたいなものらしいんで、これが「1」になったら電圧を読み出すようにする。
「1」になる前に読み出しても前回と同じ値なんで無駄です。

※なおALARMピンに変換終了の結果を出すことも出来るようで、CPUで変換終了割込みを使いたいならCNVR(D10)をセットしておく(試してない)。

レジスタ1

シャント抵抗の両端の電圧をAD変換して、その結果がこのレジスタに入る。
読み出せばOK。

レジスタ2

バス電圧が入るから読み出す。

他のレジスタ

無視。使うのはレジスタ0、1,2,6だけ。

ファーム側のコード

ファーム側のコードはMbedなのでちょー簡単。

int main(void)
{   
    //void test(void);
    //test();

    top:
    rsel = 0;           // リレーOFF:1Ωのシャント抵抗を使用(MAX 81mA)
    pc.baud(500000);
    _SetN(0, _GetPc()); // PCからの開始CMD待ちだが、この値をConfigRegにセットする
    while (1) {
        // PCからのCMD受信
        if (pc.readable()) {
            ushort rv = _GetPc();
            switch (rv) {
                case 0xffff :goto top;      break;  // 終了
                case 0xff00 :rsel = 0;      break;  // リレーOFF 1Ωシャント抵抗
                case 0xff01 :rsel = 1;      break;  // リレーON  10Ω  ”
                default     :_SetN(0, rv);  break;  // それ以外ならConfigRegに転送する
            }
        }
        // 変換完了待ち
        while ((_GetN(6) & BIT03) == 0);
        // 電圧の取得
        char v[2],c[2];
        ina.voltRead(v);    // バス電圧 2byte
        ina.shntRead(c);    // Shunt電圧 2byte
        // PCへ送信
        pc.putc(v[0]);
        pc.putc(v[1]);
        pc.putc(c[0]);
        pc.putc(c[1]);
        // csum 1byte
        char csum = v[0] + v[1] + c[0] + c[1];
        pc.putc(csum);
    }
}

パソコン側のコード

こっちもちょー簡単。
SerialPortから5byteずつ読み出して、CHKSUMを調べてOKならWORDにし、doubleに変換してChart配列に入れるだけ。コードはだらだらと長いんで書かないけど簡単っす。
間欠動作時の消費電流や平均電流が見えるんでとても結構です。

キャリブレーションする

電圧によって電流値に誤差が出るので、CALIBRATIONボタンを追加した。
電圧を変更したら無負荷の状態で平均値が安定するのを待ち、その後でCALボタンを押すと、平均値の分だけ実電流値からマイナスして表示する(再度押すと生値を表示)。
精度は三和のテスターCD771と比較してトントンだから0.1μAレベルに近いかも。

実際にRL78の消費電流を測るとこのように見えます。
想定外の電流の使い方にビックリ。

スポンサーリンク
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


興味があるところを読む