18bit ADCボードがようやく完成に近づいてきました。
まず、昨日までの装置で、入力をGNDに接続した状態でキャプチャした波形はこんな感じでした。
青いのがCh1で、赤いのがCh2です。Ch1は、だいたい±2くらいの範囲(≒60μV)で揺れているのですが、Ch2はその揺れは約2倍あるので太く見えます。また周期的な成分も見えます。標準偏差を電圧に換算してみると、46.89uVと69.25uVでした。
ノイズの原因
波形の揺れの原因は、隣にあるDACの駆動用信号から混入してきているノイズでした。DACを止めたところ、ぴたりノイズが止まって線が細くなったのです。Ch2のほうがDACに近いため、ディジタルの信号線からノイズを受けたのでしょう。
DACを止めたときのキャプチャ波形はこんな感じです。
線の太さはほぼ同じになりました。ホワイトノイズは同じくらいになったようです。標準偏差を電圧に換算してみると、42.8uVと46.71uVでした。
ヒストグラムを取ってみても、かなり理想的です。
でも、まだCh2には周期的な成分が見えています。そこでFFTしてみます。
この図は、周波数の最大値が1MHzです。信号を入れていないのでだいたい-140dBくらいになっているのですが、40kHzくらいのところに-130dBくらいのピークが見えます。これが、Ch2で見えていた周期的な揺らぎの成分です。
この40kHzというノイズは、オンボードの超低ノイズスイッチング電源「LT3439」によるものです。およそ2LSBくらいの揺れを生じさせています。Ch1にはこの成分は見えないので、電源ラインを伝わってきているのではなく、トランスからの電磁誘導によって引き起こされているのだと考えられます。
つまり、ノイズは電源ラインから来ているのではなく、空間を飛んできていると推測されます。この対策は基板の改版時に検討してみることにします。
ディジタルフィルタをONしたらすごい性能!
ちなみに、FPGAの内部に作ったディジタルフィルタをONにすると、こうなります。1LSBが30μVですから、すごい精度です。18bitADCの性能が出せたと考えています。
窓関数の効果
さて、こんどはファンクションジェネレータから20kHzの正弦波を入れてみました。
裾野が広がっていて美しくありません。-80dB以下は見えなくなってしまっているので、18bit ADCの意味がありません。
そこで教科書通り窓関数をかけてみることにします。
まずはハミング窓。
Wikipediaによるとナットール窓とかブラックマンハリス窓というのが周波数分解能がよさそうなので、ナットール窓を使ってみました。
すると・・・
わお! すごくクリアに見えたではないですか。
なんだか高調波もいっぱい見えていますが、きっとファンクションジェネレータの性能でしょう。現在使っているファンクションジェネレータは、高調波ひずみが-55dBcという性能です。つまり、搬送波が-30dBなので、高調波は-85dBくらいあってもおかしくない、という性能です。だから、この高調波は、ADCボード上のプリアンプやADCの性能ではない可能性が高いと思われます。
低ひずみな発振器がほしい・・
というわけで、ADCボードはほぼ完成に近づきました。来月には発売できるように詰めの作業を頑張ります!
ADCの値ジャンプが解決できた
2014.01.04
ようやくADCの値ジャンプが解決でき、18bitのADCの性能を堪能できるようになってきました。
まず、0Vを横切る正弦波
常に0Vを下回る正弦波
何が原因だったかというと、ADCに入力される差動信号のコモン電圧でした。
ほとんどの高性能ADCは差動信号で入力を与えることになっていて、この2つの差動信号の平均値をコモン電圧というのですが、AD7986のデータシートでは何Vが良いと明確に定められていなかったので、軽い気持ちでREFINに使っている1.2Vを入れていました。
VIN+が1.2V+xで、VIN-が1.2V-xで振れることになっていたわけですが、なぜかVIN+ - VIN-が-0.01Vくらいのところでは、うまく動かなかったのです。
別にVIN+やVIN-が0Vを下回ったりしたわけではないのですが不思議です。
このコモン電圧を2.5Vにしたらうまくいったというわけです。
もはや最初の回路が原型をとどめないほどに修正されてしまいました。
実はこれ、両面基板なのです。18bitのADCでもパターンに十分気を使って設計したら両面基板でできてしまいました。
ポテンショメータなどをつないで固定電圧を与えたときのキャプチャした波形。
2つあるチャンネルのうちCH0(青)のほうがバラツキが少ないのが謎です。
標準偏差を取ってみると、CH0(青)が49uV(≒1.5LSB)、CH1(赤)が100uVでした。
CH0のほうでヒストグラムを取ってみると、
LSB4個分にほとんどが収まっていることがわかります。これはAD7986のデータシートと比較しても、遜色ないレベルです。
考えてみれば、VCM=1.2Vだと、V-=0、V+=2.4VとV+=0、V-=2.4Vが入力できる電圧の最大値になるわけですから、フルスケールまで使えないですよね?
VCMの値は本来は任意のはずなのですが、ADCによっては予期しない動作をするのかもしれません。このAD7986では、一番良いのはVCM=1/2VREFなのでしょう。
なぜ1.2Vで作ってしまったかというと、以前Texas Instrumentsの石で設計した24bit ADC(オーディオ用の安いADCではなく計測用の高価なもの)がそういう設定にしていたからだと思います。思い込みやうまくいった経験というのは怖いものです。
AD7986で値がジャンプしてしまう
2014.01.03
AD7986を使った18bit ADCの開発を鋭意進めています。
最高速度2Mbit/sでのサンプリングや、サンプリング値のばらつき(標準偏差)を65μV程度に収めるという課題はクリアできるようになってきました。
しかし、どうしても解決できていない問題が1つあります。
0Vよりちょっと下のあたりで値がジャンプするのです。正弦波を入れてみると一目瞭然です。
拡大してみるとだいたい1000くらいの値をジャンプしていますから、30mVくらいです。
正弦波をやめ、このあたりの固定電圧を入力してみてみると・・・
値が激しく行き来しているのですが、この中間の値というものが出てきません。つまり、-15mVの電圧がうまくサンプリングできないのではなく、マイナス方向にバイアスがかかってしまって、この間が飛んでしまっているのではないかと思われます。
いろいろ原因究明の努力はしてみました。
- オシロでADCの入力を見ればこんな波形にはなっていないから、AD変換の際に何かを間違ってしまっているわけです。
- プリアンプがレールツーレールなので、上と下が切り替わるところで変なことが起きているのでは・・・と思って、プリアンプを外してみたけど状況は同じでした。
- また、0Vよりちょっと下(111111xxxxxxxxxxxx)のところで多数ビットが同時に切り替わることによる電源の問題かとも思ったのですが、そうでもなさそうです。
- 2つのCHで同じように起きているので、たまたまAD7986が壊れていたということでもなさそう。
どうやらリファレンス電圧と関係していることがわかってきました。REFという端子の電圧を標準ではない電圧にしたりすると、この値ジャンプが消えて滑らかになります。
あと、考えられることといえば、AINのコモンモード電圧の範囲に制約があるとか、かもしれません。
引き続き調査してみます。