前回記事では、Low Power Timerというモジュールをつかって、一定間隔で、呼ばれる関数を割り込み処理で実現しました。実は、このタイマはただのカウントアップタイマーだけではなくて、指定のピンにHIGH・LOWのパルス波形を与えてやれば、そのパルスをカウントしてくれます。
今回の記事では、その使い方を簡単に紹介します。実際の例は、下のイラストみたいな感じで、パルス入力用のピンにLOW/HIGHをプッシュボタンで切り替えてやり、その信号の立下りをカウントアップします。
基本的なLPTMRの使い方は前回記事で説明してるので、パルス入力モードの設定で必要なとこだけをまとめてみます。
まず、LPTMRの設定を行うCSRレジスタのマーカ部分を設定します。
パルス入力モードをONにする
bit1のTMSを1にセットするとパルス入力モードになります。前回はここを0にしてました。
立ちさがり?立あがり?どっちでカウントするか決める
プッシュボタンを押すと、GNDに落ちるので、立下りでカウントアップにします。
パルスの入力ピンを設定する
LPTMR0のパルス入力モードを使えるピンは決まってます。ここでは、Input2というのを設定してますが、これだけだと、何のことか分かりません。
RMの別の箇所で、Input0~3が使用するボードの信号名の何に相当するかというのがどこかに書かれているはずで、K64Fの場合は、LPTMR_ALT2_pinというのに割り当てられていることがわかります。下のキャプチャがそれです。
回路図をみると#77pinのPTC5につながってるみたいす。
ピンを割り当てる
レジスタを直接設定してもいいですが、せっかくなので、pinコンフィグツールを使います。ツールを起動して、下のpinリストから77にチェックをいれて、LPTMR0_ALT2を選択して、コードに反映します。
すると、pin_mux.cに下のコードが追加されているはずです。PORTCの5番ピンをAlt3に割り当てられた機能(LPTMR0_ALT2)として、使いますよ的な設定をするAPIです。
/* PORTC5 (pin 77) is configured as LPTMR0_ALT2 */
PORT_SetPinMux(PORTC, 5U, kPORT_MuxAlt3);
マルチプレクサ方式といって、一つのピンで設定次第で色々な機能を使えるようにしているため、こんな形で初期化します。今回、FRDM-K64Fで使う#77ピンは、下表のようにALT3にLPTMR_ALT2が割り当てられていることがわかります。
カウンタを初期化する
RMを詳しくよめば、出ているかもしれませんが。最初、どうしても、カウンターが動作しませんでした。試行錯誤して、メインループに下の一文をいれたら、正常に動作するようになりました。
LPTMR0->CNR=0;
ちょっと理屈が分かってないですが、動いたからいいやと思って、そのままです。
基本的に設定する箇所は以上になります。参考にサンプルコードを貼っておきます。ボタンでは、1pushすると、2~3ぐらい一気にカウントアップされてました。SWのバウンスか、ノイズかは、生波形みてないので、不明ですが、パルスのノイズ除去用のフィルタ(グリッチフィルタ)も使えるので、使う信号にノイズがのっていれば、これを使えそうです。
/*
Low power timer sample count up
*/
/**
*/
#include <stdio.h>
#include "board.h"
#include "peripherals.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "MK64F12.h"
#include "fsl_debug_console.h"
//ここでライブラリを読み、APIを利用できるようにする
#include "fsl_lptmr.h"
/**********************************************************************
Definitions
***********************************************************************/
/***********************************************************************
Variables
***********************************************************************/
volatile uint32_t swcounter = 0U;
/*
* @brief Application entry point.
*/
int main(void) {
/* Init board hardware. */
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
/* Init FSL debug console. */
BOARD_InitDebugConsole();
// lowpowerタイマーの設定用の構造体を宣言する
lptmr_config_t lptmrConfig;
// GetDefaultで構造体に一般的な値を代入、変更したければ、この後変える。
LPTMR_GetDefaultConfig(&lptmrConfig);
//pulse count mode
lptmrConfig.timerMode=kLPTMR_TimerModePulseCounter;
lptmrConfig.pinSelect = kLPTMR_PinSelectInput_2;
lptmrConfig.pinPolarity=kLPTMR_PinPolarityActiveLow;
lptmrConfig.enableFreeRunning=true;
//lowpower timerの初期化関数をよぶ
LPTMR_Init(LPTMR0, &lptmrConfig);
//タイマースタートする
LPTMR_StartTimer(LPTMR0);
//enable clock for PORTC
while(1)
{
LPTMR0->CNR=0;
swcounter = LPTMR0->CNR;
}
return 0 ;
}
ちなみに最初のGIFファイルはwhile内のswcounterを表示したものになります。
以上です。リレーのSW回数やホールICで回転速度をだしたり、色々とつかえそうです。