RL78ではPWMをするときにタイマを最低でも二つ使う。
一つはマスターと呼び、これはPWM周波数を決める。
もう一つはスレーブと呼び、こっちはPWMのデューティーを決める。
興味があるところを読む
RL78内蔵タイマーの性格
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
コメント