PWM

# はじめに
コンペアマッチタイマー CMTで行うTimer割り込みの設定諸々についての記述．マイコンボードはGR-CITRUSとする．ハードウェアマニュアルの参考先はHM ＊.＊.＊と表記する（例：HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考）．

資料（必需品）
・ [RX63Nグループ、RX631グループ ユーザーズマニュアル](https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/R5F563.pdf)
・ [GR-CITRUS回路図](https://www.renesas.com/jp/ja/doc/gr/gr-citrus/citrus-1.0.pdf)

# 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. カウント動作開始

```c:"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;
}
```

### 出力関数

```c:"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. カウンタクロックの選択
```c
MTU.TSTR.BIT.CST3 = 0;
```
**カウント停止**
HM 23.2.14より， TCNTカウントを停止する．TMDR レジスタへ動作モードを設定する場合や TCR レジスタへ TCNT のカウントクロックを設定する場合は、TCNT のカウンタ動作を停止してから行う．

```c
MTU3.TCR.BIT.TPSC = 0x000;
```
**カウンタクロックの選択**
HM 23.2.1より，PCLKの分周比を指定することでカウントクロックを選択する．ここでは分周比1．

```c
MTU3.TCR.BIT.CKEG = 0x00;
```
**エッジ選択 **
HM 23.2.1より，入力カウントをカウントするエッジを選択する．ここでは立ち上がりエッジ．

##### 3. カウンタクリア要因の選択
```c
MTU3.TCR.BIT.CCLR = 0x001;
```
HM 23.2.1より，どのTGRレジスタをカウンタクリアの要因にするか選択する．選択したレジスタの値がカウントの1周期となる．ここではTGRAレジスタとしている．

##### 4. PWMモード選択
```c
MTU3.TMDR.BIT.MD = 2;
```
**PWMモード選択**
HM 23.2.2より，PWMモードを選択する．

```c
MTU3.TMDR.BIT.BFA = 0;
MTU3.TMDR.BIT.BFB = 0;
```
**通常動作選択**
HM 23.2.2より，TGRAとTGRBが通常動作するように選択する．

##### 5. 波形出力レベルの選択
```c
MTU3.TIORH.BIT.IOA = 1;
MTU3.TIORH.BIT.IOB = 2;
```
HM 23.2.3より，各TGRレジスタがコンペアマッチした時の挙動を決定する．ここではTGRAのコンペアマッチでLow，TGRBのコンペアマッチでHighとなる．

##### 6. TGRの設定
```c
MTU3.TGRA = 48999;
MTU3.TGRB = 48999;
```
HM 23.2.13より，それぞれのTGR値の比率がDuty比となる．ここで，TGRAは周期，TGRBはDuty比となる．


##### 7. カウント動作開始
```c
MTU.TSTR.BIT.CST3 = 1;
```
HM 23.2.14より，タイマーのカウントを開始する．

#### 出力関数
TGRBコンペアマッチでHighになるので，引数のDuty比は反転させて値を代入する．

# 参考文献
-RX631開発 PWM https://blog.ccwo.net/entry/2016/08/18/024523