hiraコメントするSDカードとPWMが出来たら、定番のWAV再生を行わない理由は無い。SDカードアクセスのパフォーマンスを測る指針ともなる。以前にR8Cで、トライした時は、色々な問題にぶつかって、実用性が薄い事から、あまり深く掘り下げなかった。・R8Cでは、UARTとSPIが共有している為、どちらか片方しか、利用する事が出来ず、不満が残る。動作は困難と思われる。・R8CのPWMでは、コンペアレジスターがバッファされていない為、書き込んだタイミングと、前の値との組み合わせにより、グリッチが発生する、その為、「プツプツ」とノイズが気になる。結局、SPIをソフトで処理して、実装してみたが、11.025KHz、8ビット、ステレオが限界だった・・これは、かなり微妙な結果だと言うしかない、UARTを諦めて、SPIをハードで扱う事も考えたが、プツプツと発生するノイズ、PWMの仕様上の問題をナチュラルに解決する方法を思いつけなかったので、中途半端だったが諦めた。RL78では、その全てを改善できるであろう事が判っていた、8ビットのPWM変調に起因する音質以外は、ほぼ満足なものとなると思われる。実装して、音を出してみたら、思った通りの結果だった、PWMのレジスタ書き換えに起因するノイズも聞こえない、(RL78では、バッファされている)48KHz、16ビット、ステレオのファイルも、難なく再生出来た。※16ビットの下位8ビットは捨てている。※つまり、他の処理も考え合わせると、ゆうに200キロバイト毎秒以上の読み込み速度が出ていると思われる。—–PWM周期は、8ビットの分解能が必要なので、カウンタのクロックを16MHzとして、256で割った、62.5KHzとした。これで、一応48KHzのサンプリング・レートに対応できる。多少難しい問題として、PWMのサンプルレート、62.5KHzと、ファイルのサンプリングをどのようにマッチさせるか、この微妙な周期の違いを、簡潔に解決する方法を考慮する必要がある。62.5KHz毎に起動する割り込みで、波形値をバッファから取り出して、PWMのコンペアレジスタに設定している。小数点以下の誤差が全く出ないように工夫した。※簡単な整数計算だけで行なえるので、シンプル。}分数計算で、分子が、分母(6250)を超えたら、テーブルのポインターを進める、また、分子から、6250を引く。・6250は、62.5KHzの1/10で、「rate_」は、波形ファイルのサンプリング周波数を1/10にしてある。※つまり、48KHzなら4800、44.1KHzなら4410、22.05KHzなら2205となる。・1/10にするのは、計算レンジを16ビット以内に納まるようにする為の工夫。・「skip_」は、8ビットモノラルなら「1」、8ビットステレオなら「2」、16ビットモノラルは「2」、16ビットステレオなら「4」にする。無音は「0x0000」となるので「wofs_」で調整する。・WAVファイルは、リトルエンディアンなので、「l_ofs_、r_ofs_」で、掴む位置を微調整する。・バッファサイズは、SDカードの読み込みでは、512バイトの倍数が効率が良いようなので、ピンポンバッファにする為、倍の1Kバイトとした。—–PWM出力は、適当なローパスフィルターを通す事で、アナログ出力を得られる。今回は、2Kオームと、0.01uFのネットワークとした。贅沢ではあるけども、フルスイング・オペアンプを使って、バッファーを組んでみたが、オペアンプを使わず、大きめのカップリングコンデンサを入れただけの回路でも、問題無いだろう。※RL78がリセット状態や、停止中は、出力に直流が乗るので注意。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。