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%デューティの信号が得られてます。
POS期間を示す数値を0にすれば、0の連続出力、255にすれば1の連続出力となります。
(analogwrite 12 1)
最小の1だったらどうよ。
デフォルトでは、だいたいヒト目盛り0.4%てことね。
レゾリューションを変えてみる
さてレゾリューションを10ビットに変更してみます。
(analogwriteresolution 10)
レゾリューションを変更後に、128を出力するとこんな感じ。
(analogwrite 12 128)
予定どおりというか、デューティは約12.5%です。
デューティ50%に「戻す」にはこんな感じ。
(analogwrite 12 512)
もういっちょ、ということでレゾリューションを12ビットに。
(analogwriteresolution 12)
レゾリューション変更後に、512を出力してみます。
(analogwrite 12 512)
これまた、期待通りの約12.5%デューティです。
デューティ50%に「戻す」には当然以下ということで。
(analogwrite 12 2048)
まあ、実装されているAPIだけでもアリガチなことは出来るんでないかと?でもPWM波形のまま捨て置くのは忍びない? analogwriteだものな。。。