【SMTとは】
SMT (Signal Mesurement Timer)というモジュールは最新のF1ファミリに実装されたモジュールで、
24ビットのタイマ/カウンタを中心として動作し、カウンタ動作によるパルス計測や時間計測を行うことが
できるモジュールです。下記のような基本動作が可能となっていて、2組のモジュールを内蔵している
デバイスがありますから多くの応用が可能です。
SMTの大きな目的は、長時間のパルス計測の間、CPUをフリーにして他のことができるようにすること
です。これまでのTimer1やCCPで長時間パルスを計測する場合には、割り込み等でCPUが何らかの
処理をする必要がありましたが、これが必要なくなります。
@ 周期とデューティサイクルモード
外部入力信号の立ち上がりから立ち上がりまでのカウンタ値と、立ち上がりから立下りでまでの
カウンタ値を独立にキャプチャします。
これで入力信号の周期とHighのパルス幅(つまりデューティ)を計測できます。
A High、Low計測モード
単純に外部入力信号のHigh期間のカウント値とLow期間のカウント値を計測します。
B タイマモード
単純なタイマ動作で一定時間間隔の割り込みを生成します。24ビットタイマですから長時間の
インターバルが可能です。
C ゲート付きタイマモード
ゲート信号がHighの間だけ外部入力信号がActiveの時間をカウントします
D 窓周期計測モード
窓信号入力の周期を計測します。
E ゲート付窓制限計測モード
窓信号の周期間の外部入力信号のHighの時間をカウントします。
F 継続時間測定モード
2つの外部入力の立ち上がりエッジ間の時間をカウントします。
Gキャプチャモード
外部入力信号の立ち上がりと立下りのカウント値をキャプチャし、その差を計測します。
H カウンタモード
外部入力信号のパルス数を間カウントします。
I ゲート付カウンタモード
外部信号をゲートとしてこれがActiveの間もうひとつの外部入力信号のパルス数をカウントします。
J 窓付きカウンタモード
外部入力を窓信号として、窓がActiveの間のもうひとつの外部入力信号のパルス数をカウントし
さらに、窓信号の1周期間の間のもうひとつの外部入力信号のパルス数をカウントします。
【SMT内部構成と動作】
SMTモジュールの内部構成は下図のようになっています。
中心となるのが24ビットのタイマ/カウンタであるSMTxTMRです。そしてカウントベースと
なるクロック(SMTx_Clock)がいくつかのクロック源から選択できるようになっています。
タイマ/カウンタのカウントの開始停止を制御する信号が、2種類でSMT_windowと
SMT_signalとなり、それぞれいくつかの信号源を選択できるようになっています。
いろいろな設定条件で2種類のトリガ(SMTxPRAIFとSMTxPWAIF)が生成され、このトリガ
によってタイマ/カウンタの24ビットの値が2つのレジスタSMTxCPRとSMTxCPWにコピー
されます。
さらに周期レジスタ(SMTxPR)も用意されていて、これで一定周期のインターバルを生成
することができます。
(1)周期とデューティモードの動作
この場合の動作は下図のようにSMT_signalの信号の周期とデューティを同時に計測して、
周期はSMTxCPRに、Highのパルス幅をSMTxCPWにラッチします。他のモジュールと
異なるのは周期とデューティを同時に計測できることと、分解能が24ビットであることです。
(2)High、Low計測モード
(1)の周期とデューティ計測モードとほぼ同じで、SMT_signalの信号のHighとLow期間の
時間を測定し、High期間値をSMTxCPWにLow期間をSMTxCPRにラッチします。
(3)タイマモード
単純に一定間隔の割り込みを生成します。周期はSMTxPRで決まります。Timer2と同じ
動作となりますが、24ビットですからFosc=32MHzの場合でも、Fosc/4を選択すれば、
最長約2秒という長時間のインターバルを生成することができます。
(4)ゲート付きタイマモード
SMT_signalをゲート信号としてこれがHigh期間の時間測定をします。
下図の(a)は1回のみの場合でSMT_signalの立下りで割り込みが発生し、High時間が
SMTxCPWにセットされます。
下図(b)が繰り返しモードの場合で、SMT_signalのHigh時間の合計値がSMTxCPWに
セットされます。
(5)窓周期計測モード
SMT_window信号の1周期間の時間を計測します。SMT_window信号の立ち上がりで
カウントがクリアされますので、下図のように1回だけでなく繰り返し連続測定も可能です。
(6)ゲート付き窓制限測定モード
この場合は下図のようにSMT_windowの1周期間の、SMT_signalのHigh時間を計測し
結果をSTMxCPRに保存します。
これでSMT_signalをDC電圧としたときの平均値を求めることができます。
(7)継続時間測定モード
この測定はストップウォッチと同じで、SMT_windowとSMT_signalの両立ち上がりエッジ
の間の時間を測定します。つまりSMT_Windowがスタートで、STM_signalがストップと
して経過時間を計測し結果をSMTxCPRにセットします。
また、SMT_windowの1周期の間にSMT_signalのエッジが無い場合には、周期時間が
SMTxCPWにセットされます。
(8)キャプチャモード
このモードはCCPのキャプチャモードと同じで、SMT_windowの信号の立ち上がりと立下り
でタイマの値をキャプチャします。立ち上がりの値をSMTxCPRに立下りの値をSMTxCPW
にキャプチャします。繰り返しモードにすると下図のようにキャプチャを繰り返します。
タイマカウント値はリセットされませんので、継続カウントした値がキャプチャされます。
(9)カウンタモード
この場合はSTM_clock信号を使わず、SMT_signalをクロックとしてカウントします。
カウントをSMT_windowの1周期間ごとにカウントし結果をSMTxCPRに格納します。
(10)ゲート付きカウンタモード
SMT_windowがHighの期間だけ、SMT_signalのパルス数をカウントします。繰り返しモード
の場合はカウンタをリセットしませんので、下図のようにHighの期間を積算してカウントします。
(11)窓付きカウンタモード
SMT_window信号を窓としてその立ち上がりからSMT_signalのパルス数をカウントし
SMT_windowの立下りでカウント値をSMTxCPWに保存し、次のSMT_windowの立ち上がりで
カウント値をSMTxCPRに保存します。
【SMT制御レジスタ】
SMTモジュールの制御の関連するレジスタはたくさんあります。
設定制御に関連するレジスタには下記の種類があります。
・SMTxCON0、 ・SMTxCON1、 ・SMTxSTAT
・SMTxCLK、 ・SMTxWIN、 ・SMTxSIG
これらの制御レジスタ以外にデータを格納するレジスタがあります。いずれも24ビット幅ですので
3バイトのレジスタで構成されています。
・SMTxTMRL ・SMTxTMRH ・SMTxTMRU
・SMTxCPRL ・SMTxCPRH ・SMTxCPRU
・SMTxCPWL ・SMTxCPWH ・SMTxCPWU
・SMTxPRL ・SMTxPRH ・SMTxPRU
制御用レジスタの詳細は下図のようになっています。
これらの制御レジスタを使って設定する手順は次のようにします。
@まず動作モードを決めSMTxCON1レジスタをセットする
機能と繰り返しか単発かを設定します。
A信号とクロックを選択する
SMTxCLKでクロックを、SMTxWINでSMT_windowをSMTxSIGでSMT_signal
を選択します。
B極性を選択後有効化
SMTxCON0で各信号の極性とプリスケーラをセットしてから、Enableにして
動作を開始します。
【使用例】
ZCDの使い方のページでゲート付きタイマモードで使った例があります。
「商用電源周波数の測定」