秋月電子で売られている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'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を与えているに過ぎない.
↓制御信号波形
追記: この写真には問題があります.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です.
2024.3.25 リンク切れのためこっちに再upしました.project folder丸ごとです.
top.vがtop moduleです.verilogです.
古いので忘れているのですが、12138という文字がsource code中に出てくるので遠からずと思います.
かしこ
かしこ
ADC12138を使おうとしてこのページを見つけました.”修正版のソースコードはこちら”でソースを拝見したかったのですが,”ご指定のファイル、フォルダーの共有および公開は終了いたしました。 ”と表示され見ることができませんでした.
返信削除ソースの公開をお願いできませんでしょうか?よろしくお願いいたします.
えーそんな、かくにんします.おまちを
削除yahooにupしてた頃のリンクでした.
削除yahooのファイル置き場はclosedでした.
googleに置き直します.
新しいリンクを書きました.ご幸運を.
削除xilinxのISEのprojectです
削除早速のご対応ありがとうございます.プログラムを拝見させていただきます.
削除