メモリーバッファーのアクセサリー?の巻き 2011.1.18
DAC8741-2を作っていて感じたのですが、メモリーバッファーと組み合わせる場合はメモリーバッファーの
周波数の設定スイッチが必要です。まあ、必要性はわかるのですが、これって自動切り替えできると便利だな〜
とふと思いました。
DAC8741-2をつくるときにとりつけたメモリーバッファーの周波数切り替えスイッチ
周波数の自動切り替えをするには周波数の判別が必要になりますが、
これについてはワンショット(74HC123)をつかうと意外と簡単にできます。
ということで、メモリーバッファーの自動切り替え回路を描いてみました。
こんな感じかな?
メモリーバッファーの切り替え回路
回路的には簡素にしているのでICは4〜5個で済みます。88.2kHzとか32kHzとかが入力されても、
それぞれ96kHzとか44.1kHzに誤判別されてしまいますが、これはしかたのないところです。
でも、これだけだと面白くないですね。
もっと、選択された周波数をLED表示するとか、32〜192kHzのフルバンドに対応できるとかしたほうがおもしろそうです。
こりゃ、ちょっと楽しくなってきました。
それに現在のメモリーバッファーは44.1、48,96,192kHzの4パターンのみの対応ですが、
いっそのこと32〜192kHzの7パターン対応にしてみるのも楽しいかもです。
これならASRCと気楽につなげることができます。
回路構成は?
ワンショットをひたすら並べる(7個?)のもシンプルでいいのですが、いかんせんR、C、VRが並ぶので部品点数が多くなります。
もうすこしスマートな方法を考えてみましょう!
こんな感じならワンショットが4ICで32〜192kHzまでフルデコードできそうです。
考え方としては、最初に96kHz以上かどうかを判別して、96kHz以上なら1/2分周して、つぎは48kH以上かどうかを判別。
そして、最後に44/48kHzを判別します。32kHzについては系統が違うので、別途判別回路を設けます。
こんな感じにするとICの個数も減ります。トータル6個です。
メモリーバッファーを動かすには
メモリーバッファーは基本は128fsで固定です。しかしWM8741などでは44.1や48kHzでは128fsでは動かないので、
周波数を上げる必要があります。そこで、再度システムクロック周波数を整理してみました。
MB用システム クロック(128fs) |
DACシステムクロック | ||
192kHz | 24.576MHz(24.576/1) | 24.576MHz(128fs) | |
176.4kHz | 22.5792MHz(22.5792/1) | 22.576MHz(128fs) | |
96kHz | 12.288MHz(24.5792/2) | 24.576MHz(256fs) | |
88.2kHz | 11.2896MHz(22.5792/2) | 22.5792MHz(256fs) | |
48kHz | 6.144MHz(24.576/2) | 24.576MHz(512fs) | |
44.1kHz | 5.6448MHz(16.9344/3) | 16.9344MHz(384fs) | |
32kHZ | 4.096MHz(24.576/6) | 24.576MHz(768fs) |
こうやってみると、案外すくない水晶数でいけそうだけど問題有りです。222.5792MHzの水晶振動子が手にはいりそうにありません。
やっぱり、メモリーバッファーのフルデコードは無理かな〜???
こうしょう!
入力の判別は32〜192kHzでフルデコードできるけど、MBとの切り替えはあくまでも44,48,96,192の4パターンのみ。
こうすれば、周波数判別器としてつかう場合にはフルスペックだし、MB対応としてもフルスペックです。
ついでにWM8741を接続するときの、周波数判別出力回路も設けました。
最終回路図かな?
一応完成? 2011.1.22
回路図も最終型で清書しました。といっても、単純に部品番号を振り直しただけですが・・・・
回路図(最終版) クリックするとPDFが立ち上がります。
アートワーク クリックするとPDFが立ち上がります。
さて、次ぎに他の基板を試作するときに合わせてつくってみましょう。
基板を試作する!
えい!と試作にかかりました。必要なICも調達しないとね。
一気に!
組み立てて動作チェックしてみました。
一応問題なく動いたのですが、ケアレスミスがあって、基板の裏側は少し修正がはいっています。
動作チェックの様子。無事動きましたが・・・
すこしわかりにくいですが、パターンカットとジャンパー線があります。
リリースするなら修正版にしたいですね。修正箇所は少ないのですが、
細かい作業になってしまいます。
裏面の修正の様子。
ちょっと備忘録 2011.2.5
この回路での調整のポイントはワンショット回路での時定数になります。
まずはワンショットの時間が抵抗でどのように変わるかを測定しておきました。
コンデンサ1200pF(10%誤差)のときは下図のようになりました。
それで、周波数の弁別に必要な抵抗値はどのようになるかを整理。あわせて
固定抵抗と半固定抵抗の組み合わせも列挙しておきましょう。
許容誤差が10%以上あれば、コンデンサにJクラス(10%)と抵抗値(1%)で
半固定抵抗なくても何とかなるかもしれませんが、ICのばらつきも考えると
やはり半固定抵抗にしたほうが無難かな?
それにしてもIC8の設定が一番シビアになります。そりゅあ、44.1kHと48kHzを分離しないと
いけないですからね。
fs(kHz) | 分離の為の設定周波数 (kHz) |
設定パルス幅 (uS) |
抵抗値 (kΩ) 1200pF時 |
許容誤差 (%) |
組み合わせ例1 | 組み合わせ例2 | |||
32 | 固定 抵抗 |
半固定 抵抗 |
固定 抵抗 |
半固定 抵抗 |
|||||
37.6 | 26.6 | 21.6 | 14.8 | IC1の設定 | 16k | 10k | 16k | 10k | |
44.1 | |||||||||
46.0 | 21.7 | 17.6 | 4.1 | IC8の設定 | 15k | 5k | 12k | 10k | |
48 | |||||||||
65.1 | 15.4 | 12.3 | 26.2 | IC7の設定 | 10k | 5k | 7.5k | 10k | |
88.2 | |||||||||
92.0 | 10.9 | 8.5 | 4.1 | ||||||
96 | |||||||||
130.1 | 7.7 | 5.9 | 26.2 | IC2の設定 | 5.1k | 2k | 5.1k | 2k | |
176.2 | |||||||||
183.9 | 5.4 | 4.0 | 4.2 | ||||||
192 |
もう一枚つくってみよう!
1枚目をつくったときは、製作してからミスが判明したので部品が実装されていることもあり
基板の裏側のパターンを修正する必要がありましたが、部品面で修正したほうが簡単なので、
確認も含めてもう一枚つくってみました。
修正個所は下図の通りですが、こうすると簡単です。
ただし、一部のコンデンサは裏側につける方が便利そうです。
修正個所。部品を取り付ける前に行う必要があります。 最終状態。一部の部品は裏側に付いています。
完成するとこんな感じになります。出来るだけ背を低くしたかったのでコンデンサはすべて寝かせています。
完成! でも、これは要修正版です。
裏面に取り付けたコンデンサはこんな感じでとりついています。
裏面の様子 裏側に取り付けたコンデンサ
単体で調整完了!
まずはVRの調整をします。ほとんどVRは中央の位置で調整が済んでいます。
ほぼ計算通りです(あたりまえですが・・・・)。
単体で動作確認して調整しました。
メモリーバッファーと接続しよう!
メモリーバッファーと接続するにはLRCK信号を取ってくる必要があります。これはCS8416の28ピンから出ている信号です。
ICから直接取り出すのも難しくはありませんが、途中のランドがありましたからここから取り出すことにしました。
メモリーバッファーからLRCK信号を取り出し。
メモリーバッファーの上に亀の子状態で取り付けて互いに配線します。
それほど配線数は多くないので簡単です。
メモリーバッファーとの接続の様子
動作確認!
メモリーバッファーにはASRCが信号を入れて、44.1〜192kHzで周波数を変更させましたが、
LEDは周波数に応じて該当個所が点灯することを確認しました。
またメモリーバッファーも44.1,48,96,192KHで自動切り替えができることも確認できました。
自動切り替えを確認。点灯状態は44.1kHzの様子ですがストロボ焚くとわかりにくい・・・
さて、このアクセサリーはどれにとりつけようかな?
SPDIF Freq. Checker V2?
先週にハードウエアロジックで構成したメモリーバッファー用のアクセサリーをリリースしましたが、
PICマイコンのマニュアルをみていると、PICだけで実現できそうな気がしてきました。
PICのプログラミングの勉強にちょうどいい題材かもしれません。
まずは、ピン機能について定義をしておきましょう。
ちょうどタイマー1にLR信号を入力して周波数を判定します。
ピンの接続配置案
周波数の判定には、時間を計測するために内部に正確なクロックが必要になります。正確といっても、
どのくらい必要になるかを考えてみると、いちばんシビアな判定が44.1kHzと48kHの判別ですが、
周波数差では8.1%ですので、それを判別するには倍の精度が必要で約4%の内部クロックの精度が必要です。
PIC16F819のマニュアルを見るとクロックの標準的な誤差は1%で使えそうに思いましたが、
通常の使用範囲での最悪値では5%となっています。ということは、使えない場合もでてきます。
やはり外付けのクロックはあったほうが良さそうです。
内部クロックの常用温度範囲では5% の誤差を見込む必要がありそうです。
使えるクロックとしてはMB基板の上に乗っている16.9344MHzが良さそうです。
あるいはセラロックをつかってもいいかな?
村田製作所からでているセラロックの精度は0.5%です。これなら無調整でもつかえそうです。
まあ、どちらでもいいですね。ただ、このプログラムを汎用的に使おうと思えば、いつも16.9344MHzの
発信器がそばにあるとは限らないので、20MHzのセラロックをつかった方がよさそうです。
セラロックって30円と安いですからね。
プログラムのロジックはこんな感じです。
1.周波数を判別する。
a)タイマー1をクリアーする。
b)一定時間待つ(50msec)
c)タイマー1を読み出す。
d)各周波数の1%程度の偏差なら、その周波数と判断する。
1584 〜 1616 なら 32.0kHz
2183 〜 2227 なら 44.1kHz
2376 〜 2424 なら 48.0kHz
4366 〜 4454 なら 88.2kHz
4752 〜 4848 なら 96.0kHz
8732 〜 8908 なら 176.4kHz
9504 〜 9696 なら 192.0kHz
e)どの周波数にもマッチしない場合は、No-signalと判定する。
下記の2種類の判定を行う(汎用性を持たせるため)
・メモリーバッファーの動作周波数範囲(44.1,48,96,192kHz)
・32,44.1,48,88.2,96,176.4,192kHz以外
2.周波数に応じて必要なピンのH/Lを設定する。
3.1に戻る。
ICのピン機能はこんな感じでしょう。
(急告)
SPDIF Freq Chekerの製作マニュアルの部品表に修正がありました。
製作マニュアルR2に変更しています。
注意しないと!2011.2.27
最初のSPDIF freq checkerではタイミング判定に74HC123をつかいましたが、
同じ型番でもメーカによっては時定数の係数が随分ちがうようです。
パルス発生時間は
T=k×R×C
T:パルス時間、R:抵抗値、C:コンデンサ容量、k:係数
で与えられますが、このkの値がメーカによって倍程度ことなるようです。
注意が必要です。
やはり、アナログ的な時定数の設定は微妙な時間判定には向かないかもしれません。
(同じメーカで頒布品が整えられればいいのですが)。
やはり、PICなどをつかったディジタル的な判定をした方がいいかもしれまん。
ところで、PICの内部クロックの精度は前述で1%程度、最悪値5%であると紹介しましたが、
実力的にはどうか調べてみました。実質1%程度の精度なら、内部クロックをつかうのも有りです。
外付けにすると何かと部品点数も増えてしまいます。
確かめる方法は
下記の命令を実行して、どの程度のパルス周期がでるかを観測しました。
BSF IOピンのビットセット 1cycle命令
BCF IOピンのビットクリア 1cycle命令
GOTO $-2 ジャンプ 2cycle命令
上記の命令だと全部で4サイクルで済みます。PICは1命令(1サイクル)は4クロック分ですから、
命令一巡で16クロックになります。これから周波数の精度がわかります。
命令を実行してIOピンを観測
手持ちのPICで調べてみました。
結果はこんな感じです。
PIC16F887(40p) 内部クロック8MHz | PIC16F819(18p) 内部クロック8MHz | PIC16F675(8p) 内部クロック4MHz | ||||||
実測周期 (kHz) |
内部周波数 (MHz) |
誤差 | 実測周期 (kHz) |
内部周波数 (MHz) |
誤差 | 実測周期 (kHz) |
内部周波数 (MHz) |
誤差 |
500.62 | 8.00992 | 0.124 | 497.96 | 7.96736 | -0.408 | 252.82 | 4.04512 | 1.128 |
502.12 | 8.03392 | 0.424 | 499.78 | 7.99648 | -0.044 | 250.99 | 4.01584 | 0.396 |
500.04 | 8.00064 | 0.008 | 501.2 | 8.0192 | 0.24 | 252.55 | 4.0408 | 1.02 |
501.64 | 8.02624 | 0.328 | 495.83 | 7.93328 | -0.834 | |||
500.63 | 8.01008 | 0.126 | 495.87 | 7.93392 | -0.826 |
PIC16F887,PIC16F819は精度いいですが、PIC12F675では1%をわずかに越えるものがあります。
気温が低いからかな?この誤差は微妙だな〜。
少し余裕をみて、使う石をPIC16F819に限定して内部クロック誤差3%まで許容するプログラムのパラメータに
すれば安心はできそうです。
3%の誤差をもたせると、こんな範囲での判定になりそうです。
fs(kHz) | -3%値 | +3%値 |
32 | 31.04 | 32.96 |
44.1 | 42.78 | 45.42 |
48 | 46.56 | 49.44 |
88.2 | 85.55 | 90.85 |
96 | 93.12 | 98.88 |
176.4 | 171.11 | 181.69 |
196 | 190.12 | 201.88 |
実際にプログラムしてみましょう。
プログラムの前に、ピン配置と機能の定義だけをしておきました。
PIC16F819をつかうので、IOピンはすこし余ります。
プログラムは書けました。だいぶプログラムもなれてきたので、割と短時間でかけるようになりました。
動作確認!
確認のための回路を組みますが、機能をアサインしたIOピンにはすべてLEDをつけるようにしました。
回路図はこんな感じです。
小さいプリント基板があったので、それに無理矢理に組み付けました。
部品面の様子 裏面の様子。一応パスコンもいれてみました。
通電!
PICにプログラムを書き込んで通電です。いつもならヒヤヒアしますが、これだけのハードなら
煙がでてもしれています(笑)。
さて、動き出しましたので動作の様子を写真にとっておきました。
未入力時(周波数が範囲外の場合)
32kHz入力時 44.1kHz入力時 48kHz入力時
88.2kHz入力時 96kHz入力時 176.4kHz入力時
192kHz入力時
想定通りの動きをしてくれました。これだけの少ない機能ですが、ハードのみで組むと結構部品点数が必要ですが、
マイコンがあると部品点数も少なくてすみます。ハードロジックからソフトロジックへの変遷に納得です。
基板にしてみると・・・・
一応水晶も取り付けられるようにしてみましたが、これって基板をおこすほどの配線でも無いような気がしてきました。
簡単な基板パターン。わざわざ基板つくる必要なさそうです。
まあ、しばらく考えてみましょう。
これから秋葉へGO東京へ前泊出張です。← ハムさん風
(つづく)