はじめに:MSP430が省電力で選ばれる理由
MSP430は、Texas Instruments(TI)の16bit超低消費電力マイコンファミリです。1990年代から続く実績あるシリーズで、「電池1個で何年も動かす」ような極限の低消費電力アプリの定番として、電力量計・水道メーター・環境センサー・ウェアラブル・医療機器などに広く使われてきました。
MSP430の強みは、(1) 待機時数百nA〜数µAという圧倒的な低消費電流、(2) 割り込みからの高速ウェイクアップ、(3) 不揮発メモリFRAMを内蔵した品種、の3点です。本記事では、MSP430で電池駆動機器を設計するための低電力モード・クロック設計・FRAM活用・周辺実装を入門者向けに解説します。
テクノスフィアでは、電池駆動のセンサーノードや計測機器の 組込み受託開発 を多数手がけています。低消費電力設計は STM32の低消費電力モード でも解説しており、デバイス特性に応じて最適なマイコンを選定しています。
開発環境(CCS / DriverLib)
| 要素 | 内容 |
|---|---|
| 統合開発環境 | Code Composer Studio(CCS)。Eclipseベース、無償 |
| ライブラリ | MSP430Ware / DriverLib(周辺ドライバAPI) |
| 簡易開発 | Energia(Arduino互換、試作向け) |
| 評価ボード | LaunchPad(MSP-EXP430シリーズ)。オンボードデバッガ付き |
| 消費電流計測 | EnergyTrace(CCS統合、リアルタイムに電流/エネルギーを可視化) |
特にEnergyTraceはMSP430開発の強力な武器です。コードを動かしながら消費電流・エネルギーをリアルタイムにグラフ表示でき、「どの処理で電気を食っているか」を一目で把握できます。低電力設計の最適化に必須のツールです。
低消費電力モード(LPM)の全体像
MSP430の心臓部は、きめ細かい低電力モード(Low Power Mode)です。処理がないときにいかに深く眠るかが平均電流を決めます。
| モード | 動作 | 典型用途 |
|---|---|---|
| Active | CPU・全クロック動作 | 演算・通信中 |
| LPM0 | CPU停止、MCLK停止、SMCLK/ACLK動作 | 周辺が動く短い待ち |
| LPM3 | 高速クロック停止、ACLK(32kHz)のみ。数µA級 | 最も実用的な待機モード |
| LPM4 | 全クロック停止。外部割り込みで復帰 | イベント待ち |
| LPM3.5 / LPM4.5 | 大半の電源を遮断。RTCや一部のみ保持 | 超長期スリープ(nA級) |
基本設計は「LPM3で眠り、割り込みで起きて処理し、また眠る」です。CCSではビット操作マクロでモードに入り、割り込みハンドラ内で __bic_SR_register_on_exit() によりウェイクアップします。
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグ停止
PM5CTL0 &= ~LOCKLPM5; // GPIO設定をアンロック(FR系)
// ... クロック・タイマ・周辺の初期化 ...
__bis_SR_register(GIE); // 割り込み許可
while (1) {
__bis_SR_register(LPM3_bits); // LPM3 へ(ここで眠る)
// 割り込みで起きると続きが実行される
do_periodic_task();
}
}
// タイマ割り込みでウェイクアップ
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
__bic_SR_register_on_exit(LPM3_bits); // mainをLPM3から復帰させる
}
クロックシステムと省電力設計
MSP430は複数のクロックソースを持ち、用途別に使い分けることで電力を最適化します。
- ACLK:低速(典型32.768kHz)。LPM3でも生き続け、RTCや周期ウェイクアップに使う
- SMCLK:サブシステムクロック。周辺(タイマ・シリアル)の駆動に使う
- MCLK:CPUクロック。DCO(内蔵発振器)から供給。処理時のみ高速にする
省電力の鉄則は「必要なときだけ速く、普段はACLKで眠る」です。周期動作のタイミングはACLK駆動のTimer_AやRTCで作り、CPUはLPM3で止めておきます。DCOの周波数も必要最小限に設定します。
FRAM内蔵品の活用
MSP430FRシリーズ(FR2xx/FR4xx/FR5xx/FR6xx)は、プログラム・データ領域に不揮発メモリFRAMを採用しています。フラッシュと比べた利点は次のとおりです。
| 項目 | フラッシュ | FRAM |
|---|---|---|
| 書き込み速度 | 遅い(ブロック消去が必要) | 速い(バイト単位で即書き込み) |
| 書き込み電力 | 大きい(昇圧が必要) | 小さい |
| 書き換え回数 | 1万〜10万回程度 | 10^12〜10^15回(事実上無制限) |
| 向く用途 | プログラム格納 | 頻繁なデータ保存・ロギング |
このため、データロガーや「電源断時に状態を即保存したい」機器でFRAMは絶大な効果を発揮します。変数に __persistent 属性を付ければ、リセットや電源断をまたいで値を保持できます。
eUSCIでUART・I2C・SPI
MSP430の通信はeUSCI(enhanced Universal Serial Communication Interface)で行います。eUSCI_AがUART/SPI、eUSCI_BがI2C/SPIに対応します。DriverLibを使うと設定が簡潔になります。
#include <ti/devices/msp430/driverlib/driverlib.h>
/* UART 115200bps(SMCLK使用、設定値はBaud Rate Calculatorで算出)*/
EUSCI_A_UART_initParam p = {0};
p.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
p.clockPrescalar = 8; // 例:SMCLK 16MHz → 115200
p.firstModReg = 10;
p.secondModReg = 0xF7;
p.parity = EUSCI_A_UART_NO_PARITY;
p.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
p.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
p.uartMode = EUSCI_A_UART_MODE;
p.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;
EUSCI_A_UART_init(EUSCI_A0_BASE, &p);
EUSCI_A_UART_enable(EUSCI_A0_BASE);
EUSCI_A_UART_transmitData(EUSCI_A0_BASE, 'A');
eUSCIのボーレート設定値(prescalar / modReg)はクロック周波数に依存します。TIが提供する「MSP430 USCI/eUSCI UART Baud Rate Calculator」で算出するのが確実です。手計算ミスは文字化けの主因になります。
電池駆動を実現する設計パターン
電池1個で年単位動作させるための定石をまとめます。
- デフォルトはLPM3で眠る。Active時間を極小化する
- 周期処理はACLK駆動のTimer_A / RTCで起こす(CPUを使ってポーリングしない)
- 未使用GPIOは出力Lowか入力プルダウンで固定し、フローティングによる漏れ電流を防ぐ
- センサーへの電源はGPIOやロードスイッチでゲートし、測定時だけ通電する
- 頻繁な保存はFRAMへ。フラッシュ書き込みの電力浪費を避ける
- EnergyTraceで実測し、想定外の電流スパイクを潰す
たとえば「10秒に1回、温湿度を測ってFRAMに記録し、1時間に1回まとめてLoRaで送信する」センサーノードなら、平均電流を数µA〜数十µAに抑えられ、コイン電池でも年単位の動作が現実になります。
よくあるトラブルと対策
| 症状 | 主な原因 | 対策 |
|---|---|---|
| LPMに入っても電流が下がらない | GPIOフローティング・周辺の停止漏れ | 未使用端子を固定。使わない周辺は無効化。EnergyTraceで切り分け |
| FR系でGPIOが動かない | LPM5ロック未解除 | 起動直後に PM5CTL0 &= ~LOCKLPM5; を実行 |
| UARTが文字化け | ボーレート設定値の誤り | Baud Rate Calculatorで再計算。クロック源と一致させる |
| 割り込みで復帰しない | ISRでLPMビットをクリアしていない | __bic_SR_register_on_exit(LPM3_bits) を忘れずに |
| ウォッチドッグでリセット | WDT停止/定期クリア漏れ | 不要なら停止、使うなら周期的にクリア |
まとめ
この記事のまとめ
- MSP430はTIの16bit超低消費電力マイコン。電池駆動のセンサー・計測・ロガー機器の定番
- 基本設計は「LPM3で眠り、割り込みで起きて処理し、また眠る」
- ACLK(32kHz)で周期ウェイクアップを作り、CPUはLPM3で止めておく
- FRAM内蔵品は高速・低電力・高書き換え耐性でデータロギングに最適
- 通信はeUSCI(A=UART/SPI、B=I2C/SPI)、最適化はEnergyTraceで実測する
MSP430を使った電池駆動機器・センサーノードの開発でお困りのことがあれば、テクノスフィアにお気軽にご相談ください。低消費電力設計のPoCから量産まで一貫して対応します。
MSP430・電池駆動機器の受託開発
コイン電池で年単位動作するセンサーノード・計測機器・データロガーの低消費電力設計をテクノスフィアが対応します。PoCから量産・現場導入まで一気通貫。
よくある質問(FAQ)
低消費電力モード(LPM)はどう使い分けますか?
LPM0はCPU・MCLK停止でSMCLK/ACLKは動作、LPM3は高速クロックを止め32kHzのACLKと一部周辺だけ生かす最も実用的な省電力モード(数µA級)、LPM4は全クロック停止で外部割り込みのみ復帰、LPM3.5/4.5はさらに電源を落とす超低電力モードです。基本はLPM3で待機します。
FRAM品は何が違いますか?
MSP430FRシリーズは不揮発メモリFRAMを採用し、フラッシュより書き込みが速く低電力で書き換え回数も桁違いに多いです。データロガーや頻繁な設定保存に最適で、__persistent で変数を不揮発化できます。
UART・I2C・SPIはどう実装しますか?
eUSCIを使います。eUSCI_AがUART/SPI、eUSCI_BがI2C/SPIに対応し、Code Composer StudioとDriverLib(MSP430Ware)のAPIで実装できます。ボーレートはTIのCalculatorで算出します。