Lispと一緒(30) ラズパイPico2でもuLisp、PWM出力

Joseph Halfmoon

Common Lispの系譜を継ぐuLispをラズパイPico2マイコン上で練習中。前回はADコンバータ使って電圧を読み取るアナログ入力。今回は analogwrite。しかしPico2にはDAコンバータ不在。Arduino世界の通例によりPWM出力です。使えるAPIは2つだけ。それ以上やりたければ自分で制御せよと?

※Lispと一緒 投稿順 index はこちら

※実機確認は Raspberry Pi Pico2で行ってます。

※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。

今回、動作確認の関数ども

uLisp上のPWM制御用API関数は、以下の2つです。

    • analogwrite ピン番号 POS期間整数値
    • analogwriteresolution レゾリューションビット数

以下の別件シリーズでもちょっと調べてますが、PicoのRP2040、Pico2のRP2350のPWM機能は強力です。

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

ArduinoのAPIセットではとても全ての機能を使い切ることはできないじゃないかと思います。しかし、uLispはArduino環境でサポートされるArduino APIのさらに限られた機能しか実装してません。よってuLisp上で即使える機能はよく使いそうな機能のみです。ただし、uLispはハードをイジるすべを持っているようなので、やる気があったらガンバレ、ということでしょうかね。今回は実装されている上記2つの関数の範囲内でPWM波形を観察してみてます。

デフォルト動作

上記のAPIを見れば分かるとおり、uLisp上ではPWMの基本周波数を操作するAPIも備えてません。固定です。調べたところ

1000Hz

でした。まあ分かり易いっちゃ分かり易い数字です。もっと速い周波数が欲しくば自分でヤレということでしょう。

またデフォルト・レゾリューションは8ビットです。POS期間を0から255までの数値で指定するスタイルです。この固定キメウチ周波数と8ビットとレゾリューションというのは古いArduinoの伝統かなと思います。

デフォルト状態でのPWM波形のサンプルをいくつか並べます。

(analogwrite 12 128)

波形が以下に。ほぼ50%デューティの信号が得られてます。analogWrite_pin12_128
POS期間を示す数値を0にすれば、0の連続出力、255にすれば1の連続出力となります。

(analogwrite 12 1)

最小の1だったらどうよ。
analogWrite_pin12_1デフォルトでは、だいたいヒト目盛り0.4%てことね。

レゾリューションを変えてみる

さてレゾリューションを10ビットに変更してみます。

(analogwriteresolution 10)

レゾリューションを変更後に、128を出力するとこんな感じ。

(analogwrite 12 128)

波形はこんな感じ。analogWrite_pin12_res10_128

予定どおりというか、デューティは約12.5%です。

デューティ50%に「戻す」にはこんな感じ。

(analogwrite 12 512)

波形が以下に。analogWrite_pin12_res10_512

もういっちょ、ということでレゾリューションを12ビットに。

(analogwriteresolution 12)

レゾリューション変更後に、512を出力してみます。

(analogwrite 12 512)

結果はこんな感じ。analogWrite_pin12_res12_512

これまた、期待通りの約12.5%デューティです。

デューティ50%に「戻す」には当然以下ということで。

(analogwrite 12 2048)

そのときの波形が以下に。analogWrite_pin12_res12_2048

まあ、実装されているAPIだけでもアリガチなことは出来るんでないかと?でもPWM波形のまま捨て置くのは忍びない? analogwriteだものな。。。

Lispと一緒(29) ラズパイPico2でもuLisp、アナログ入力 へ戻る

Lispと一緒(31) ラズパイPico2でもuLisp、SPI出力 へ進む