SMT – Period and Duty Cycleモードの実験

はじめに

SMT(Signal Measurement Timer)は、信号計測用24ビットカウンター/タイマーです。多種多様なクロック/信号入力および動作モードにより、信号のパルス幅,周波数,Duty,信号間隔などを高精度/広レンジで計測できます。

概要

下図は、使用したPIC16F18424のSMTモジュールのブロック・ダイアグラムです。
SMTxTMRがモジュール本体の24ビットカウンター/タイマーです。SMT_Clockは、SMTxTMRの基準となるクロック信号です。
SMTxTMRのカウント値は、SMT入力信号(SMT_window, SMT_signal)からのwindowラッチ, 周期ラッチのトリガーでバッファへコピーされ、同時に割り込み(SMTxPWAIF, SMTxPRAIF)がセットされます。バッファの内容は、SMTの動作モード(次項)によって、24ビット幅のSMTxCPW, SMTxCPRレジスタにキャプチャされます。この2つのキャプチャレジスタがあることで、パルス幅と周期など2要素を同時に計測することができます。
更に、SMT_window, SMT_signal, SMT_Clockは、それぞれ多様な信号源から選択できます。信号源の選択は、SMTxSIGレジスタのSSELビット、SMTxWINレジスタのWSELビット、SMTxCLKレジスタのCSELビットから設定します。また、タイマー周期割り込みもできます。SMTxTMRとSMTxPR(周期レジスタ)一致で割り込み(SMTxIF)がセットされます。

SMT動作モード

下表は、SMT動作モード11種類の概要です。SMTxTMRの値を取得する方法は、それぞれRepeat(反復)とSingle(単発)があります。

SMTモジュールの全動作モードを別資料にまとめました。カテゴリーから本記事を選択し、「SMTモジュール概要」を参照して下さい。

内容

実験では、PWMモジュールで生成した信号のパルス幅と周期をPeriod and Duty Cycleモードで計測し、デューティを表示します。
下図は、Period and Duty Cycle Measurement(Single)モードのタイミング・ダイアグラムです。SMTxGO_syncビットがHiの期間、SMTxTMRカウントをキャプチャします。ここでのSMTx_signalは、PWMモジュールの信号です。SMTx_signalの立上り/立下りエッジをトリガーに、SMTxTMRからパルス幅カウントがSMTxCPWに、周期カウントがSMTxCPRにキャプチャされます。このSMTxCPWとSMTxCPRの比からデューティを求めます。

下図は、PWMモジュールのブロック・ダイヤグラムです。信号周期は、TMR2モジュールの周期レジスタPR2で指定します。PR2=TMR2でTMR2は0リセットします。パルス幅は、10ビットDutyサイクルレジスタ(PWMxDCH[7:0]+PWMxDCL[7:6])で指定します。Dutyサイクルレジスタ=TMR2でPWMx出力はHi→Loになります。このとき、TMR2はプリスケーラを含め10ビットとして扱われます。

下は、PWMモジュールおよび連動するタイマー2モジュールのMCC設定内容です。システムクロック(FOSC)は、PIC内蔵OSC_4MHzです。

下は、SMTモジュールのMCC設定内容です。タイマー2もSMTもクロックは FOSC/4=4MHz/4=1MHz としています。

下は、ソースコードのメインループ部です。MCC自動生成関数を使用しています。
内蔵ADCモジュールから電源電圧をリファレンスに可変抵抗でAD変換した値を基にデューティを決めています。12ビット分解能のADCに対し、PWMは10ビットなので、AD変換値/4のデューティでPWM出力します。
プログラムでSMTxGOビットをHiにした後、Loになる(キャプチャ完了)のを待ち、パルス幅と周期の計測結果を取得しています。この場合、SMTx_signalにパルス入力があるときは信号立上りエッジのトリガーでSMTxGOはLoになりますが、パルスが無いときはSMTxGOはHiのままなので計測値を取得できません。そのため、パルス無し(AD変換値=0)の場合は、SMT処理をスキップして全て0を表示します。

結果

ブレッドボードに下図の回路を組んで実験しました。PWMモジュールは10ビット分解能なので、周期カウントの最大値を1023としました。(動画はこちら)
可変抵抗(VR2)を回すと、パルス幅とデューティが変わり、LEDもデューティとともに明るさが変化します。

感想

この実験では、折角のSMT24ビットカウンター性能を活かせていませんが、MCCから簡単にSMTを使うことができました。一方で、他の多くの動作モードについては、どのような場面で活用できそうかよく分かりません。今後、それぞれ試してみて活用例を探していきたいと思います。なお、SMTモジュールを内蔵するPIC16F1ファミリは一部のモデルなので、SMTの有無はスペックシートを確認下さい。

– 以上 –