Renew ASRC を Renewしよう!の巻き 2011.4.18


とりあえず、関係しそうな石を買ってみた。今回はソフト制御を考えているので
ASRCにはSRC4193を使用することにしてみましょう。
この先に作業も進めたかったけど、変換Pinを買う数が足りなくてお預けです。

変換Pin到着 2011.4.23
さっそく残りの主要なICを変換基板に取り付けました。
これでいよいよブレッドボードでの組み立て作業にはいります。


必要になりそうなICを変換ボードに取り付けてブレッドボードでの作業準備完了です。

まずは配線図 2011.2.24

まずは全体の配線がどのようになるかを確認の意味で書き出しました。
こうやってみるとICの左側が入力で右側が出力に配置されているのがよくわかります。
実際の実装もこのようにできればいいのですが、受動部品の配置などもありそうそううまくいかないこともあります。
しかし、この段階でもう少し綺麗に書けば回路図にもなるのにね。これだと単なるメモです(笑)。


配線図もできたことなのでブレッドボードに組み付けていきましょう!
制御に必要なマイコンはPin数の多いPIC16F887をつかうことにしました。

ブレットボードにとりつけたIC類

まずはこの段階で必要最小限のソフトを組んで、動作確認をしてみましょう。

出力周波数は32、44.1、48kHz系から選択しますが、その半分、通常、倍、4倍から組み合わせできますので
都合12通りのサンプル周波数を選択できます。実は、さらにその他の周波数を出すこともできますが、
あまり実用性はないと思われます。今回は12通りの周波数を3秒おきに切り替わるソフトを簡単に組んでみました。
入力信号から、どの周波数かを表示させるには、最近つくったFFDAC1795や役に立ちました。

出力周波数  FFDAC1795での表示 説明
16kHz こんな周波数は想定していません。
でもロックはします。
22.05kHz 22.05kHzで正解
24kHz 24kHzで正解
32kHz 32kHzで正解
44.1kHz 44.1kHzで正解
48kHz 48kHzで正解
64kHz こんな周波数は想定していません。
でもロックはします。
88.2kHz 88.2kHzで正解
96kHz 96kHzで正解
128kHz こんな周波数は想定していません。
でもロックはします。
176.4kHz 176.4kHzで正解
192kHz 192kHzで正解

とまあ、こんな感じでFFDAC1795の表示機能の再確認にも役立ちました。
実用上で使う周波数は
 44.1,48、88.2、96、176.4、192の6通りくらいを用意しておけば十分なような気がします。
でも、色々な周波数が出せると面白いかな?

基板を描いてみましょう。 2011.4.27

出張先の夜長をつかって一気に書いてみました。ほとんど夜なべ(笑)。
いろいろと考えていて、単なるASRCだけでなく汎用DAiとしてつかえるようなことを考えています。

新しいASRC基板はどんな風になるでしょう?


いや〜 2011.5.26

ほとんど1ヶ月ぶりの作業再開のような気がしてきました。


試作基板の製作完了です。

良い子は寝る時間ですが、折角なので表面実装部品だけでも半田付けしておきましょう。
あとはまた別の日に。


まずは表面実装部品のみ半田付けです。

ハードは完成! 2011.5.27
のこりの部品をとりつけてハードはとりあえず完成です。折角なのでお出掛け用の写真をとりました。
40Pのマイコンは適当なものを探してとりつけました。とりあえず写真撮影用ということで(笑)。
ご存じの方も多いかと思いますがTOSHIBAのZ80(6MHz)です。
昔は、このCPUに随分お世話になりました(もちろん趣味ですが・・・)。

ハードウエアはようやく完成しました。

動作確認!

動作確認にはPICにプログラムを書く必要がありますが、ブレッドボードで組んだときのソフトがあるので
それをそのまま移しました。といっても、I/Oの接続がまったく異なっているので、I/O定義をすべて
書き換えましたので、それなりに時間はかかりました(といっても30分程度ですが・・・)。
で、プログラムを書き込んで電源を繋いでテストです。

電源をいれる瞬間が一番ビクビクするときですが、逆に一発で動くとドキドキに変わる瞬間でも
あります。やはり自作って面白いですよね。

で、電源を入れてみたところ一発で動きました。というか少なくともPICは動作して
液晶は表示できたというところでしょうか。でも液晶表示にUNLOCKっと出なかったので
CS8716までは動いていそうです。

電源を接続して動作確認の様子。

おそるおそる、出力端子(パルストランス出力)をオシロで見てみましたが、
一応信号はでているようです。やっぱり問題なく動いているかな?


オシロの出力は問題ないようです。

無事動いているようなので・・・ 

DACに接続して問題なく動いているようなので、ソフトを本格的に組んでみました。
もともと液晶は必須ではなく、なくても動作上は問題ないのですが状態表示用にあると便利です。
シンプルに入力チャンネルと入力信号の周波数と出力周波数を表示させるようにしました。
  
入力1、48kHz入力を44.1kHzに変換。            入力1、48kHz入力を192kHzに変換。  


入力1でスルーモード(ASRCはバイパス)


入力3で信号がないためアンロックの様子。

もうすこし表示は考えたほうがいいかな?

あわせてDAI出力も確認

このASRCは前作のASRCと同様にDACに直接つなげられるDAI端子も備えているので、その確認もしてみました。
PCM1794などの普通のDACに繋ぐとオーバーサンプリングのディジフィルを通ってしまうので、今回はR−2Rに接続してみました。
このR-2R DACはこういった用途にはとても便利です。


R−2Rと接続してDAI端子の機能を確認

2kHzの正弦波を入れて動作の確認です。
アップサンプリングの効果がでてますね。192kHzにすると波形がなめらかになります。
これはASRC内部のディジフィルの効果になります。

44.1kHzで出力した場合                192kHzで出力した場合

とりあえず、これでハードの確認は無事おわりました。
あとはソフトを見直していきましょう。

ソフトは2種類

FFDAC1795と同様にシンプルファンクションモードとフルファンクションモードを作ってみました。

シンプルファンクションモード

基板の接続は前作のASRCと同様に外部のロータリースッチで周波数や入力を切り替えます。
THRの機能もあります。
周波数の切り替えは32,44.1,48,88.2,96,176.4,192kHzの7種類になります。

シンプルファンクションモードのときの接続

シンプルモードでは液晶は必要ありませんが、とりつけると下記の様な感じで表示されます。
なおシンプルモードではDAI出力端子は右詰24Bitで固定になります。

シンプルファンクションモードでの表示


フルファンクションモード

フルファンクションモードでは入力切替えおよび周波数切替えをプッシュスイッチになります。
そのため、液晶表示は必須になりますが、多彩な設定が可能です。
これはこのASRCがディジタルセンターとしても使えるように考えているからです。

フルファンクションモードでの接続。きわめてシンプルになります。

液晶表示で少し変更したのは、入力表示に単純にINPUTのみの表示ではなく、
具体的にどのような入力形態なのかを表示できるようにしました。
この表示は各チャンネル毎に設定できるようにしています。
入力表示の種類は下記の5種類です。
    
 同軸入力の場合                     光入力の場合                       XLR入力の場合

 
 USB接続の場合                      一般的な表示

メニュー表示は機能満載?

周波数の切り替えは全部で12種類あります。
16、22.05,24,32,44.1,48,64,88.2,96,128,176.4,192kHzから選択が可能ですが、実用的に
これらをすべて使うことはないと思うのでメニューモードでは、どれを選択できるかを設定できるようにしています。

メニューモードは沢山あるので、すべてを紹介しませんが、
DAI機能を充実させるために、DAI端子の設定も可変できるようにしました。

出力形式は右詰、左詰め、I2Sが選択できるようにしています。

出力形態の設定。画面は右詰の設定の時。

出力ビット数も16、18,20,24から選択が可能です。

出力ビットの設定。画面は24bitの設定の時。

また、メニューモードでASRC内の内挿フィルターのバイパスモードの設定を入れました。
バイパスモードをONにすると、ダイレクトに出力されます。
単純にアップサンプリングやダウンサンプリングしたいときに便利でしょう。
これをONにすると、DAC側のディジタルフィルターの音調を直接感じることができるはずです。
WM8741などを使うときに便利な機能です。

下図はインパルス入力時の応答を示していますが、バイパスモードONでは何もフィルターが
入っていない様子がわかると思います。

バイパスモードOFFの場合(既定値) バイパスモードONの場合


DAI出力を確認してみよう! 2011.5.31

DAI出力は色々なDACに接続できることを想定して右詰、左詰、I2Sのフォーマット切り替えができるように
してみましたが、実際に動くかどうかわからないので、入力フォーマットが可変できるDACに接続して
試して見ましょう。

入力可変のDACとして部品箱を探したたらPCM1716が見つかりました。
24Bitですが96kHz対応ということで、一世代は前のDACになります。
これって、お勉強DAC1で採用したDAC素子なんですよね。
ちょっと懐かしくなりました。


今回使用したDAC1716です。24bitですが96kHzまでの対応です。

では、早速ブレッドボードに実装して確認テストをおこないました。


ブレッドボードでテストの様子。

液晶も新調!

折角なので液晶も青色白抜きのLCDに変更しました。
この色調って結構オーディオに合うのではと思ったりします(笑)。

まずはPCM1716を右詰め16bitに設定しました。
ASRCの設定が24Bitの場合は出力は乱れてます。
 
 PCM1716の設定が16Bitに対してASRCが24Bitだと出力がぐちゃぐちゃ。

というわけで、おもむろにASRCの設定を16Bitに変更したら、正常な波形がでるようになりました。
これで出力ビット数については問題なく動いているようです。

 
 PCM1716の設定が16Bitに対してASRCが16Bitだと出力は正常です。

つぎはPCM1716をI2Sの16Bitに設定しました。
ASRC側が右詰にしていると、出力信号はシーンとしてます。

 
 PCM1716の設定がI2Sに対してASRCが右詰だと出力が出ない。

ASRC側の設定をI2Sにすると、無事波形がでるようになりました。
これでフォーマットの切り替えも問題ないことがわかりました。左詰めの確認ができてないのですが、
たぶん大丈夫でしょう。

 
 PCM1716の設定がI2Sで、ASRCがI2Sだと出力は正常です。

これでDAI端子の出力も問題なさそうです。

マニュアル作成 2011.6.1

製作マニュアルを作成しました。メニューモードの設定項目はこちらを参照ください。
さて、そろそろリリースの準備にはいりましょう。


組み合わせはやっぱりRenew DAC1704かな。 2011.6.7

FFASRCをディジタルセンターにして、ここいらでDACを組み上げましょう。
FFASRCは多彩なな変換周波数とバイパスモードなどを持っていますが、さらにDAI出力もあるのでマルチビットのDACに接続すると
その本領が遺憾なく発揮できそうです。ということで、以前につくって箱にいれてなかったRenewDAC1704と組み合わせてDACをつく
ってみましょう。必要になりそうな基板をかき集めてきました。


必要になりそうな基板をごそごそと調達。

全体の構成としては下図のような感じです。多機能にしたいので、出力は固定出力と高精度電子ボリュームを使用した
可変出力を設けましょう。そして、ヘッドホンも多用するのでお気楽HPA(電子ボリューム版)も登載したいと思います。
電源容量はかなり要りますが、RA40で十分でしょう。

正負15Vの電源系を充実させる必要がありますので、そのためにTYPE-Dの電源の前にシンプル電源を
置くことにします。この基板はすでに在庫が無くて、新版をつくっていたのですが、ちょっと恥ずかしいミスが
あってリリースはせずに自家用にしていました。
 リードタイプのコンデンサとブロックコンデンサのどちらも登載できます。さらにダイオードも通常のリードタイプと
ブリッジタイプも登載可能です。


ちょっと前につくったシンプル電源基板。


こんな感じでコンデンサを登載可能です。

あとは電源基板TYPE-Dが一枚足りないのと、5V用の電源TYPE-Eについては放熱板の大きいタイプに
作りかえたほうが良さそうです。

さて、10枚もある基板を1つのケースに収められるかどうが問題です。
結構パズル的な要素があって面白いかもです(笑)。


バグ発見&修正!

表示の部分にバグがあることがわかりました。動作には問題ないのですが修正して送付済みです。
なお、ついでに表示部分の機能拡張しました。
入力表示は最終的にはこれだけ入れています。
表示部分のプログラムを抜き出しました。

ChannelStringCasePrint(int n)
{
switch(n){
case 0: printf(lcd_char," INPUT:"); break;
case 1: printf(lcd_char,"COAXIAL"); break;
case 2: printf(lcd_char,"OPTICAL"); break;
case 3: printf(lcd_char,"XLR-AES"); break;
case 4: printf(lcd_char," PC-USB"); break;
case 5: printf(lcd_char,"COX-BNC"); break;
case 6: printf(lcd_char,"DVD-OPT"); break;
case 7: printf(lcd_char,"DVD-COX"); break;
case 8: printf(lcd_char," TV-OPT"); break;
case 9: printf(lcd_char," TV-COX"); break;
case 10: printf(lcd_char,"NETWORK"); break;
default:break;
}
}