2018年05月31日

Open.Theremin@WCKのエッジのタイミングでDACへのデータ転送処理を行う

DAC周りのコードの検証を行う過程で徐々に判明して来ている問題は、データ出力のタイミングが相当にルーズだったことで、WCKのアップエッジで波形読み出しのタイミングを図っていた筈が、場合によってはクロックのダウンエッジを超えたところまで処理を引きずっているケースを観測できた。

例えば、Pitch/Volumeの値を観測する処理ループの先頭に設置したマーカーの出力端子D01から、予想外のタイミングでヒゲが発生している。 これは、WCKのアップエッジを切欠にattatchInterruptによって開始されたWavetableの処理がWCKのダウンエッジよりも早いタイミングで終了し、アンテナの状態をセンシングするループにルーチンが移行したことを示している。

Screen Shot 2018-05-31 at 18.39.12.png

このままの状態では、WCKのタイミングで出力信号を取り込むadatEncoderへの安定したデータストリームを確保することが難しく、プログラムが予想外の挙動を示す可能性がある。 問題の解決法として考えられるのは、WCKのアップエッジだけではなくダウンエッジのタイミングに合わせて処理を固定する手法で、これによりDACへのアクセスに必要な処理を分散出来るようになるはずだ。 

Screen Shot 2018-05-31 at 19.45.54.png

同様に、wavetable読み出しのルーチンの先頭にDACへのデータ送信ルーチンを配置する。

Screen Shot 2018-05-31 at 19.46.28.png

こちらは、コードを書き換えて、WCKのエッジのタイミングで各DACにデータ転送処理を行うルーチンを配置した後に観測した波形。 D01にはMAX5717に出力するLDAC信号をアサインしている。 MAX5541への送信ルーチンにはNOP命令を追加して、処理のタイミングに余裕をもたせた。

Screen Shot 2018-05-31 at 19.35.22.png

これはMAX5717へのデータ送信ルーチン。

Screen Shot 2018-05-31 at 19.36.05.png

こちらがMAX5541へのデータ送信ルーチン。MAX5717への送信ルーチンと比較すると、CSクロックの幅が広いことが判る。

Screen Shot 2018-05-31 at 19.36.18.png

MAX5541のデータ送信のタイミング。

データが確定した後、それを取り込むSCKのアップエッジまでのタイミングを40ns超に調整している。

Screen Shot 2018-05-31 at 19.40.01.png

これがMAX5717のデータ送信ルーチン。 高速で運用するクロックがスパイク状に見える。
SCKのデューティーサイクルはもう少し改善する余地がある。

Screen Shot 2018-05-31 at 19.43.44.png

posted by Yasuski at 21:13| open.Theremin