G13であれこれ

興味があるところを読む

RL78/G13の消費電流を測る

2019/4/4
どの程度の省エネCPUか調べてみた。
使ったCPUは秋月の R5F100LGAFB  ROM128K, RAM12K, 64PIN 。
サブクロック発生用にEPSONのRX8900(2.5~5.5V/ 0.7μA)のFOUTを使ってる。

電圧:3V(低速メインモード1.8~5.5V)。
メインクロック(CPU・周辺用):オンチップOSC fCLK=1Mhz。
サブクロック(RTC・WDT・12bitIT用):RX8900のFOUTで fSUB=32.768KHz。
周辺はUART、AD(+コンパレータ)、IT12を使用(WDTはSTOP中はカウント停止)。
空きポートの処理はしてない。
G13内蔵のRTCの定周期(およびALARM)INTRで目覚める設定にして実験した。

周辺停止+stop中は1.8μA。
RTCで目覚め、UART+AD(+コンパレータ)+I2CをONにすると750μA。
ただ、何かの拍子に消費電流が多くなることがある(下図は自作の微少電流計で計測)。
ソースはこんな感じ。
void MyStop(void)
{
    // 寝る前に電気食いを止める
    R_UART0_Stop();  // uart
    R_ADC_Stop();    // ad
    R_ADC_Set_OperationOff(); // コンパレータも止める
    R_IT_Stop();     // it12
    // CPUをSTOP → RTCの定周期(およびALARM)INTRで目覚める
    STOP();
    // 目覚めたら電気食いを起こす
    R_UART0_Start(); // uart
    R_ADC_Start();   // ad
    R_ADC_Set_OperationOn();  // コンパレータ動作許可
    R_IT_Start();    // it12
    R_WDT_Restart(); // wdtはリセットしておこう
}

微少電流を測る作戦

3.3Vに負荷50Kを繋いだときの消費電流は 3.3÷50.000K=0.066mA=66μA なはず。

この50Kに100Ωの抵抗を直列に入れて、テスターで①の電圧を測ると 6.6mVになった。分圧の自動計算ページより 3.3 - 3.2934 = 6.6mV・・・合ってる。ってことは 

100Ωを使い①で電圧を測り、その値を10倍すれば電流値になる。

6.6mVと表示されたら66μA

10.0mVと表示されたら100μA

100.0mVと表示されたら1000μA=1mA

もし10Ωを使うなら 

0.6mVと表示されたら60μA

6.0mVと表示されたら600μA

60.0mVと表示されたら6000μA=6mA

と読み取る。だよね。


※このテスターの最小レンジは0.1mVなので 100Ωが良さげ。
 10Ωだと 0.6mV=60μA  0.1mV=10μA・・・最小レンジ以下は測れない
 100Ωだと 6.6mV=66μA  1.1mV=11μA ・・・ これなら1μA単位まで読み取れる

※シャント抵抗の 値がでかいけど、負荷との差が大きいからOKってことで。
 もし100Ωを繋いだとしても 3.3÷50.100K=0.0658mA=65.8μAだから大差無く測れる。
 負荷の抵抗値が大きいなら(=消費電流が微少なら)、シャント抵抗をでかくすれば測れる。

※シャント抵抗と負荷の消費電流による電圧低下について。
 100Ωだと 100 × 0.001(1mA) = 0.1V低下・・・1mA以下を測るなら100Ωを使う。
 10Ωだと 10 × 0.01(10mA) = 0.1V低下・・・10mA                 〃                 10Ωを使う。
 1Ωだと 1 × 0.1(100mA) = 0.1V低下・・・100mA                    〃                 1Ωを使う。

ADを一番簡単に使う

「単純に電圧を読み出したいだけ」と言う使い方なら、割込みも要らないし変換完了フラグを調べる必要も無い。

プログラムでAD変換を開始して、少し待って読み出すだけ・・・こんな使い方も結構ありますよね。

UARTの速度

微少電流計を作ったので、G10で試しに2Mbpsを試したら、普通に通信できてる。
↓以下の記事では800Kbpsと書いてますが、実験では2Mbpsまで大丈夫なようです。

2019/7/17
秋月の R5F100LGAFB  (RL78/G13: ROM128K,RAM12K,64PIN)を使ってUARTの速度を調べた。
PCとの接続には秋月のシリアル変換ケーブル TTL-232R の5Vタイプを使った。
このケーブルに内蔵されているRS232ドライバの限界速度が900Kbps近辺らしいんで、G13から送信可能な最高速度で選べるのは800Kbps(内蔵OSC8MHz時)。
800Kbpsってことは、10bit/1byteとして80Kbyteだから、1秒間に80,000byte送信できるって事かな。

G13側のコードはこれだけど、50byteずつ連続送信してるだけ(100~200byteにしても転送速度に変わりはなかったが、10byteにすると速度がバラつく)。
#define CNT   50
void test(void)
{
    uint8_t tx[CNT], i;
    for (i=0; i<CNT; ++i) tx[i] = i;
    while (1) {
        MF_R_UART0_Send(tx, CNT);
        while (MF_IsTxEnd() == FALSE) NOP();
        // メインクロック8MHzでUART=800Kbps
        // この速度でPC側は問題無く受信可能だ(実験済み)
        // ↓Delayナシで7000~7250byte、有りで3000byteを送信する
        //DelayMsec(1);
    }
}
PC側は100msのインターバルタイマーによる連続読み出しで、100ms毎に7,000~7,250byteを受信してる。

ってことは、1秒間に約70,000byte、設定したボーレートに結構近い値だから、G13は頑張ってる感じかも。

なおRTS制御はナシ、受信エラーハンドラは追加してるが、エラーは発生していない。
        // Timer1(100msインターバル) 
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true) {
                int rxcnt = serialPort1.BytesToRead;
                if (rxcnt > 0) {
                    serialPort1.Read(rxbuf, 0, rxcnt);
                    ListDisp(rxcnt.ToString());
                }
            }
        }

無線センサ

こちらに移動しました。
スポンサーリンク
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


興味があるところを読む