マイコン工作実験日記

Microcontroller を用いての工作、実験記録

LLSモードを試してみる

2014-11-23 15:50:25 | FRDM
Cortex-M0は低消費電力が売り文句のひとつですが、これまで消費電流を調べるような実験はしたことなかったので、この機会にFRDM-KL25Zで実験してみることにしました。



FRDM-KL25Zではボード上に電流計測用のジャンパとしてJ4が用意されています。このジャンパでの電流計測を有効とするためには、ジャンパのすぐ脇にあるR73とR81を取り外してやる必要があります。ここで測れる電流はボード全体の消費電流ではなく、KL25Z部分の消費電流だけを測ることに注意しておきましょう。測定値にはボード上にあるLEDや加速度センサー、あるいは追加した気圧センサーで消費される電流は含まれません。




まずは先週作成したソフトでの消費電流を測定。



3.66mAです。クロック設定はFEIの20.97152MHz。ほとんどの時間はWFIによりWAIT (ARM的にはSleep)状態ですが、この位消費しています。クロック速度落とせばもう少し減るのでしょうが、今回はLLS(Low Leakage Stop)モードを使ってさらに落とすのを確認するのが目的なので、クロック速度低減の実験は省略。

LLSモードを使うとM0+コアはDeep Sleep状態に遷移するので、これから抜け出すにはWakeupさせる必要があります。前回の実験ではLPS25Hからの1Hz更新の割り込みをPTD4端子で受けていましたが、このPTD4はWakeup信号入力端子としても使えます。そこでPTD4を外部割り込みとしての機能割り当てから、Wakeup信号としての割り当てに変更するとともにソフトを変更しました。LLSモードを使うためのPEXの設定については、こちらの記事とほぼ同じです。ソフトウェアのメインループは次のようになります。
while (1) {
  Cpu_SetOperationMode(DOM_STOP, NULL, NULL);
  Cpu_SetOperationMode(DOM_RUN, NULL, NULL);

  (void) LPS25H_ReadReg(i2cmInfo, INT_SOURCE);
  regval = LPS25H_ReadReg(i2cmInfo, STATUS_REG);
  if (regval & P_DA) {
    LPS25H_ReadCont(i2cmInfo, PRESS_OUT_XL, (uint8_t *)&press, 3);
    cons_printf("Press: %x --> %d.%02d\r\n", press, press/4096, press_point(press & 4095));
  }
  if (regval & T_DA) {
    LPS25H_ReadCont(i2cmInfo, TEMP_OUT_L, (uint8_t *)&temp, 2);
    tempval = (int32_t) temp + TEMP_OFFSET;
    cons_printf("Temp: %d --> %d.%02d\r\n", temp, tempval/480, temp_point(tempval % 480));
  }
}

Cpu_SetOperationModeでDOM_STOPを指定することで、LLSモードに遷移させます。LPS25Hが割り込みを発生させると、それをトリガにWakeupします。直後に再度Cpu_SetOperationModeでDOM_RUNに設定しておきます。これを呼んでおかないと、SCB_SCRの設定がDEEP_SLEEPを許可したままなので、この後でI2Cでレジスタの読み出しやUSARTへの文字出力を行った際の割り込み待ちでWFIが発生して再度LLSに落ちてしまうためです。これで、電流値を測ってみると。。。



2.1μAとなりました。ガクンと落ちますね。

LPS25Hからの割り込みをトリガとして、KL25に割り込みをかけたりWakeupをかけたりしてみましたが、ここで気になったことがあります。
  • 割り込みをかけられる端子が限定される。Kinetisでは全てのGPIOポートから割り込みをかけられるわけではありません。KL25ではPTAとPTDのポートに限定されています。
  • Wakeupをかけられるポートも限定される。こちらの制約は珍しいことでもありませんが、主にPTCのポートがWakeup用に割り当てられています。
  • 割り込みにもWakeupにも使えるポートはPTD4とPTD6しかない。

こんな事情もあって今回はPTD4を使っています。80pinあっても両方に使えるポートが2つしかないとはちょっと驚きです。

LPS25H

2014-11-20 06:36:26 | FRDM
FRDM-KL25Zで実験してみるネタを探していましたが、少し前に秋月で新しい気圧センサーLPS25Hが発売されたので、こいつを使ってみることにしました。




メッシュ基板を使って配線すると配線作業はとっても楽になります。LPS25Hのとなりは、I2C EEPROMのAT24C1024Bです。気圧データの記録に使おうかと思います。どちらもI2Cで動かして、プルアップ抵抗はLPS25Hの基板上に実装されているものを使用。

LPS25Hを実際に見て感心したのは、その大きさ。もちろんパッケージも小さいのですが、気圧センスのための穴がとっても小さい。まさしくピンホールです。機能的には、FIFOを内臓しており連続計測データをFIFOにためておいて、必要な時に一度に読み出すことが可能です。加速度センサーと同じですね。さらにハードウェアで移動平均をとってくれるモードも用意されているので、ソフト側の負担を軽減できます。ほんと、一度設定してしまえば、あとはレジスタから読み出したデータをそのまま計測データとして使えちゃいます。

単にデータを読み出すだけではあまりに単純なので、今回は1HzのODRで割り込みをかけてもらいデータを読み出すことにしました。気圧データはレジスタから読み出した24ビットの値を4096で割るとhPa単位の値になります。温度の方はレジスタから読み出した16ビットの値を480で割ってから42.5を足すと℃単位の値になります。


TSSライブラリを使ってみる

2014-11-09 15:49:36 | FRDM
FRDM-KLリーズのひとつの特徴は、タッチセンサーを用いたスライダーがあることです。FRDM-KL25Zにあらかじめフラッシュに書き込んであるデモソフトにおいても、スライダーに指で触れることでLEDを白色にしてその明るさを変化させることができます。KL25ではTSI(Touch Sensing Input)という周辺機能を用いていますが、TSIのレジスタを設定するだけで簡単にスライダーが利用できるわけでもありません。そんな敷居の高さを感じてしまって、これまで実際にTSIを使ったことはなかったのですが、思い立って使い方を調べてみることにしました。

FreescaleではタッチセンサーのライブラリとしてTSSを提供しているので、まずはこのマニュアルを一通り読んでおくべきなのですが、導入のためのもう少し簡単なチュートリアルが欲しいところです。探してみると次のふたつが見つかりました。
  • まずはmcuoneclipseのこの記事です。PEXで用意されているTSSコンポーネントの設定の仕方が説明されています。タッチする位置によってLEDの色が変わるというもの。
  • こちらは動画でのチュートリアルです。PEXを使ってのプロジェクトの作成から設定、コンパイル実行までの一連の流れをひとおおり説明しています。PWMを使うことでタッチする位置に応じてLEDの明るさを変化させています。

確かにスライダーを使うために必要なTSSコンポーネントの設定箇所が示されてはいるのですが、変更の必要のないパラメータには一切言及されていないために、TSSの全体像もわからず単に「使ってみる」だけの典型的なハンズオンの流れです。やはりちゃんと理解するためにはTSSのマニュアルを読まないとパラメータの意味すらわからないということを改めて認識させられたのでした。

それでも、まずは自分の手を動かしてみるべきです。お手本をそのまま真似るだけでは面白くないので、ちょっと自分流にアレンジしてみました。まずは使用するコンポーネントですが、今のPEXではPWMというLDD (Logical Device Driver)が使えるので、3色LEDを3つのPWMコンポーネントでドライブすることにします。PEXにはRTOSであるMQX Liteもコンポーネントとして含まれていますので、これも使用。そしてメッセージ出力用にSerialのLDDも追加してあります。



TSSの設定は動画のチュートリアルとほぼ同じです。スライダからは0から99までの100段階の値を出力させる設定です。



PWMの設定は次のようになっています。周期を200usと指定してやれば、それに応じたタイマへの設定値を求めて、適切なコードを生成してくれるのでラクチンです。



MQX Liteを使って TSS_taskとReport_taskのふたつのタスクを走らせています。今回はTSSを別のタスクに分けるほどのものでもありませんが、今後のために試しておこうという次第。TSS_taskは TSSライブラリの初期化を行って、その処理ループであるTSS_Taskを呼び出すだけの簡単なものです。連続してTSS_Taskを呼び出していると、センサの感度が良すぎてちょっとしたことですぐに移動のイベントを検出してしまうので、わざとディレイを入れてみました。システムタイマは1チック5msに設定していますので、2チックで10msのディレイに相当します。



TSSライブラリは登録された部品で変化が生じたことを検出すると、関連付けられたコールバックを呼び出してくれます。検出されたイベントに応じてその処理を書いてやるわけですが、ここではスライダの動きだけでなく指がタッチされたことと、離されたことも検出してメッセージを送ることにしました。



ReportTask側ではメッセージを受信して、それに応じてLEDを変化させるとともにシリアルコンソールにメッセージを出力します。タッチされた位置に応じてPWMのデューティを変化させてやることで明るさを変化させてます。デューティはusec単位で指定できるAPIを使っています。またリリースを検出するとごとに操作対象のLEDを変更しています。



コンソール出力は、こんな感じ。



このようにPEXを使うことで比較的簡単にタッチセンサをスライダとして使うソフトを、MQX Liteを用いてマルチタスク化して作れることがわかりました。そのうちにもう少しちゃんとTSSライブラリのマニュアルを読んで、各種機能も試してみたいものです。



仕切り直す

2014-11-02 12:18:44 | FRDM


以前、FRDM-KL25Zに誤ってELFファイルを落としてしまい、ボードを潰してしまったことを記事にしました。近頃、その機能と値段からFRDM-KL25をもっと見直しても良いと感じたので、改めてこのボードをもう少しちゃんと使ってみようと思います。FRDMのボードも今では各種でており、embed対応のものも複数あります。わたしも、ついついポッチってしまった積み基板が何枚もあるのですが、まずは基本に戻ってKL25Zから使ってみて、その後 順次他の基板も使ってみようかと考えています。今になって、この基板を見直してたのは次のような理由からです。
  • 値段が手頃。RSオンラインにて1500円で買える。Nucleoと同等のお値段。
  • 80ピンのKL25Z128VLKが載っている。ピン数が多いので、拡張性が期待できる。
  • OpenSDAファームの書き換えによってJ-Link化できる。

これまでM0としてはLPC1114とかLPC800とかを使ったことがありますが、それらと比べるとKL25は機能的にも豊富なことも大きな魅力です。Processor Expertを使うことで面倒なクロック設定やポート設定を大幅に省力化することができるし、DMAを手軽に使えるのもなかなかに便利です。そういうわけで、今後の作業に備えて、まずはJ-Link化する作業を実施。手順は次のとおりです。
  1. SEGGERからOpenSDA用のファーム(JLink_OpenSDA.sda)をダウンロードしておく。
  2. KL25Zボードのリセットボタンを押した状態で、USBをPCに接続してBootloaderモードで立ち上げる。
  3. BOOTLOADERディスクに、ダウンロードしておいたファームをドラッグ&ドロップして書き換え。
  4. USB挿し直して、リブートして作業完了。

ファーム書き換えてもUSB CDCによるVCOM機能は有効ですので、USBポートを1) 電源、2)JTAG, 3)VCOMの3つの用途で使えます。J-LinkはMac OSからも使えるのですが、PEX(Processor Expert)やKDS(Kinetis Design Studio)が未だにMac OS対応していないのが辛いところ。PEXの手軽さを覚えてしまうと、これ無しでやっていく気にもなれないので、止むを得ずにWindowsを使っていくことにします。Freescaleさんには、できるだけ早期にMac OS対応していだきたい!!