明日は我が身の備忘録(あすびぼ)

自分向け備忘録です。頻繁に更新は難しいでしょうね

RX220でPWMをたくさん出す


RX220でPWMを12本より多く出す方法

RX220

 秋月電子通商さんで販売しているルネサスマイコンであるRX220のマイコンボード
akizukidenshi.com
 最大動作周波数32[MHz]で動作していてリアルタイムクロックや5チャネルあるSCI,RSPI,12bitA/Dコンバータ,14本の拡張タイマと多彩な周辺機能が搭載されている.
何よりもユーザーズマニュアルが日本語
そして,値段が1300円でサイズも小さい.ロボットを動かすのに丁度良い.

MTU2で出せるPWMの本数

 小さくて使いやすいRX220だがRCサーボモーターを沢山使用したロボットをしようとしたときに問題が出る.
MTU2のみで出せるPWMが12本までなのだ.
簡単な4足歩行ロボット等は1足3自由度つければ丁度良いが,さらにアームとか付けたい.また,2足歩行ロボットを作ろうとしたら17本くらいは出てほしい.

RX220でPWMを12本より出す方法

 今回の本題であるRX220でPWMを12本より多く出す方法だが,簡単な話で少し割り込みを使用してCPUの力を借りれば良い.つまり,オーバーフロー割り込みを使用してPWMの出力ピンを一定周期でリセットする.ハードウェアはコンペアマッチで出力状態を初期出力から遷移させる.

...日本語が不自由だから分かりづらい.
順を追って説明する.

PWM

PWM(Pulse Width Modulation)とは、半導体を使った電力を制御する方式の1つです。オンとオフの繰り返しスイッチングを行い、出力される電力を制御します。
*1

つまり,デジタルでしか出力できないICで中間の出力が欲しいから出力のONとOFFの時間幅の比率で中間の出力を出そうという話.
LEDの明るさを調整したり,モータの出力を調整したり,様々な場所で使われる基本的な技術.
いつか別の記事で詳しく書こうかな

RCサーボはこのPWM方式で角度の指令値を与える.
PWMの周期を大体20[ms]にしてON幅を1500[us]にすると角度がだいたい動作範囲の中間地点になる.800[us]~2200[us]の間にすると動作する.
ただし,安いサーボは個体差があり,この通りにいかないので中間地点のON幅を探す必要があったりする.

MTU2

 MTU2とはマルチファンクションタイマパルスユニット2の略.
マルチファンクションタイマパルスユニットとは分かりづらい名前だが,簡単に言えば色々なタイマ機能を持ってる周辺機能ということ.
 PWMが出せたり.
 割り込み用の内部タイマとして使えたり,
 他の周辺機能のトリガとして使えたり,
 エンコーダのパルス読めたり,
 ブラシレスモータ回せたり,
 という便利な周辺機能.
それのバージョン2という感じ.
ちなみに,最新のルネサスマイコンはMTU3になってる.
では通常は,どのようにしてMTU2でPWMを出すか.MTU2にはPWMをだすモードとして,主にPWMモード1とPWMモード2がある.

PWMモード1

PWMモード1はジェネラルレジスタを2つ1組で使用して1本のPWMを出力するモード.TGRAとTGRBをペアで使用してMTIOCnAから出力.TGRCとTGRDをペアで使用してMTIOCnCから出力する(n=0~4).タイマとそれぞれのジェネラルレジスタのコンペアマッチによって出力を変化させてPWMを出力する.コンペアマッチによる出力の変化の設定はTIORのIOA,IOB,IOC,IODでそれぞれ設定する.PWMモード1では最大8相ののPWM波形出力が可能だ.
f:id:kirikoshokunin:20180321162817p:plain
ルネサスエレクトロニクス RX220ユーザーズマニュアルハードウェア編 p483より

PWMモード2

PWMモード2はペアなどは関係なくPWMを出力できる。重要なのはカウンタをクリアするジェネラルレジスタは一つでよいということだ。つまりMTU0の場合TGRAでタイマをクリアする設定にした場合、TGAB、TGRC、TGRDがそれぞれカウンタとコンペアマッチしたらMTIOC0B、MTIOC0C、MTIOC0DからPWMが出力できる。
 また、同期動作という機能もある。これは、同期設定した他のチャネルのカウントがクリアされたら同時にカウントをクリアするというものだ。
 例えば、MTU0とMTU1をPWMモード2に設定し、同期動作させる。このときカウンタクリア要因をMTU0では、TGRAのコンペアマッチとしてMTU1では同期クリアと設定する。こうすると,MTIOC0B、MTIOC0C、MTIOC0D、MTIOC1A、MTIOC0B の5本が出力可能だ。
しかし、PWMモード2が設定できるのはMTU0,MTU1,MTU2の3つのみだ。
同期動作を使用してもPWMモード2だけでは最大8相のPWMが出すことしかできない。

MTU0,MTU1,MTU2をPWMモード2で動作させ、MTU3,MTU4をPWMモード1で動作させたとき最大12相のPWMが出力できる。

しかし、6足ロボットとか作りたいとき18本のPWMが欲しくなる。
2足歩行ロボットで上半身をつける時も17本は欲しい。
なのでこの数以上にPWMを出したいのでやってみた。

疲れたから残りはまた今度追記する.ソースコードとか
この方法は良いのか?