PWM+ローパスで擬似D/A - その4 [Pi Pico]
先日コメントをもらって大恥をかいたんだけど、恥はかき慣れている。本家Raspbery PiのハードウェアPWMには Mark-SpaceモードとBalancedモードのふたつあるということを改めて知った(実は忘れてただけだけど)。Mark-Spaceモードは普通のサーボモータなんかに使う1周期に1回だけ反転するモードで、Balancedモードでは、擬似D/A変換に使いやすいようにエネルギーがなるべく高い周波数成分に寄るように反転の回数を増やすということになっている。
もうちょっと詳しく見てみようと思った...
もうちょっと詳しく見てみようと思った...
PWM+ローパスで擬似D/A - その3 [Pi Pico]
PWMの波形を工夫してローパスの半田付けを怠けようという話の続き。コメントでもらったジッタを与えるアルゴリズムは面白くて有効そうなんだけど、案外難しい。その前に何がしたかったか、をもういっぺんまとめると例えばの話、この絵のように
普通のPWMのデューティ比50%、というかつまり時間に沿った方向に対する1の出現確率が50%だと上の赤線のような信号波形になる。しかしその下の緑線のようにクロックごとに反転してやるとクロック周波数の半分の成分以下はなくなって、原理的に基本波成分は0である。デューティ比25%でも図の下のようにしてやれば最低の周波数成分はクロックの1/4、もとの基本波の4倍になる。
wrapの値をちょうど割り切るようなディユーティ比の場合、例えばwrapの値が16だと、2と4の場合に基本波成分は原理的に0になるけど、それ以外は基本波成分は必ず残る。それでもできればなるべく基本波成分が少ないほうがいい。
1周期の中になるべくたくさんの反転を入れてやれば同じデューティ比で(同じ0と1の比率で)基本波成分を減らすことができて、基本波より高い(クロックに近い)方へ高調波のエネルギーを寄せることができる。そしてローパスの半田付けは楽になる(1次で済ます)はずである、という話。前回は整理するための記号を作って終わってしまったのでそれを使ってどういうパターンがあり得るか考える....
wrapの値をちょうど割り切るようなディユーティ比の場合、例えばwrapの値が16だと、2と4の場合に基本波成分は原理的に0になるけど、それ以外は基本波成分は必ず残る。それでもできればなるべく基本波成分が少ないほうがいい。
1周期の中になるべくたくさんの反転を入れてやれば同じデューティ比で(同じ0と1の比率で)基本波成分を減らすことができて、基本波より高い(クロックに近い)方へ高調波のエネルギーを寄せることができる。そしてローパスの半田付けは楽になる(1次で済ます)はずである、という話。前回は整理するための記号を作って終わってしまったのでそれを使ってどういうパターンがあり得るか考える....
PWM+ローパスで擬似D/A - その2 [Pi Pico]
PWMの波形を工夫してローパスの半田付けを怠けられないか、という話の続き。前回のコメントで面白い話を入れてもらった。ダイナミックなアルゴリズムで低い周波数成分がかなり減らせて余分な成分を高い周波数に持っていけそう、という雰囲気はわかったんだけど、周波数成分を計算しようと思うと結構難しくてあまり進んでいない。
それとは別に僕が最初考えてたごくごぐ誰でも考えそうなアプローチを先に進めてみる。考え方はスタティックなのでわりと簡単なんだけど、どのくらい効果があるかというと難しいところ。
どうでもいいけどMathJaxって\hdotsを解釈してくれないのね。\hdotsってAMSじゃなかったっけ?
それとは別に僕が最初考えてたごくごぐ誰でも考えそうなアプローチを先に進めてみる。考え方はスタティックなのでわりと簡単なんだけど、どのくらい効果があるかというと難しいところ。
どうでもいいけどMathJaxって\hdotsを解釈してくれないのね。\hdotsってAMSじゃなかったっけ?
PWM+ローパスで擬似D/A [Pi Pico]
Pi PicoのPWM信号をローパスに通して擬似的なD/A変換に使っている。ところがローパスの半田付けが面倒なので次数の低いローパス、つまり1次のローパスにしていると、結構な分量の基本波成分の漏れがある。1次ではローパスのカットオフをPWMの基本波の一桁下にすると基本波成分は1/10だけ漏れることになる。
これが気になってきた。つまり単純なPWMではなくて、なにかビットパターンを考えて基本波成分を減らす工夫はないか、と考えてみた...
これが気になってきた。つまり単純なPWMではなくて、なにかビットパターンを考えて基本波成分を減らす工夫はないか、と考えてみた...
macOSからPi Picoを使う - その34 [Pi Pico]
とりあえずいまのところPi Pico側は2コアでも休み休み動かす、macOS側はlibusbの同期転送を専用threadで回すか、非同期転送をNSTimerで頻繁に呼ぶか、というなんとも中途半端なworkaroundだけど、なんとか使えるようになった。
いずれはPi Picoは2コアをぶん回せるようにして、macOS側はlibusbからIOUSBHostに移行したい。とはいうもののいつになることやら。
ということで集中的にPi Picoの話を続けてきたけど今日でひと段落。最後はuniversal binary版のlibusbが欲しい、という話...
いずれはPi Picoは2コアをぶん回せるようにして、macOS側はlibusbからIOUSBHostに移行したい。とはいうもののいつになることやら。
ということで集中的にPi Picoの話を続けてきたけど今日でひと段落。最後はuniversal binary版のlibusbが欲しい、という話...
macOSからPi Picoを使う - その33 [Pi Pico]
僕の場合、とりあえずmacOS側はlibusbの同期転送でPi Picoとのやりとりはできている。core1がcore0とほとんど独立に動いているにもかかわらず、core0で動いているTinyUSBがデータを取りこぼす現象は治ってないけど、適度にお休みを入れるというworkaroundでやり過ごしている。大きな声で人に言えないけど。
libusbもだいたいわかってきた。動作が軽くてよくできている。非同期転送の標準的な使い方のサンプルコードでも用意してくれるとありがたいけど。
というわけでそのlibusbでの非同期転送のやりかた。前回つぎのlibusb_handle_events()呼び出しまでの時間を知ることがなぜか僕の環境でできなかったので、その代わりをどうするか考える....
libusbもだいたいわかってきた。動作が軽くてよくできている。非同期転送の標準的な使い方のサンプルコードでも用意してくれるとありがたいけど。
というわけでそのlibusbでの非同期転送のやりかた。前回つぎのlibusb_handle_events()呼び出しまでの時間を知ることがなぜか僕の環境でできなかったので、その代わりをどうするか考える....
macOSからPi Picoを使う - その32 [Pi Pico]
Pi Picoのデバグが難しい [Pi Pico]
こないだからPi Picoのプログラムをしている。会社の工場で使う第1号にしようと思っている。Raspberry Piがたくさん増えてそれぞれがホストとWi-Fi経由で通信するせいで、貧弱なWi-Fi環境を圧迫するようになってきてしまった。Raspberry PiをPicoにしてネットワーク経由からUSB経由にすることでネットワークトラフィックを減らそう、という考えである。
その第1号機は、内蔵A/Dでアナログ信号を読み取ったり、GPIOでモータのOn/Offや状態監視をして、そのデータをmacOSで動くアプリにフィードバックするという簡単なもの。ホストから見るとvendor specific deviceとして見えて、ふたつのcoreのうち、core0でホストとやりとりをして、core1がA/DやらGPIOやらを制御するように書いている。前見た時はA/Dのデータが怪しかったのでPWMをローパスに通す回路を外付けして、その信号をA/Dで読んで自分自身で校正するようにした。これでどこまでINLが良くできるかはよくわからない。それはいいとして、そのPi Pico本体のデバグがなかなか進まない....
その第1号機は、内蔵A/Dでアナログ信号を読み取ったり、GPIOでモータのOn/Offや状態監視をして、そのデータをmacOSで動くアプリにフィードバックするという簡単なもの。ホストから見るとvendor specific deviceとして見えて、ふたつのcoreのうち、core0でホストとやりとりをして、core1がA/DやらGPIOやらを制御するように書いている。前見た時はA/Dのデータが怪しかったのでPWMをローパスに通す回路を外付けして、その信号をA/Dで読んで自分自身で校正するようにした。これでどこまでINLが良くできるかはよくわからない。それはいいとして、そのPi Pico本体のデバグがなかなか進まない....
macOSからPi Picoを使う - その31 [Pi Pico]
非同期転送のイベント処理に前回の専用threadを使うのが簡単そうなんだけど、そもそもlibusb_handle_events()の専用threadを起こすなら、そのthreadでずっと簡単な同期転送をすればいいような気がする。その話...
macOSからPi Picoを使う - その30 [Pi Pico]
libusbの非同期転送の続き。非同期転送はlibsusb-1.0の目玉機能らしい。非同期転送そのものは、慣れた人にはそれほど難しくなく、わかりやすくまとめられているので苦労は少ないはず。しかしmulti-threadを前提とした他の非同期転送を使い慣れていると、それと同じようにlibusbも使えばいいと思ってしまうが....