Rubyと一緒(2) GR-CITRUSでPWM信号出力を使ってみる

Joseph Halfmoon

特価品(見切り品?)のGR-CITRUSボードで組み込みRuby(mruby)してます。前回はソフトウエアでGPIOをオンオフさせるビットバンギングでソフト制御の最高速?の目安を得ました。今回はPWM出力を使ってみます。PWMが使える端子と使えない端子がありそうなんだけれども、どうなっているの?

PWM出力そのものは そのものズバリのpwm()というメソッドが存在するので簡単です。しかし、GR-CITRUS搭載のMCUであるRX631のマニュアルなどつらつら眺めさせていただくに、全端子すべてがPWMに対応しているわけでもない、と思われました。

RX631

そこで今回は「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は出力されていない。
パルス出力可能なタイマ

「タイマを制するものはマイコンを制する」と(誰が言ったそんなこと?)いうことで、タイマを眺めてみました。流石ルネ様、タイマ・カウンタ関係充実してます。ただユニット名を列挙するだけでも以下のようです。

    1. MTU2a
    2. TPUa
    3. PPG
    4. TMR
    5. CMT
    6. RTCa
    7. WDTA
    8. 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ビット値で設定可能であるようです。mruby_pwm_GRCITRUS

なお、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%の波形が出力されとります。予定通りね。

pin2_3_pwm

今度は2番と5番を観察。「予想どおり」5番にはPWM波形は現れてきませんでした。pin2_5_pwm

PWM出力の実験のお陰で、多少RX631マイコンへの理解が深まった。ホントか?

Rubyと一緒(1) GR-CITRUSでビットバンギングの周波数を測ってみる へ戻る

Rubyと一緒(3) GR-CITRUSでパッシブ・ブザーを鳴らしてみる へ進む