別々の波形を出しながらひずみ率が-90dBを達成した
今日もCosmo-Zの拡張DACのデバッグを進めています。
いろいろな部品を付けたり外したりしているので基板は汚くなってきていますが、
その分、波形は綺麗になりました。
THDもSINADも90dBを余裕で超えられるようになってきました。
これまで2つのチャネルから別々の波形を出した状態では70dB台だったのが、一気に90dB台までいけました。
何を変えたかというと、まず、THS3491という電流帰還OPアンプをやめたこと。このOPアンプはすぐ発振するし熱いし7V必要だし使いこなすのは無理だ。
それから、自作したSepic-Tuk型のDC-DCをやめて市販のDC-DCモジュールにしたこと。DC-DCのノイズを減らすのって意外と難しく、ひょっとしたらコイルの向きとか磁界の結合とかを考えなければならないのかもしれません。それを極めるには時間がかかりそうなので今回は市販のモジュールに戻りました。
さて、S/Nを悪化させている一番大きな原因はDACのディジタル部から漏れてくるノイズでした。
DACの入力にはFPGA等から信号がパラレル(またはシリアル)で送られてきて、それをGNDでリターンしています。ディジタルの入力ピンには電流は流れないはずですが、ピンには容量があり若干の電流が流れています。
また、DACの入力ピンは解放端とみなせるので、ディジタル側から来たエネルギーはほぼ100%反射して戻りますが、LVCMOSなどのシングルエンドのラインではGNDは信号のリターンとしては不十分なので、ノイズとなって放射されます。
つまり14本とか16本のアンテナが並んでいるようなものなのです。その14本、16本の信号が遷移することでアナログ側にノイズとして乗ってしまい、それが出力にまで乗ってきます。
ただし、このノイズは単純な電流のノイズとして乗るのではなく、空間を伝わっていくのか、もしくはGNDを揺さぶっているので、ローパスフィルタでは落とせません。このノイズがどうやって伝播しているかは後で研究することにしましょう。
同様のことがクロックにも言えていて、DACのクロックのラインにクロックを送るだけで、出力から漏れてきてしまうのが観測できました。
クロックを80MHzで動かしているのに、どうして240MHzくらいのノイズが乗るんだろうと悩んでいたのですが、OPアンプの発振ではなく、データバスが80MHzでパタパタ動いているのが240MHzくらいのノイズになって見ていたのです。
下の図はDACの2つのチャネルからSINとCOSを出力したもので、もともとかなり小さい振幅の正弦波を作っています。
振幅に対して大きなノイズが乗っていますが、これはディジタルから漏れ出てきたノイズによるものです。
こういったディジタルラインからのノイズを劇的に減らす方法があります。
XILINXのFPGAでは、XDCファイルに
set_property IOSTANDARD LVCMOS18 [get_ports {dac1_data_op[*]}]
set_property IOSTANDARD LVCMOS18 [get_ports {dac2_data_op[*]}]
set_property IOSTANDARD LVCMOS18 [get_ports {dac3_data_op[*]}]
set_property IOSTANDARD LVCMOS18 [get_ports {dac4_data_op[*]}]
set_property DRIVE 2 [get_ports {dac1_data_op[*]}]
set_property DRIVE 2 [get_ports {dac2_data_op[*]}]
set_property DRIVE 2 [get_ports {dac3_data_op[*]}]
set_property DRIVE 2 [get_ports {dac4_data_op[*]}]
set_property DRIVE 2 [get_ports {dac_clkin_op[*]}]
set_property DRIVE 2 [get_ports {dac_clkio_op[*]}]
のように、電流を制限するための記述を書けばいいのです。
上の例ではI/Oの電流を2mAに制限しています。FPGAの出力電流が制限されたことで空間に放出されるノイズが減ったかGNDが揺さぶられるのが減ったかして、THDが10~20dBは改善しました。
2つのCHに別々の波形を出した状態でTHD -80dB以下を達成することができました。
パラレル入力だといくら減らしても限界はあります。LVDS入力が使えるDACがあれば使いたいものです。
| 固定リンク
コメント