Power management - 省電力化 (LPC1768/LPC1769)
.
mbed LPC1768/LPC1769 の 省電力化
mbed LPC1768 は標準状態で約135mA、LANを使うと約200mAの電流が必要。
LANを使うシチュエーションでは、同時にACアダプター等で電源を取れるだろう。
独立してバッテリー駆動させたいとき、このままでは電流を食い過ぎる。
電流をおさえ、省電力化する方法を試す。
ソーラーパネル(太陽電池)やリチウムイオン電池などでの駆動も現実的。
全てやると全体の消費電流が 35mA になります。
参考
http://mbed.org/cookbook/Power-Management
Import programPowerControl
see http://mbed.org/users/no2chem/notebook/mbed-power-controlconsumption/
sleep の利用
単純なCPUスリープ。
割込み等ですぐに復帰する。
省電力効果: - 6 mA
#include "mbed.h" #include "PowerControl/PowerControl.h" int main() { while (1) { Sleep(); } }
参考
CPUクロック周波数を下げる
クロックダウンして消費電力をおさえる。
それほどCPUパワーを使わないアプリケーション向け。
PLL0 の出力 Fcoo=288MHz になっているので、CPU Clock Divider によりCPUクロック(CCLK)を決定する。
// LPC_SC->CCLKCFG = 2; // 96MHz LPC_SC->CCLKCFG = 5; // 48MHz // LPC_SC->CCLKCFG = 7; // 36MHz SystemCoreClockUpdate(); printf("%d Hz\r\n", SystemCoreClock);
Main Clock | M | N |
---|---|---|
120MHz | 15 | 1 |
96MHz | 12 | 1 |
72MHz | 9 | 1 |
48MHz | 6 | 1 |
Information
クロックを変更すると、シリアル等のボーレート、タイマーのタイミングに影響する。
シリアルであれば、クロック変更後に baud() で同じボーレートを再設定すればよい。
タイマー関係は us_ticker ので使用されている値を再設定する。
LPC_TIM3->PR = (SystemCoreClock / 4 / 1000000) - 1; // LPC1768
参考
CPU内蔵 周辺デバイスの停止
タイマーやシリアル、USB、LAN、CAN等のCPUに内蔵されている機能を個別に停止する。
省電力効果: - 5 mA (I/O以外全部停止)
#include "mbed.h" #include "PowerControl.h" int main() { Peripheral_PowerDown(0xFFFF7FFF); while (1); }
参考
- http://mbed.org/users/no2chem/notebook/mbed-power-controlconsumption/
- http://mbed.org/cookbook/Power-Management
- Peripheral_PowerDown の引数の各ビットがデバイスに対応している。
Ethernet PHY チップ停止
Ethernet (LAN) のハードウェア層の制御をするPHYチップ (DP83848C) を停止する。
ネットワークケーブルも接続しない。
省電力効果: - 40mA (ネットワークケーブル未接続の状態から)
#include "mbed.h" #include "EthernetPowerControl.h" int main() { PHY_PowerDown(); while (1); }
LPCXpresso LPC1769 CMSIS-DAP の場合
PHYが LAN8720A のとき
#include "ethernet_api.h" : int eth_phy_write(unsigned int PhyReg, unsigned short Data) { unsigned int timeOut; LPC_EMAC->MADR = 0x0100 | PhyReg; LPC_EMAC->MWTD = Data; for(timeOut = 0; timeOut < 0x00050000; timeOut++) { if((LPC_EMAC->MIND & (1<<0)) == 0) { // busy? return 0; } } return -1; } int main () { : if (!ethernet_init()) { eth_phy_write(0x00, (1<<11)); // LAN8720A Power Down ethernet_free(); }
参考
- mbed Power Control/Consumption (by no2chem)
- LPCXpresso1769 (OM13085) をmbed化する (by MACRUM)
- rev D1 からJP4をショートすればISPモードで起動する
mbed interface を停止する
PCと接続してプログラミングするためのUSBポートを停止する。
「magic USB interface chip」「mbed interface」などと表記されている。
いわゆる裏側のチップ。
あらかじめファームウェアの変更が必要。(下記参照)
最新のファームウェア(rev 16457 以降)に変更が必要。(下記参照)
省電力効果: - 27 mA
#include "mbed.h" #define USR_POWERDOWN (0x104) int semihost_powerdown() { uint32_t arg; return __semihost(USR_POWERDOWN, &arg); } int main() { semihost_powerdown(); while (1); }
参考
http://mbed.org/users/simon/notebook/interface-powerdown/上記ページのファームウェア mbedMicrocontroller_ExperimentalPowerdown.if を書き込む。- 標準のファームウェアに統合された。(下記)
- 上記ページのファームウェア mbedMicrocontroller_00000.if を書き込む。
- いったんmbedの電源を切り、再度電源を入れる(power-cycle)とファームウェアが書き換えられる。
- 念のため、もう一度電源をoff/onする。
- プログラムを書き込む。
- いったんUSBを停止すると、PCへ接続しても認識しなくなる。 そのときは電源を切り、リセットボタンを押したままPCとUSBを接続し、電源を入れる。
LEDを消灯する
LED点けっぱなしは、けっこうばかにならない。
PWMで減光や、間欠点灯にすることを検討する。
省電力効果: - 2 mA
電源電圧を下げる
mbed は基板上のシリーズレギュレーター(3端子レギュレーター)で3.3Vを作って動いている。
VINに加える5Vとの差は熱に変わるだけでもったいない。
VINへ4Vを供給する。
省電力効果: - 4 mA (元の電流が低ければ差は小さくなる 0~-4mA)
よく考えると、シリーズレギュレーターは抵抗器とみなすことができるので、電流値がさほど変わるわけはない。。。
レギュレーターのドロップ電圧が1Vくらいあるので、CPUは3Vくらいで動いてるかも。
データ
電源5VをVINに加えた時のデータ。
LANのトランス内臓コネクタのみ接続。(ケーブル未接続)
状態 | 電流 (mbed LPC1768) | 電流 (DDKARM10 LPC1769) |
---|---|---|
ノーマル | 134mA | 102mA |
スリープ | 128mA | 81mA |
CPUクロック 48MHz | 112mA | |
周辺デバイス停止 | 129mA | 80mA |
Ethernet PHY停止 | 94mA | 62mA |
mbed interface停止 | 107mA | - |
PHYとmbed interface停止 | 64mA | - |
48MHz、PHY・mbed interface・周辺デバイス停止・スリープ | 35mA | 27mA |
電源電圧を下げる | 130mA | - |
※正確には、電流は流れるもので、消費するのは電力です・・・
※ LEDの電流もけっこうばかにならない。 Power LED 約2mA
1 comment on Power management - 省電力化 (LPC1768/LPC1769):
Please log in to post comments.
これはいいっす。mbedを使ってandroidアクセサリを作りたいので、省電力出来れば出来るほどうれしいっす。 情報ありがとうございます