特価品(見切り品?)のGR-CITRUSボードで組み込みRuby(mruby)してます。前回はソフトウエアでGPIOをオンオフさせるビットバンギングでソフト制御の最高速?の目安を得ました。今回はPWM出力を使ってみます。PWMが使える端子と使えない端子がありそうなんだけれども、どうなっているの?
※Rubyと一緒 投稿順indexはこちら
PWM出力そのものは そのものズバリのpwm()というメソッドが存在するので簡単です。しかし、GR-CITRUS搭載のMCUであるRX631のマニュアルなどつらつら眺めさせていただくに、全端子すべてがPWMに対応しているわけでもない、と思われました。
そこで今回は「RX631の常識」から調べましたです。泥縄。
IOポート
GR-CITRUSのボードの端子名をみていると接続先のマイコン端子がP20と数字だけで書いてあったりPC0などと英字+数字で書かれていたりします。まずはこの記法から読み解かねばなりません。不勉強だな。
-
- RX631の場合、Port は0から9、AからJまで存在する(P20はポート2の0番、PC0はポートCの0番ということね。)
- 各ポートは最大8ピン(ただしパッケージにより端子数が少なかったり0本になったりする。
- GR-CITRUSは100ピンパッケージ品搭載。
- 100ピンパッケージ品の場合、PORT-5,7,8,9およびPORT-E,Fは出力されていない。
パルス出力可能なタイマ
「タイマを制するものはマイコンを制する」と(誰が言ったそんなこと?)いうことで、タイマを眺めてみました。流石ルネ様、タイマ・カウンタ関係充実してます。ただユニット名を列挙するだけでも以下のようです。
-
- MTU2a
- TPUa
- PPG
- TMR
- CMT
- RTCa
- WDTA
- IWDTa
うち、PWM的な出力が可能そうな「コンペア出力」機能を備えたユニットが以下の3種類もあります。
-
- MTU2a マルチファンクションタイマパルスユニット
- TPUa 16ビットタイマパルスユニット
- PPG プログラマブルパルスジェネレータ
ユニットは3種でもチャネル数や出力可能な端子数はもっと多いです。最初のMTUというユニットの場合、0から5まで6チャネルの16ビットタイマチャネルを内蔵し、各チャネル毎にいろいろ異なる機能をサポートしているものの合計で最大16本のパルス出力を扱えるみたいっす。
つづくTPUの場合、6チャネルの16ビットタイマを搭載のTPUユニットを2個搭載しているようです。片方のユニットが最大16本のパルス出力を扱えるので合計すると32本とな。
最後のPPGは4グループx2ユニット搭載らしいです。1グループ=4ビットみたい。多すぎて分け分からなくなりました。
やたら多いやんけ。mrubyがどのユニットを使ってPWM信号を生成しているのかソース調べてないので不明です。でもそんなに端子数があるのなら全端子パルス出力可能?でないかしらん。そう思ってIOポートのマルチプレクスの設定を眺めてみました。でもね、どうもそういうことでは無いようです。いろいろ配慮した結果か、大人の事情か、パルス出力可能でない端子もチラホラと見つかります。
GR-CITRUSのボード端子のピンを調べてみる
GR-CITRUSボードのUSBコネクタを上、としたときに左に並ぶ端子列と、右に並ぶ端子列について、ボード上の順番(USBコネクタに近い方を1番とした)、ソフトウエアでプログラムするときの端子番号、DEVICE(マイコンチップ)上の端子名、そしてそのピンに接続可能なパルス出力可能なユニット名(上記のMTU/TPU/PPGの頭文字)を列挙してみました。
左側端子列
BOARD | SOFT-PIN# | DEVICE | PulseOUT |
---|---|---|---|
L1 | 0 | P20 | M/T/P |
L2 | 1 | P21 | M/T/P |
L3 | 18 | P12 | M |
L4 | 19 | P13 | M/T/P |
L5 | 2 | PC0 | M/P |
L6 | 3 | PC1 | M/P |
L7 | 4 | PC2 | M/P |
L8 | 5 | P50 | — |
L9 | 6 | P52 | — |
L10 | 7 | P32 | M/T/P |
L11 | 8 | P33 | M/T/P |
L12 | 9 | P05 | — |
右側端子列
SOFT-PIN# | DEVICE | PulseOUT | |
---|---|---|---|
R1 | +5V | — | — |
R2 | GND | — | — |
R3 | RESET | — | — |
R4 | +3.3V | — | — |
R5 | 17 | P43 | —(A3) |
R6 | 16 | P42 | —(A2) |
R7 | 15 | P41 | —(A1) |
R8 | 14 | P40 | —(A0) |
R9 | 13 | PC5 | M/T/P |
R10 | 12 | PC7 | M/T/P |
R11 | 11 | PC6 | M/T/P |
R12 | 10 | PC4 | M/T/P |
PulseOUT欄に — と記した端子は、パルス出力可能なユニットの割り当てが無いのでPWM出力できないのではないかと当方が勝手に判断した端子であります。
実験
上記テーブルの左側、ソフト端子名で2番、3番、5番についてPWM出力を行ってみました。上記の勝手な推測によれば、2番、3番はPWM出力される筈ですが、5番は無理な筈。なおGR-CITRUSのpwmメソッドではPWM周期はすべて490Hz固定。デューティ比のみ8ビット値で設定可能であるようです。
なお、pwmメソッドに先立って pinModeを出力に設定する必要はないようです。設定しても問題はなし。端子5番はPWMできない筈なので、ビルド時にエラーになるかと思ったのですが、ノーエラーでビルドできました。
念のため実験用コードを。
#!mruby usb = Serial.new(0, 9600) usb.println("PWM, Pin.2, 3, 5") pwm(2, 128) pwm(3, 64) pwm(5, 32)
オシロが2チャンネルしかないので、最初2番と3番を観察。490Hz周期で、デューティ50%、25%の波形が出力されとります。予定通りね。
今度は2番と5番を観察。「予想どおり」5番にはPWM波形は現れてきませんでした。
PWM出力の実験のお陰で、多少RX631マイコンへの理解が深まった。ホントか?