« 「パーツのぱ」の新キャラクター | トップページ | マルチテスタの製作をようやく実行 »

2008年9月21日 (日曜日)

FRボードでUSBメモリからWAV再生(その3)

前回エントリの続きです。PPGを使用してのΔΣDAコンバータですが、何はともあれ結果をご覧頂きましょう。

どうでしょう?以前とは比べ物にならないほどにクリアになりました。これまで参考にしていたトランジスタ技術のサンプルは、ハートウェアのみで実現するΔΣ型DAコンバータの原理に忠実に、ソースコード内で「加算器」「積分器」「量子化器」「遅延」に該当する部分をすべて実装していましたが、出力結果だけ見れば

1サンプル毎のPWMのさらに細かいヤツ(細かさの度合い=オーバーサンプリングレベル)

なわけで、PPGを使えばデューティー値設定レジスタをサンプルに合わせて調整するだけでダイレクトに欲しい出力結果を出力できる為、ソースコードの方もこれまでのモノと比べてかなりすっきりしました。

以降の内容は今回PPGでの実現に際して勘違いしていた部分です。

「勘違い1:カウンタボロー/デューティー値一致割り込みレジスタの設定とPPG出力の反転動作は連動すると思っていた」

ハードウェアマニュアルのPPGの説明の最初の方を見ると

カウンタボローあるいはデューティー値一致で反転します

と書いてあったので、「カウンタボロー/デューティー値一致割り込みレジスタ」で

デューティー値一致割り込み:なし

に設定すれば「PPGの出力がデューティー値一致で反転しない」と勘違いしてしまっていました。実際はPPGの出力は割り込みレジスタの設定に関係なく、カウンタボローあるいはデューティー値一致で反転するようです。

「勘違い2:デューティー値0にしておけばカウンタボローの時だけPPG出力が反転すると思っていた」

PPGの起動時にデューティー値を0にしてしまうとそのまま最初の出力で固定されてしまうので今回の様にパルスが欲しい場合はやってはいけません。

「勘違い3:PPGのカウントクロックは常に一定だと思っていた」

再生対象のWAVEデータは8bit/8kHz/モノラルを想定しているので、1サンプルあたり125μ秒です。この間隔での割り込みを実現するにあたって、今回はPPGのカウントクロックを

CLKP(=20MHz)の4分周(=5MHz=0.2マイクロ秒)

にしてみました。つまり、PPGで625カウントすれば1サンプル分になります。

ここでPCSRを625にして、後はデータビット(8bitなので0~255)に応じてPDUTを設定すればいわゆるPWM(Pulse Width Modulation)ですが、今回はΔΣ型におけるオーバーサンプリングを実現する為にさらに細かく刻みます。なるべく整数で割り切りの良いカウントにしたいので、625を因数分解すると5^4になる事に着目し、PCSRを25(5^2)カウントでそれを25(5^2)回繰り返す事にしました。

ところが実際に試してみるとこれでは上手くいきません。音が間延びしてしまっています。原因を調べる為に、UARTを使ってPC経由で動的にカウント値を変えて試してみるとどうやら20カウントあたりがちょうど良いようです。以前のΔΣDAコンバータの時の様に、「処理に時間がかかり過ぎているのかも?」というのを最初に疑いましたが、今回はパルス発生専用のタイマを使っているのでカウント判定処理以外は大した処理がありません。それでは何が原因?しばらく悩みました。

結局マニュアルを読むことでPPGの仕様によるものであると言う結論に達しました(いや、これも勘違いかもしれませんが)。ハードウェアマニュアルのPPGの「割り込み要因とタイミングチャート」の項を読むと、

起動トリガがかかってから, カウント値がロードされるまで, 最大2.5T (T: カウントクロック周期) を必要とします。

とあります。つまり最大で1サンプルあたり2.5T分(今回T=0.2μsecなので0.5μsec)再生時間が長くなっていると言うわけです。平均が1/2で1.25Tとして、上記の理論上のカウント値と実測上のカウント値の比率を見れば、25/20 = 1.25とバッチリつじつまが合います。という事で今回はこれを原因として考えました。

とはいうものの、ハードウェアマニュアルでは「起動トリガがかかる時」としか言及が無く、2回目以降のカウンタ値のロード時の動作についてはタイミングチャートを見る限り「起動トリガを伴わない」と受け取れる記述になっていたりします。この通りだとすれば、上記ではつじつまが合わないと思うのですが、実際のところはどうなんでしょう?真相をご存知の方はコメントいただければと思います。

ちなみに今回の取り組みの一通りの成果をニコ動で公開中です(こちら)。今後は細々とブラッシュアップ予定。

|

« 「パーツのぱ」の新キャラクター | トップページ | マルチテスタの製作をようやく実行 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2790/42547542

この記事へのトラックバック一覧です: FRボードでUSBメモリからWAV再生(その3):

« 「パーツのぱ」の新キャラクター | トップページ | マルチテスタの製作をようやく実行 »