1 仕様
マイコン : dsPIC33FJ64GP802SD :microSDHC Class10 (メーカー: GREEN HOUSE)
再生ファイル : Fs = 44.1kHz 、分解能16bit、ステレオ音源
クロック源 : 外付けの発信器未使用 完全に内部発振のみ
また、今回はとにかくWAVを再生することだけに専念したので、連続して音楽を再生するようなシステムや、フォルダ分けされた階層などは非対応です。
2 実際に音楽を再生している様子
基板で動いた。電源のノイズは若干ある pic.twitter.com/8qLFZPDGdi
— とりまあ@マルチコプター製作中 (@Trimming_ly) 2015, 8月 27
3 MDDFSでのmicroSDの操作
MDDFSとはMicroChiop社が提供している、PIC向けのファイルシステムで、これを使うことでFATに関する知識が要らなくなる。そういう意味では、MDDFSの使い方をしっかり理解しないと当然エラーで悩みます。
microSDの読み書きについて過去に記事をかいたので、詳しくはそちらを確認してください。
4 AudioDACでのDAC出力
dsPIC33FJ64GP802は、分解能16bitのDAコンバーターを内臓しています。それも、これはただのDAコンバーターではなく、AudioDACというオーディオ用のDACです。
そのため、使い方は基本的に固定されています。
手順をまとめます。
4-1 オーバーサンプリングについて
このAudioDACでは、デジタル補間フィルタを備えており、256倍のオーバーサンプリングを行い補完データを作成します。これにより、アップサンプリング時に発生するノイズを高音域に追いやる事ができるそうです。
これがAudioDACのブロック図になります。
中央にクロックとして[ACLK] が入力されています。
その先、[CLK DIV] で[ACLK]が分周されます。 この周波数を[DACCLK]とよび、音声のサンプリング周波数の256倍に設定する必要があります。
4-2 DACクロックの計算方法
[ACLK]はどのように計算するかというと、それはクロックの設定についてブロック図を確認します。(文字がマーカーで青く強調されてるのは、ミスですので気にしないでください。)
ブロック図右下のほうを見ると、[DAC] へ伸びる矢印があり、そこに [ACLK]と書いてあります。
今回は、内部発振を使いたいので、内部発振から生成可能なのは一番近くにある [Fosc] です。
SELACK で Foscを選択します。
SELACKというレジスタが有るわけではないのですが、設定方法はプログラム中にかいてりますので、ご確認ください。
また、Foscの設定方法もプログラム中に書いてありますが、作成中に発見した問題があります。
PLLは、M、 N1、 N2の値をレジスタで設定することで求まります。
Fosc = 7.3728MHz / N1 * M / N2
上のような式になるのですが、 N2が2より大きい場合にDAC割込みの周期に狂いが出る可能性があるということです。
私のプログラムに問題がある可能性が当然あるのですが、N2を2に設定することをお薦めします。
不思議なのは、システムクロック (Fcy = Fosc / 2)は正しく、ディレイ関数も問題なく動作するのに、DAC割込みのみが狂うという点です。
ちなみにこちらが、PLLでのクロック生成についてのブロック図です。
これとプログラムを照らしあわせて、計算方法をご確認ください。
4-3 DAC割込み関数の記述について
DAC割込みは、ライトチャネルとレフトチャネルそれぞれの割込みがあります。今回私は夫々の割込みを丁寧に書きましたが、多くの方は片方の割込み処理内で両チャネル分の処理を書いているようです。
それでも動く上に、プログラムの処理も減るのでメモリの削減にはなると思います。
5.プログラム
こちらに今回使用したファイルをひと通り載せておきました。URLはこちら
読み解いて真似することもできると思いますが、特に注意するべき点はバッファを2つ用意する点です。
バッファがひとつしかないと、次のデータを読み込む間無音になってしまうため、一方のバッファが再生中もう一方のバッファは読み込みをする仕組みになっています。
6.回路図
AudioDACは、さすがAudio用、差動出力になっているのですが、今回は音をだすことだけをまず確認したかったので、ステレオ、ポジティブ出力のみで音を出してみました。AMPは HT82V739です。
非常に音が大きいので近所迷惑にならないよう…。
7.問題点
電源のノイズが乗っているようで、出力に「ぽうぽうぽうぽうぽう」という方形波のノイズが入ります。これは、電源ラインにフィルタを入れれば恐らく解決すると思いますが、現段階では未解決です。
解決したら報告します。
8.参考文献+ご協力くださった方
・フルート吹きのMIDI工房 様
・picfun 様
・Twitter 、FaceBookの皆様