Raspberry Pi Pico のDMA、ADCとPIOを連携させる試み

はじめに

C12880MAの蓄積時間を正確に決めるためにPicoのPIOを使って、クロックを生成しているのであるが、ADCに関してはPythonのループ中でクロックを生成しつつADCでアナログ値を変換している。
これをオシロスコープで観察していると、結構な間が開くことがある。特に得られているデータに問題があるようには見えないが、気持ちが悪いので改善したい。

解決の方法

PIOでCLK信号を立ち上げて、下げる。CM12880MAがVideo信号を出力する。DMAがADCからデータを転送、転送されたことをPIOが知るために転送先はPIOのTX FIFOにする。PIOがPullできるようになったことで、PIOが次のCLKを出力、ついで、PullしたデータをRX FIFOにPush、Pushされると別のチャンネルのDMAがPython側に用意したメモリにRX FIFOの内容を転送する。PIOでは288個のデータ用のカウンタで一連の動作を制御する。できるか?CLKを出力してから、Pullかな?MicroPython側はこの一連の動作の開始を指示するだけになる。

課題

DMAをPythonから使ったことがない。とりあえず、Picoのレジスタを直接操作する方法については次のページを参考にした。uctypesが用意されている。

https://iosoft.blog/pico-adc-dma

ただ、このサイトのrp_devices.pyにはPIOの定義や一部省略されているところがあったので、Datasheetを見ながら追加してみた。
うまく動いたら、上記サイト主に相談してみるか?

左が、Pythonのuctypes向けの記述、ちょっと分けがわからない。奇妙だが、 とりあえず指定方法はわかった。右がpico-sdkにあるヘッダーファイルでAHB_ERRORとREAD_ERRORの該当部分、わかりやすい。

結果

ADCからメモリ上にデータを転送することは可能。ただし、複数データの場合、ADC FIFOに8個ほどデータが残る問題がある。これを読み出さずにクリアする良い方法ないのかな?今回は一つのデータで十分なので、後の課題としておく。

さて、次はDMAで値をPIOのTX FIFOに転送してみるか。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA