出力コンペア/PWMモジュールの使い方


 dsPIC30Fシリーズ内蔵のOutput Compareモジュールの使い方について説明しています。

【内部構成】

 まず出力コンペアモジュールの内部構成は下図のようになっています。




動作としては単純で、タイマ2かタイマ3のカウンタと、OCxRレジスタかOCxRSレジスタ
の値を常時比較していて、一致したとき、何らかの出力をOCx端子にするという動作
をします。
この時の条件により下記動作指定が可能になっています。

(1) 単一一致モード
  OCxRレジスタとの一致の条件のみで出力をするモードで、出力条件で下記3通り
  の出力方法があります。
  ただし、この一致を発生させるためには、タイマの周期レジスタPRyに設定した
  値が、OCxRレジスタの設定値より大きいことが必要です。PRyレジスタの方が
  小さいと、一致する前にカウンタが0に戻されてしまうので、一致が発生しないことに
  なってしまうためです。
   ・OCx出力をLowからHighにする
   ・OCx出力をHighからLowにする
   ・OCx出力を反転する

(2) 二重一致モード
  OCxRとOCxRSの2つのレジスタとの一致条件を使って出力を制御するモードです。
  この時には、OCxRレジスタの一致でHighとされ、OCxRSレジスタとの一致でLowと
  制御されます。この場合の出力には下記の2種類があります。
   ・単一パルス出力
   ・繰り返しパルス出力

(3) PWMモード
  PWMモードが指定された場合には、OCxRレジスタが比較対象のレジスタとなり、
  一致によりOCxレジスタはLowに制御されます。
  さらにPRyレジスタによりタイマが0クリアされるとき、OCx出力がHighに制御され
  同時にOCxRSレジスタの値が、OCxRレジスタにコピーされます。従って、PWMの
  Duty値をOCxRSレジスタにセットしておけば、周期の境でDuty値が変更されるよう
  なります。またPWMモードのときはOCxRレジスタには書き込みができないように
  なります。
  さらにPWMモードは保護機能の有無で下記の2種類のモードがあります。
   ・保護機能なし
   ・保護機能付き
  保護機能付きPWMモードのときには、OCFAピンの入力が保護入力となり、OCFAの
  入力がLowになるとPWMを強制停止させます。


【関連SFR】

出力コンペアモジュールの制御用SFRは下記のOCxCONレジスタだけとなります。




上記の制御用SFR以外に、データ設定用のSFRが下記の種類があります。

OCxRレジスタ  : 16ビットの一致指定用データレジスタ
OCxRSレジスタ : もうひとつの16ビットの一致指定用データレジスタ

タイマ側の関連レジスタです。

TMR2レジスタ、TMR3レジスタ: タイマのカウンタ本体
PR2レジスタ、PR3レジスタ  : タイマの周期設定用データレジスタ

割り込みを使う場合には、下記レジスタが関連します。他と同じように割り込みを使う
場合には、割り込みレベルを設定し、割り込み許可ビットをオンにすれば、割り込み
フラグがオンになった時点で割り込みが発生します。





【C言語での使い方】

C30コンパイラのPeripheral Librariesで用意されているタイマ1の
組み込み関数は下表のようになっています。
下記関数を使うためには、「outcompare.h」をインクルードする必要があります。
またプロジェクトにデバイス用のライブラリファイル、例えば「libp30f4012.a
というライブラリファイルをLIBに追加する必要があります。

関数名 書  式 機  能
OpenOCx()
void OpenOCx(
  unsigned int config,
  unsigned int value1,
  unsigned int value2);
出力コンペアモジュールの動作モードを設定する

configのパラメータは下記から選択
(1)Idle Modeの時の動作指定
 OC_IDLE_STOP
 OC_IDLE_CON
(2)タイマの選択
 OC_TIMER2_SRC
 OC_TIMER3_SRC
(3)出力モードの設定
 OC_PWM_FAULT_PIN_ENABLE
 OC_PWM_FAULT_PIN_DISABLE
 OC_CONTINUE_PULSE
 OC_SINGLE_PULSE
 OC_TOGGLE_PULSE
 OC_HIGH_LOW
 OC_LOW_HIGH
 OC_OFF

value1はOCxRSレジスタに設定する値

value2はOCxRレジスタに設定する値
《例》
 OpenOC1(OC_IDLE_CON & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_DISABLE, 0, 0);
CloseOCx() void CloseOCx(void); 出力コンペアモジュールをオフにする
ConfigIntOCx() void ConfigIntOCx(
  unsigned int config);
割り込み優先順位の設定と割り込みの許可、禁止制御

configには下記パラメータを指定
(1)割り込み許可、禁止
 OC_INT_ON
 OC_INT_OFF
(2)割り込み優先順位
 OC_INT_PRIOR_0
 OC_INT_PRIOR_1
   -----
 OC_INT_PRIOR_7
SetDCOCxPWM() void SetDCOCxPWM(
  unsigned int dutycycle);
PWMモードのときOCxRSレジスタに値dutycycleを設定する
SetPulseOCx() void SetPulseOCx(
  unsigned int pulse_start,
  unsigned int pulse_stop);
PWM以外のモードのとき、OCxRレジスタにpulse_startの値を、OCxRSレジスタにpulse_stopの値を設定する
ReadDCOCxPWM() unsigned int ReadDCOCxPWM(void); PWMモードのときのOCxRSレジスタの値を読み取る
ReadRegOCx() unsigned int ReadRegOCx(
  char reg);
PWM以外のモードのとき、reg=1ならOCxRレジスタの値を返し、reg=0ならOCxRSレジスタの値を返す



【使用例】

出力コンペアモジュールを使った例題です。
下記は、PWMモードで動作させ、ドレミファソラシドの音階を1秒間ずつ出力することを
繰り返すプログラム例です。








    目次ページへ