はじめに
コンペアマッチタイマー CMTで行うTimer割り込みの設定諸々についての記述.マイコンボードはGR-CITRUSとする.ハードウェアマニュアルの参考先はHM *.*.*と表記する(例:HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考).
資料(必需品)
・ RX63Nグループ、RX631グループ ユーザーズマニュアル
・ GR-CITRUS回路図
PWMとは
タイマーカウントの1周期内(カウント開始からコンペアマッチクリアまで)において,任意カウント数分の時間でHIGHTとLOWを入れ替えるもの(HM 23.3.5 図 23.26).
PWMの設定
PWMの初期化関数と出力関数の作成を行う.
初期化関数
初期化の方法はHM 23.3.5 図23.25 に記載されている.
流れ
- 端子機能の設定
- カウンタクロックの選択
- カウンタクリア要因の選択
- PWMモード選択
- 波形出力レベルの選択
- TGRの設定
- カウント動作開始
void MTU3A_init(void);
void HardwareSetup(void)
{
MTU3A_init();
}
/*=================================
* 関数名 : MTU3A_init
* 機能 : MTIOC3Aの初期化
* 引数 : なし
* 戻り値 : なし
* 備考 : PWMモード
* ===============================*/
void MTU3A_init(void)
{
/*=== プロテクト解除 ===*/
SYSTEM.PRCR.WORD = 0xA502;
/*=== MTU3を有効化 ===*/
MSTP(MTU3) = 0;
/*=== プロテクト ===*/
SYSTEM.PRCR.WORD = 0xA500;
/*=== 端子機能の有効化 ===*/
PORTC.PMR.BIT.B1 = 1;
/*=== ピン機能設定 プロテクト解除===*/
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
/*=== ピン機能設定 PC1 > 0x00001 ===*/
MPC.PC1PFS.BIT.PSEL = 0x00001;
/*=== ピン機能設定 プロテクト===*/
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
/*=== カウント停止 ===*/
MTU.TSTR.BIT.CST3 = 0;
/*=== カウンタクロック選択 PCLK/1 ===*/
MTU3.TCR.BIT.TPSC = 0x000;
/*=== エッジ選択 立ち上がりエッジ ===*/
MTU3.TCR.BIT.CKEG = 0x00;
/*=== カウンタクリア要因 TGRAのコンペアマッチでTCNTクリア ===*/
MTU3.TCR.BIT.CCLR = 0x001;
/*=== PWMモード選択 ===*/
MTU3.TMDR.BIT.MD = 2;
/*=== 通常動作選択 ===*/
MTU3.TMDR.BIT.BFA = 0;
MTU3.TMDR.BIT.BFB = 0;
/*=== 波形出力レベル ===
* TGRA > 初期値:Low コンペアマッチ:Low
* TGRB > 初期値:Low コンペアマッチ:High
* ==================*/
MTU3.TIORH.BIT.IOA = 1;
MTU3.TIORH.BIT.IOB = 2;
/*=== TGR設定 ===*/
MTU3.TGRA = 48999; //1kHz
MTU3.TGRB = 48999;
/*=== カウント開始 ===*/
MTU.TSTR.BIT.CST3 = 1;
}
出力関数
/*=================================
* 関数名 : Duty
* 機能 : PC1(MTU3-A)におけるDuty比の決定
* 引数 : Duty比(0 - 100)
* 戻り値 : なし
* 備考 :
* ===============================*/
void Duty(int duty)
{
int flag;
flag = (MTU3.TGRA)*(100-duty)/100;
MTU3.TGRB = flag;
}
詳細
初期化関数
1. 端子機能の設定
SYSTEM.PRCR.WORD = 0xA502;
プロテクト解除
HM 13.1.1より,保護するレジスタへの書き込み許可を選択する.PRCR
は16bit構成で以下のような内容である.WORD
で一括で設定している.
b0 > 0 :クロック発生回路関連レジスタへの書き込み禁止
b1 > 1 :動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可
b2 > 0 :予約ビット
b3 > 0 :LVD関連レジスタへの書き込み禁止
b7-4 > 0 :予約ビット
b15-8 > A5 : PRCキーコードビット
MSTP(MTU3) = 0;
モジュールストップ解除
HM 11.4より,レジスタの読み出し書き込みができる状態にする必要がある.=0
で解除となる.
SYSTEM.PRCR.WORD = 0xA500;
プロテクト
HM 13.1.1より,保護するレジスタへの書き込みを禁止する.
PORTC.PMR.BIT.B1 = 1;
端子機能の有効化
HM 1.5 表1.10より,必要な機能が備わっている端子を選定する.HM 21.3.4より,=1
で端子機能を有効化する.
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
ピン機能設定 プロテクト解除
HM 22.2.1より,初めにB0WI = 0
でPFSWEレジスタへの書き込みを許可する.次に,PFSWE = 1
でPFSレジスタへの書き込みを許可する.許可順番は必ず守る.
MPC.PC1PFS.BIT.PSEL = 0x00001;
ピン機能設定
HM 22.2.14より,周辺機能を設定する.ここでは,PC1をMTIOC3Aとして設定している.レジスタへの値は表で指定されたものを書き込む.
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
ピン機能設定 プロテクト
HM 22.2.1より,順次プロテクトする.プロテクト順番は必ず守る.
2. カウンタクロックの選択
MTU.TSTR.BIT.CST3 = 0;
カウント停止
HM 23.2.14より, TCNTカウントを停止する.TMDR レジスタへ動作モードを設定する場合や TCR レジスタへ TCNT のカウントクロックを設定する場合は、TCNT のカウンタ動作を停止してから行う.
MTU3.TCR.BIT.TPSC = 0x000;
カウンタクロックの選択
HM 23.2.1より,PCLKの分周比を指定することでカウントクロックを選択する.ここでは分周比1.
MTU3.TCR.BIT.CKEG = 0x00;
**エッジ選択 **
HM 23.2.1より,入力カウントをカウントするエッジを選択する.ここでは立ち上がりエッジ.
3. カウンタクリア要因の選択
MTU3.TCR.BIT.CCLR = 0x001;
HM 23.2.1より,どのTGRレジスタをカウンタクリアの要因にするか選択する.選択したレジスタの値がカウントの1周期となる.ここではTGRAレジスタとしている.
4. PWMモード選択
MTU3.TMDR.BIT.MD = 2;
PWMモード選択
HM 23.2.2より,PWMモードを選択する.
MTU3.TMDR.BIT.BFA = 0;
MTU3.TMDR.BIT.BFB = 0;
通常動作選択
HM 23.2.2より,TGRAとTGRBが通常動作するように選択する.
5. 波形出力レベルの選択
MTU3.TIORH.BIT.IOA = 1;
MTU3.TIORH.BIT.IOB = 2;
HM 23.2.3より,各TGRレジスタがコンペアマッチした時の挙動を決定する.ここではTGRAのコンペアマッチでLow,TGRBのコンペアマッチでHighとなる.
6. TGRの設定
MTU3.TGRA = 48999;
MTU3.TGRB = 48999;
HM 23.2.13より,それぞれのTGR値の比率がDuty比となる.ここで,TGRAは周期,TGRBはDuty比となる.
7. カウント動作開始
MTU.TSTR.BIT.CST3 = 1;
HM 23.2.14より,タイマーのカウントを開始する.
出力関数
TGRBコンペアマッチでHighになるので,引数のDuty比は反転させて値を代入する.
参考文献
-RX631開発 PWM https://blog.ccwo.net/entry/2016/08/18/024523