R8C/38のタイマ機能(PWM)

マイコンカーラリーのレギュレーションで使うことになっているマイコンのR8CシリーズのPWMをコントロールするプログラムを書くのは結構大変です。

タイマ関係のレジスタがタイマごとに違っていてやたら数が多いのです。
stm32Fシリーズだと例えばTM2~TM5は同じ構造になっていて、同じルネサスでもR8Cと異なり旧日立系のH8シリーズもタイマ関係はよく整理されていて判りやすい構造になっていますがR8Cはタイマー関係のパーツを無秩序に寄せ集めたような印象です。

R8CではPWMのデューティを決めるアウトプットコンペアレジスタのバッファを設定する必要があり、設定によってはバッファなしで動作する場合もあります。
アウトプットコンペアレジスタとは次のTRGBに相当するものです。(次の図はH8の例です)

TRGBに設定する値がPWMのデューティになります。
TRGAの値が20000であればタイマのカウンタは0~20000のカウントを繰り返し、TGRBが3000 ならカウンタが3000になった時に信号TIOCAがHighになるという動作をします。
モーター制御ではこのTGRBを頻繁に書き換えますが、バッファが無い場合はTGRB新たに設定する値が2000の場合、カウンタの値が2000を超えて3000未満の時に書き換えたらTIOCAはカウンタが20000になるまでLowのままになってしまいます。
つまり1周期だけデューティ100%の信号が出る誤動作が起きることになります。

このような事態を避けるためにTGRBに設定する値をバッファレジスタに入れておいてカウンタが0になったタイミングでTGRBに設定する機能がH8シリーズにしろstm32Fシリーズにしろ最近の制御用マイコンにのPWMには標準搭載となっています。

マイコンカーラリー事務局が提供しているサンプルプログラムではバッファが無いアウトプットコンペアレジスタの値を設定するのにPWM用タイマのカウントアップで起動した割り込み関数で値を設定するという面倒なことをやっています。
一昔前はハードウェアリソースが限られていたためこのようなことをプログラミングテクニックでカバーするのが当然でしたが、出来れば無駄なことはしなくて済む方が良いに決まっています。

マイコンカーラリーでは事務局提供のサンプルプログラムが良く出来ているのでR8C周辺機能の扱いにくさは問題になりませんが、ある程度プログラムが判ってきて自分で新しいシステムを考えられるレベルになればR8Cなど使わずにPIC、stm32FシリーズやArduino等を使う方向に流れるのは容易に予測できます。

せっかく周辺機能の扱いやすさではR8Cよりもはるかに優れたH8、SHシリーズがあったのに、一般ユーザー獲得の一環で始めたのであろうと思われるマイコンカーラリーのサポート事業向けにR8Cを押す辺りにルネサスのマイコン事業迷走の理由が見えるような気がします。