LoginSignup
0
0

More than 3 years have passed since last update.

PWM

Last updated at Posted at 2020-07-18

はじめに

コンペアマッチタイマー 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 に記載されている.
流れ
1. 端子機能の設定
2. カウンタクロックの選択
3. カウンタクリア要因の選択
4. PWMモード選択
5. 波形出力レベルの選択
6. TGRの設定
7. カウント動作開始

"hwsetup.c"
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;
}

出力関数

"mtu.c"
/*=================================
 * 関数名 : 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0