RL78ではPWMをするときにタイマを最低でも二つ使う。
一つはマスターと呼び、こいつはPWM周波数を決める。
もう一つはスレーブと呼び、こいつはPWMのデューティーを決める。
スレーブは複数有っても構わなくて、複数有れば複数のデューティーのPWMを同時に出力可能だ(マスターは一個だけなので周波数は同じになる)。
今回はマスターを一個にスレーブ二個で試した。つまりタイマを3個使う。
マスター:TAU1のチャンネル0(周期は100μS)
スレーブ:TAU1のチャンネル1(デューティー50%)、チャンネル2(デューティー10%)
コード生成でこんな感じで設定した。
割込みは使わないけど、実験用に発生させることにした。
で端子配置表へ反映させると、TO11とTO12が端子配置される。 更にコード生成させると”R_TAU1_Create()"にそれなりのコードが出力される。このコードの中で大事なのはデューティーを決めるレジスタとその値だ。 なんとなくわざとらしい数値がある(0640と0140)んで、これをいじってデューティーが変わるか調べれば良い。
今回はスレーブのチャンネル1だけを調べてるんで、オシロをTO11(P30)に接続しておく。 コードはこんな感じで作ってみた。 デューティーは50%で0x640だから100%なら二倍の0xC80だろうってことで(コード生成時に100%にすれば計算するまでもなかった)。 ステップ実行するとオシロに表示される波形の幅が変化する。 RL78のハードウエアマニュアルを読むのが面倒くさい自分には、コード生成は確かに便利だ。
//================================================================================================
// TO11/12 16ビット・タイマ出力(モーターPWM)
//================================================================================================
void To11Main(void)
{
To11Duty(80); // duty 80%
R_TAU1_Channel0_Start();
To11Duty(10); // duty 10%
R_TAU1_Channel0_Stop();
}
// PWMのduty設定:duty比 0~100(%)
void To11Duty(uint8_t d)
{
if (d >= 100) TDR11 = 0x0C80U; // 100%=0x0C80U, 50%=0x0640U
else TDR11 = (0x0C80U / 100U) * d;
}
void To10Intr(void){ NOP(); } // PWMマスター10INTR
void To11Intr(void){ NOP(); } // PWMスレーブ11INTR
// TO12 16ビット・タイマ12出力(予備PWM出力)
void To12Main(void)
{
TDR12 = 0x0C80U; // duty 100%
R_TAU1_Channel0_Start();
TDR12 = 0x0640U; // duty 50%
TDR12 = 0x0U; // duty 0%
R_TAU1_Channel0_Stop();
}
void To12Intr(void){ NOP(); } // PWMスレーブ12INTR
コメント