2007/03/14 とりあえず、基板の形に組みました。
SPIでDAコンバーターの信号を作っています。 CPUのクロック(20MHz)を2分周したものをSCKとし、データはLRそれぞれ32ビットなので20÷128=156.25KHzがサンプリング周波数になります。
各命令の実行時間が正確に128サイクルで波形データを作成しSPIに送らなければいけません。 C言語で書いていますがコンパイルするたびに微妙に命令が変わりそのたびにNOPをいれて調整しました。
サイン波、矩形波、のこぎり波、三角波、トーンバースト、まではできていますが、ホワイトノイズ、ピンクノイズでてこずっています。 ホワイトノイズをホワイトガウスノイズにしようとすると乱数を12個加算しなくてはならず10サイクル以下で1つの乱数を作る必要がでてきます。 ピンクノイズはホワイトノイズを−3dB/octのフィルターをとおして作りますがこれも時間のかかる処理です。 最悪これらについてはサンプリング周波数を下げてしまおうかと考えています。
またLCD表示とかいろいろいれたらMEGA48では入らなくなりつつありますのでMEGA168に変更しようかと思います。
■試作した基板
2007/03/25 ケースにいれました。
ボタンはアクリル棒6Φをけずったものです。 下からLEDで光らせています。 左から、戻る、↓、↑、決定、です。
後ろは黄色がトリガー出力、白と赤がオーディオ出力です。 オーディオ出力は2出力時以外は同じものを出力しています。
MEGA168に変更、ついでに水晶も24.576MHzにしました。 ちょっとオーバークロックですがこれくらいは大丈夫でしょう。 サンプリング周波数は24.576MHz÷128で192KHzになります。
波形テーブルを変更し、高精度サイン波形用にはサイン位相上位8ビット、下位8ビット、コサイン位相上位8ビット、下位8ビットの計2KB、低精度サイン波形用(TWOTONEや2出力など)にはサイン12ビットの8KBとしました。 プログラムは残り6KB以内におさめます。
高精度サインでは位相16ビットの上位8ビットと下位8ビットをサインの加算公式(咲いたコスモスコスモス咲いた)を使って求めます。 低精度サインは高速化のため位相12ビットでそのままテーブル引きします。 それぞれの波形は16ビット精度で求め、そのあとレベル調整(0dB〜−96dB)処理をして24ビットデータになりDAコンバーターに送られます。 レベル調整はシミュレーションでは誤差最大0.03dBです。
■ケースにいれたところ
いままで書き込みにはponyprogを使ってきました。 MEGAを使うようになってからponyprogの書き込みソフトでは対応していなく、AVRDUDEを書き込みソフトとして使うようにしていたのですが、最近ときどき書き込みに失敗するようになりました。 デバイスIDを読み間違えるとかはまだ良いのですが、ひどいときにはヒューズビットを書き換えてしまうこともありました。 たいていは外部に水晶発振器をつないでやれば書き込み可能になるのでヒューズビットを元に戻すことができましたが、ついに完全にMEGA168を壊してしまいました(発振しない、外部に発振器をつないでも応答しない、リセット端子がHにならない)。
そこで書き込み器を変更することにしました。 Zilinx用のJTAG書き込み器があるのでAVR書き込み用に新たにJTAGからAVRISPの変換ケーブルをつくりました。 また書き込みソフトをAVRDUDEからELMさん作のAVRSPに変更しました。 いまのところエラーもなく書き込み速度も速くなり満足です。
MEGA168を交換する際にLCDをはずした写真をとりました。
■基板とLCD
AVR のプログラムを公開します。
ピンクノイズがまだ正常動作していないのですが、ほかのことに時間をとられてずーっと触っていないので備忘録も兼ねての公開です。
サイン波形の出力は、以前に書いた「三角関数の加法定理」を使ったものではなく1次関数での補間にしました。 加法定理を使ったものはどうも精度が2ビット程度落ちるためです。