2017年1月22日日曜日

秋月電子で売られているADC12138の設計情報ってなぜかないよね?

昨夜、書きかけで公開してしまい、地雷を踏んだ約10名の方々にはご迷惑をおかけしました.改めて公開します. orz


秋月電子で売られているADC12138というADコンバータICがあります.オーディオ帯域のAD変換にはまぁ便利なんじゃね?っていうスペックなので使ってみることにしました.

なるべく自分では何もせずに楽をしたいので、ネット検索してみたものの、設計情報が見当たりません.あの秋月で売られているのにあまり人気の無いICなのでしょうか? 仕方がないので、楽をしたい人のためにADC12138をこんな風にして動かしましたという情報をタレ流しておこうと思います.

なお、ここに書いた情報が間違っていて貴方がドツボにはまってもわたしは関知しないので素直に死にましょう! 何度も死んでこそ解決する問題もあるよな? そうだよな? なっ?


データシート
データシート(日本語)はあるのだが、読んでもいまいち言いたい事がアタマに入らぬデータシートだった.以下はわたしの脳内理解によるもの.

ピン配置
大雑把には、チップの左側はアナログ8入力マルチプレクサCH0-7(差動・非差動可能)で、右側がデジタルシリアルIFになっている.マルチプレクサを使わない場合は、ADIN1,ADIN2へ音声信号を直接入力してもよい.
変換クロックCCLK
CCLKは最大5MHzの変換クロック.1変換にはなんだかんだと50クロックぐらい要するので、最大サンプリング周波数は100kHzぐらいになる. (以降ではfs=100kHzを設計目標とする)

変換bit数
カタログには12bitADCと書かれているが、差動入力で使うと実質的に13bitADCとして使えるとわたしは理解した.

フルビット定義
ADINへの入力電圧範囲は、VREF+~VREF-の電圧範囲である.(以降ではVREF+=3.3V、VREF-=GND、という設定で進む)    アナログ入力電圧とフルビットの関係は、、、
非差動入力の場合はこうなる.
    3.3V  →  13'b0_1111_1111_1111     フルビット
    GND   →  13'b0_0000_0000_0000     デジタルゼロ
差動入力の場合はこうなるらしい.(実機で動かしてないので推測)
    3.3V  →  13'b0_1111_1111_1111     2の補数の+フルビット
    0.0V  →  13'b0_0000_0000_0000     デジタルゼロ
   -3.3V  →  13'b1_0000_0000_0000     2の補数の-フルビット
すなわち、ADC12138を非差動で使うと符号bitがゼロ固定なので12bitADCとしてしか動作しないが、差動で使うと符号bitが稼動するので13bitADCとして動作してくれる.差動だとアナログダイナミックレンジも2倍お得.(差動については動かしたわけじゃないが、データシートからはこう読めた)

SCLK
SCLKは、ADデータをシリアルIFするための最大5MHzのクロック.CCLKとの同期は不要.
DIはADC←外部へコマンド[7:0]を与えるpin.
DOはADC→外部へADデータ[12:0]を出すpin.

制御信号
DOR,CS,CONV,EOC,PDは制御信号.
   ・DORは出力データの存在を示すが、100kHzで連続サンプルするのにDORを知ってもあまり意味が無いのでシカト
   ・CONVはLOW固定で使えばよい
   ・EOCは変換終了を示すが、100kHzで連続サンプルするのにEOCを知ってもあまり意味が無いのでシカト
   ・PDはパワーダウンなのでシカト
   ・重要なのはCSのみ
シリアルIFはSCLKとCSのみで駆動されると単純化して考えてよい.SCLK=連続した5MHzにして、CSをパコパコとLOW/HIGHさせてDI/DOを上手に操作すればよい.DOを吸い出し終えると次の変換動作が起動される仕組みであるため、ADC12138のサンプルレートは結果的にCSレートで決まる.ゆえにCSを100kHzでパコるのがここでの使い方の基本である.

タイミング
SCLKと信号のtiming関係は、、、
  ・FPGAは入力信号をSCLKのrize-edgeでラッチする
  ・FPGAは出力信号をSCLKのfall-edgeで変化させる
  ・ただしCSの遷移はSCLK=0の期間に行うこと    ←げーっめんどくせぇ
  ・ビット順序はLSBファーストが基本
ゆえにtimingはこんなイメージになる.
なお、実機で試してみて、CSの立ち上がり時刻を右の方に数クロック延長しても異常動作はしなかった.

DIは何をするのか?
入力マルチプレクサ選択、キャリブレート、モード設定、、、などのコマンドである.
使わないときはゼロ固定で良いよね?と思うのが人情だが、そうではなく、サンプル毎にサンプリングコマンドDI[0:7]=8'bYYYY_0010 を送信しなければならない.YYYYはチャンネルセレクトbit.

追記: サンプリングコマンドに問題があるので末尾に説明を追加しました.

キャリブレート
起動後最初に送るのがキャリブレコマンドである. DI[0:7]=8'b0000_1000 を送信した後に、キャリブレ完了までに1msぐらいかかる.wait回路がかったるい.

DOのビットアサイン
サンプルデータが12bitまたは13bitであるのは既に述べた.その他に16bitまたは17bit転送モードがある.しかしADCが16bitや17bitサンプルになるわけではない.
データシートには、12,13,16,17bit転送モードにおけるbit assignが下図のように複雑に定義されている.FPGAが受信するのはDB0ファーストである.
わたしが動作確認したのはpower ON デフォルトの「with sign MSB first 13bits」モードだけである.モニタ信号としてFPGA外部へDB[1:8]を出力させた(下図赤囲い).非差動アナログ信号をADCへ入力したので、符号bitは常にゼロなのでDB0を無視して差し支えなかったのである.


実動作テスト
こういうブロック図で、ループバックテストをした.
上側のDACで1kHz三角波をつくり、ADCに入力する.FPGAは100kHzでサンプル制御する.DOをmonへ回送し、下側のDAC出力をオシロでモニタする.オシロには1kHz三角波が表示されればループバック成功である.
↓プリント基板
DACはR-2Rラダーで作った適当なもの.VREF+をボリウムで与えているが、3.3Vを与えているに過ぎない.
↓制御信号波形
・CSの周期は100kHzであり、サンプル周波数も100kHzである.LOW区間でDOアクセスが生じる.
・AD変換はCSの終了と同時に開始され、約4uSec後に変換終了=EOCが発生している
・これらのタイミング関係から、サンプル周波数を150kHzぐらいまで高くできそうに思われる.
追記: この写真には問題があります.DOが13bitでなく9bitしか変化してません.原因を末尾に追記しました.


以上でおしまい.ADC12138はあまり使いやすいADCではないかなぁ.

それでは読者諸氏の健闘・検討を祈って筆をおくことにしようそうしよう.

かしこ


------
追記: DOがなぜか13bitでなく9bitしか変化しない問題に気づきました.

↓原因は、サンプリングコマンドを表わしているデータシートのこの箇所でした.この箇所はサンプリングコマンドは01000010だと言ってるんですが、現象としてはこれだとDOが9bitになっちゃいます.誤植かもしれませんが、TIサイトの最新の英語版データシートにも同じ情報が記載されています.
↓正しい情報はデータシートのこの箇所です.この4パターンだけがサンプリングコマンドであると明記されています.にもかかわらず、上の01000010はこの4パターンのどれにも該当しません.
ひとまず謎の01000010は隠しコマンドと考えます.感触では変換時間を短縮する効果がみられますが、無視することにします.

↓以上より、サンプリングコマンドを8'b0000_0000にして、アクイジションタイム=6にして、サンプル周波数=78.125kHzを達成しました.これが制御信号の波形です.謎のコマンド8'b0100_0010を使っていた時よりも変換時間が長くかかるようになりますので、サンプル周波数100kHzは達成できなくなりました.ギリギリまで攻めて78kHzです.

修正版のソースコードはこちらです.

かしこ

0 件のコメント:

コメントを投稿