かふぇルネにRX621(RX62N)のMTU2(PWMモード2)についてコメントしました。
以下、コメント内容に一部補足して説明します。
RX621(RX62N)のMTU2におけるPWMモード2では2通りの組み合わせを持つことができます。
出力組み合わせ1
MTIOC0A,MTIOC0B,MTIOC0C,MTIOC0D,MTIOC1A,MTIOC1B,MTIOC2A,MTIOC2B
出力組み合わせ2
MTIOC6A,MTIOC6B,MTIOC6C,MTIOC6D,MTIOC7A,MTIOC7B,MTIOC8A,MTIOC8B
仕様によっては端子が競合する場合がありますので、適切な組み合わせを選択してください。
以降、組み合わせ1で行うものとして説明します。
PWM出力端子とポートの関係はこのようになります(H/Wマニュアル 17.I/Oポートを参照)。
MTIOC0A – P34
MTIOC0B – P13
MTIOC0C – P32
MTIOC0D – P33
MTIOC1A – P20
MTIOC1B – P21
MTIOC2A – P26
MTIOC2B – P27
ポート出力で制御しようとした場合、PORTA0~PORTA7のようにポート一括(8bit)で制御できますが、PWMモード2で制御しようとした場合、上記の通り接続ポートはバラバラとなりますのでご注意ください。
PWMモード2を利用するには動作モードをPWMモード2にすることと、同期動作の設定が必要です。タイマモードレジスタ(TMDR)とタイマシンクロレジスタ(TSYR)を設定します。
MTU0.TMDR.BIT.M~MTU3.TMDR.BIT.MD = 3; /* PWM mode2 /
MTUA.TSYR = 0x47; / MTU0,1,2,3を同期 */
PWMモード2の説明を見ると、MTUチャネル3はPWMモード2に設定できないかのように見えますが、これは出力端子として選択できませんという意味なので混同しないようにしてください。チャネル3(もしくは4)を周期用として利用しなければ最大の8相出力ができません。
カウンタクリア要因も設定しておきます。
MTU0.TCR.CCLR ~ MTU2.TCR.CCLR = 3; /* sync clear by any TGR /
MTU3.TCR.CCLR = 1; / TGRA */
この設定によってTGR3AがCycle、その他TGRがdutyの扱いになります。次に出力設定を行います。
MTU0.TIORH.IOA ~ MTU2.TIOR.IOB = 2; /* ini-low, cmp-high /
MTU3.TIORH.IOA = 1; / ini-low, cmp-low */
上の例ではon-low、off-highとしています。ご自身のハードウェア環境に合わせてhigh/lowを選択してください。
大事なのはCycleにTGR3Aを指定しているので、TGR3Aコンペアマッチが発生するとMTU3.TIORH.IOAで設定した初期値(出力レベル)が採用される点です。
あとはCycleとDutyを設定してください。
MTU0.TCR.TPSC ~ MTU3.TCR.TPSC = ??; /* カウント要因 /
MTU0.TGRA ~ MTU2.TGRB / 各種duty /
MTU3.TGRA / cycle */
以上をまとめると下記のようなサンプルとなります。
MSTP(MTU0) = 0; /* MTU0を使用 */ MSTP(MTU1) = 0; /* MTU1 */ MSTP(MTU2) = 0; /* MTU2 */ MSTP(MTU3) = 0; /* MTU3 */ MTU0.TCR.BIT.TPSC = 1; /* MTU0 設定例:PCLK/4 */ MTU1.TCR.BIT.TPSC = 1; /* MTU1 */ MTU2.TCR.BIT.TPSC = 1; /* MTU2 */ MTU3.TCR.BIT.TPSC = 1; /* MTU3 */ MTU0.TCR.CCLR = 3; /* MTU0 他の同期タイミングでクリア */ MTU1.TCR.CCLR = 3; /* MTU1 */ MTU2.TCR.CCLR = 3; /* MTU2 */ MTU3.TCR.CCLR = 1; /* MTU3 TGRAコンペアマッチでクリア */ MTU0.TMDR.BIT.MD = 3; /* MTU0 PWM mode2 */ MTU1.TMDR.BIT.MD = 3; /* MTU1 */ MTU2.TMDR.BIT.MD = 3; /* MTU2 */ MTU3.TMDR.BIT.MD = 3; /* MTU3 */ MTUA.TSYR = 0x47; /* MTU0,1,2,3を同期 */ MTU0.TSR.BIT.TCFD = 1; /* MTU0 アップカウント */ MTU1.TSR.BIT.TCFD = 1; /* MTU1 */ MTU2.TSR.BIT.TCFD = 1; /* MTU2 */ MTU3.TSR.BIT.TCFD = 1; /* MTU3 */ MTU0.TIORH.IOA = 2; /* Duty TGR0A ini-low, cmp-high */ MTU0.TIORH.IOB = 2; /* TGR0B */ MTU0.TIORL.IOC = 2; /* TGR0C */ MTU0.TIORL.IOD = 2; /* TGR0D */ MTU1.TIOR.IOA = 2; /* TGR1A */ MTU1.TIOR.IOB = 2; /* TGR1B */ MTU2.TIOR.IOA = 2; /* TGR2A */ MTU2.TIOR.IOB = 2; /* TGR2B */ MTU3.TIORH.IOA = 1; /* 周期 TGR3A ini-low, cmp-low */ MTU0.TGRA = 25000 - 1; /* Duty 50% */ MTU0.TGRB = 25000 - 1; /* */ MTU0.TGRC = 25000 - 1; /* */ MTU0.TGRD = 25000 - 1; /* */ MTU1.TGRA = 25000 - 1; /* */ MTU1.TGRB = 25000 - 1; /* */ MTU2.TGRA = 25000 - 1; /* */ MTU2.TGRB = 25000 - 1; /* */ MTU3.TGRA = 50000 - 1; /* 周期 */