こんにちは。D2の小西です。
かなり長い間記事を書いておらず、久々の投稿になります。
とりあえず、この備忘録も今回で一旦キリが良いところまで来ました。
<プログラム内容>
本プログラムでは、LPM(Low Power Mode)ごとの違い、DACの使い方、IOピンによる割り込み、について触れる。DAC1にはA0~A2(ADC)の平均値が直接出力され(最もシンプルな入出力関係)、DAC0にはTimerBに紐づいた内部カウンタを利用したアナログ三角波電圧が出力されアナログ的にLEDを調光する。
GPIOピン(P2.4の押しボタン)の立ち下がり割り込みによって入るLPMを切り替える。LPM3ではDCOが停止するため、TimerBのクロックソースもLFXT1Sに切り替える。LPMごとにLEDの調光周波数を変化させて、現在のモードを可視化する。
P5.4 -> MCLK.....; MCLKを出力・監視
P5.5-> SMCLK....; SMCLKを出力・監視
P5.6 -> ACLK.....; ACLKを出力・監視
・Low Power Mode:LPMとは、プロセッサの消費電力を抑えるために、不必要なときには高速なクロックシステム自体を停止させる動作モードのことを指す。モードによって停止するクロックシステムの深度が異なり、より多くのクロックを停止させた方が消費電力を抑制できる。
MSP430F2619のLPMとクロックシステムの可否の対応を下記に示す。
Mode Enable / Disable
Active CPU, MCLK, SMCLK, DCO Nothing
LPM0 SMCLK, DCO CPU, MCLK are disabled
LPM2 ACLK, DC generator CPU, MCLK, SMCLK, DCO are disabled.
LPM3 ACLK CPU, MCLK, SMCLK, DCO are disabled. DC generator disabled.
LPM4 Non active CPU and all clocks disabled
MSP430x2xx Family User's Guide.pdfには、“2.4 Principles for Low-Power Applications Often, the most important factor for reducing power consumption is using the MSP430 clock system to maximize the time in LPM3.“、とある。すなわち、制御周期中にいかに長時間LPM3に潜ることができるかが低消費電力システムを構築する要である。
ピン配置と役割は以下の通り。
P2.4 -> Push Botton...; 割り込みトリガ用プルアップ押しボタン
P4.0 -> Yellow LED....; TimerBを出力する(ここがLPM復帰のトリガとなる)
P4.1 -> Red LED........; LPM3のときだけ点灯する(ステータス表示)
P4.2 -> Blue LED.......; LEDを調光する三角波がUp modeのときだけ点灯する
P4.3 -> Green LED.....; LPM0のときだけ点灯する(ステータス表示)
P5.4 -> MCLK.....; MCLKを出力・監視
P5.5-> SMCLK.....; SMCLKを出力・監視
P5.6 -> ACLK......; ACLKを出力・監視
P6.0 ~ P6.2 -> 可変抵抗を入力..; ADC入力
P6.6 -> DAC0.....; ADCの変換結果を直接出力する
P6.7 -> DAC1.....; TimerBのカウンタを利用して、アナログ三角波電圧を出力する
まずはフローチャート
|
TimerBのコンペアマッチが発生すると、LPMから脱出してActive Modeに戻ってくる。アップモードかダウンモードかに従ってTimer counterの値をインクリメント/デクリメントして、アナログ的に三角波を生成する。LPM中にボタン(P2.4)が押されて入れれば、フラグを切り替えて次に入るLPMを切り替える。
|
次に、回路図。
|
可変抵抗の中間電位をA0~A2に入力してアナログ指令値を得る。DAC0、DAC1、ポート4に各種LEDを接続する。
|
また、実験風景。
|
各LEDの役割は図に示した通り。
|
実験の様子を撮影した動画・結果
左上のプルダウンボタンを押すことでLPM0->(0:06)->LPM3->(0:11)-> LPM0->(0:14)-> LPM3と切り替えている。()内の数字は動画のタイムスタンプを表している。
下記はLPM0のときとLPM3のときの測定結果です。LMP0に入ったときは、MCLKは停止しているがSMCLKは動作している。また、LPM3に入ったときは、MCLK, SMCLKともに停止しており、低消費電力に動作しようとしている。
|
LPMode_FLAG = 0 (LPM0) LPMode_FLAG = 1 (LPM3)
|
サンプルコード
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Blog: DAC, LPM(GitHub Gist)↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
前回の備忘録1,2でも触れた内容については触れず、新しく出てきたところだけ触れていきます。
<52~67行>
54. DAC12_1CTL |= DAC12SREF_2 + DAC12IR + DAC12AMP_2;
55. DAC12_0CTL |= DAC12SREF_2 + DAC12IR + DAC12AMP_2;
DA変換器に関する初期設定
( U. G. P.588 25. DAC12_xCTL, DAC12 Control Register ) ・DAC12SREFx : DACに使用する基準電圧を選択する
00 VREF+ 01 VREF+
10 VeREF+ 11 VeREF+
・DAC12IR : 許容できる入力電圧の範囲を指定する
0: DAC12 full-scale output = 3x reference voltage
1: DAC12 full-scale output = 1x reference voltage
・DAC12AMPx : DAC12の入力および出力アンプのセトリング時間と消費電流を選択 Input Buffer Output Buffer
000 Off DAC12 off, output high Z
001 Off DAC12 off, output 0 V
010 Low speed/current Low speed/current
011 Low speed/current Medium speed/current
100 Low speed/current High speed/current
101 Medium speed/current Medium speed/current
110 Medium speed/current High speed/current
111 High speed/current High speed/current
66. DAC12_1DAT = 0x000; ・DACの出力電圧を決定するレジスタ
DAC12SREFで指定した基準電圧を4095=2^12-1として、"所望の電圧÷Vref×4095" を指定する。
<71~81行>
73. ADC12CTL0 = SHT1_3 + SHT0_3 + REFON + ADC12ON + MSC;
・複数のチャンネルをまとめて変換させるときはMSC(Multiple sample and conversion)ビットを立てる。
80. ADC12MCTL3 = SREF_1 + INCH_10 + EOS;
・複数のチャンネルをまとめて変換させるとき、使用する最後のMCTLxに
EOS(End of Sequence)ビットを立てる。
<91~115行>
103. P5SEL |= MCLK | SMCLK | ACLK;
・GPIOのI/Oピン以外の機能を使用する
111. P2IE |= P2LPM; // P2.4 interrupt enabled [JP10]
・ポート2の4番ピンの割り込みを許可する
112. P2IES |= P2LPM; // 0: low-to-high edge 1: high-to-low edge
・割り込みのトリガ極性を指定する。
113. P2IFG &= ~P2LPM; // P2 IFG cleared
・割り込みフラグのクリア
<193行~>
202. __bis_SR_register(GIE); // 汎用割り込み許可
・割り込みを使ってLPMから復帰することがほとんどなため必須
206. DAC12_0CTL |= DAC12ENC; // DAC go working
・DACを起動・使用可能にする。 停止させれば低消費電力が図れる。
<302~313行>
304. __bis_SR_register(LPMx0_bits + GIE); // Enter LPM0 w/ interrupts
・LPMxに入るときのコマンド。 おそらく、この1行を実行した段階でLPMに入り、
while文の中ではあるがこのコマンドの行でLPM復帰待ち状態で停止する。
以上。
-------------------------------------------------------
これで、MSP430シリーズの最大の売りである低消費電力/LPMを使えるようになりました。
次回は続くかどうかは分かりませんが、I2Cやシリアル通信なんかを使って周辺素子と接続できればなと思います。