Pico三昧(39) ラズパイPico2:RP2350、Pico:RP2040、PWM比較

Joseph Halfmoon

今回は周辺回路PWMです。他のマイコンではタイマに付属するIO機能として実装されることが多いです。Pico系ではタイマとは独立、IO制御専用です。PWMという呼称ですが、PWM出力以外に入力信号のカウント機能によりパルス幅、周期の測定も可能。なおPicoとPico2での差はチャネル数と割り込みくらいかと。そんなもん?

※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。

※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。

Pico-series Microcontrollers

ありがちなインプットキャプチャとの違い

他の多くのマイコンでは、タイマ・カウンタの横にインプット・キャプチャ、アウトプット・コンペアなどの機能を持つ「IOチャネル」が複数個ならんでます。それらのマイコンでは、カウンタをフリーランさせておいて、アウトプット・コンペア機能でカウンタが所望の位置に達したらIOを上げ下げするという方法でPWMを達成してます。ここの部分はPico、Pico2のPWM出力でも同様です。

一方、他の多くのマイコンではカウンタをフリーラン(当然周波数は既知)させておいて、外部の入力信号でカウンタ値をキャプチャ(トリガのタイミングでの値を読み取る)し、入力信号の立ち上がり、立下りのタイミングを得ます。キャプチャしたカウンタ値の2つの差を計算することでパルスの周期あるいはパルス幅を測定することになります。この方法だとPWM出力しながら、その出力波形のどの位置で外部イベントが発生したなどを知ったり、入力エッジからある時間経過した後にパルス出力するなどの細かい制御も可能です。

しかしPico、Pico2のPWMの入力機能では、カウンタへの内部クロック信号のON/OFFのために入力信号が使われてます。この方法でもパルス幅や周波数の測定は可能ですが、従前のインプットキャプチャ機能を駆使して行っていたような微妙な制御はやりにくいように思われます。お惚け老人の感想だけれども。

過去回でのPWMの活躍

PicoでもPico2でも機能的にはほぼ同じなPWMです。過去回でPico上でPWMが活躍している回はそのまま以下同文でPico2にも適用できるのでないかと。

以下はMicroPythonからPWM出力を制御しパッシブ・ブザーを鳴らしているもの。

MicroPython的午睡(23) ラズパイPico、Passive Buzzer接続

一方以下の回では同じMicroPythonからPWMスライスの入力機能を制御して入力信号の周波数を測定してます。

MicroPython(31) ラズパイPico、PWMの周波数カウント機能を使う

また以下回では、C/C++ SDKを使ってPWMスライスの入出力両方を制御してみてます。

鳥なき里のマイコン屋(131) ラズパイPico、PWM、外部クロック、周波数カウンタ

スライスとチャネル

PicoでもPico2でもPWMは等価な機能を持つ複数のスライスというものから成り立ってます。

    • 1本のスライスには8.4 fractional clock divider1本と16ビットカウンタ1本が含まれる
    • 1本のスライスには2本のPWM出力チャネルA、Bが含まれる。各チャネルのコンペアレジスタに設定された値を使ってPWM出力がなされる。よって同一スライスの2つのPWM出力信号は同一周波数の異なるデューティ比の出力信号となる。
    • PWMチャネルそれぞれにはGPIO端子2本が固定で割り当てられている。
PicoとPico2の差

PicoでもPico2でも、PWM出力は全てのGPIO端子に割り当て可能です。しかしPWMチャネル数はGPIO端子数の半分しかないので、独立したデューティ比のPWM信号を同時に割り当てられるのは最高でも全GPIO端子の半分です。また、各スライスへの入力信号に割り当て可能なGPIO端子はBチャネル側の端子のみなので、入力できるのは全GPIO端子の4分の1となります。

PWM RP2040 RP2350
Slice 8 12
Channel 16 24
GPIO 30* 48
INT REQ. 1 2

(*) RP2040では、16チャネル存在するのでGPIO端子は32本サポートできる筈ですが、GPIO端子数は30しかないので、スライス7のPWMチャネルの行先は1本ずつです。

RP2350では、24チャネルで48本のGPIO端子を網羅してますが、これが使えるのはQFN80版のRP2350Bのみ。Pico2に搭載されているRP2350AはQFN60で、使えるGPIO端子は30ピンまでです。なおRP2350の場合、PWMがアサインできるのはBank 0と呼ばれるフツーのGPIO端子のみです。Bank 1と分類される他の機能と兼用のGPIO化可能端子もありますが、そちらにはPWMはアサインできないようです。

また、カウンタのラップで割り込みを発生できますが、RP2040ではIRQは1本のみだったのが、RP2350では2本に増えてます。

Pico2のRP2350ではスライス4本増えているけど、実質制御すべきGPIO端子が残っておらんので、増えた分のスライス使えんな~と一瞬思ったのです。しかし、割り込みも増えたことだし、余ったスライスは単なるタイマとして使えばいいじゃん、と。

Pico三昧(38) ラズパイPico2:RP2350、Pico:RP2040、リセット比較 へ戻る

Pico三昧(40) ラズパイPico2:RP2350、Pico:RP2040、GPIO比較 へ進む