RasPiのIOをつくる(後編?)、の巻き! 2020.7.29

(前編はこちら)

12ビットのDACとADCをRasPiのGPIOに接続して動くようにしたのはいいけれど、SPI制御をソフトウエアで行っているので
OSの割り込みの影響をもろにうけてしまって、サンプリング時間に大きなばらつきが発生します。
のんびりした計測ならまだしも、時間間隔を気にするような計測には使えません。

ということで、IO基板について再検討することにしました。

求める仕様は

折角なので、DACとADCについては16ビットのものにしたいと思います。
そして、RasPiで制御できるけれど、測定時間間隔が一定になるように、
DACとADCが動くときは、RasPiの制御からはなれて独立して動く形をとりましょう。

RasPiのGPIOのうちHWで動くSPI制御をつかえば、一定間隔でのサンプリングもできるかもしれませんが、
私にとってはすこしソフトウエアのハードルが高そうです。

まずは素子選び

DACとADCについては16ビットのものを選択します。DIGIKEYの検索機能をつかって素子を選びますが
山ほどでてきます。その中からDACについてはR-2R型、ADCについては逐次比較型、そしてデータの
転送はSPIに絞って選択します。変換方式としてはデルタΣもあるとは思いますが、なんとなく高周波の
ノイズがでそうでやめておきました。
 さて、条件を絞っても、相当な数がでてきます。でも、酔っ払いモードで、かつ寝床で寝落ち寸前で
ノートPCを弄っているので、選択はいい加減です。とりあえず発注まで行いましたが、一晩あけて、
注文した型番は覚えていませんでした(笑。


選択したのは

とりあえずADCとDACについては、それぞれ2個づつ注文しました。

1)DACはDAC8831ICD
DACはINL(積分非直線性)が1LSBのもののなかからDAC8831ICDを選択しました。注意したのは末尾のアルファベットです。INLが1LSBになるのはICDだったので
それを間違えないように注文です。


数あるDACの中からこれを選択しました。

INLが1LSBものは沢山ありましたが、DAC8831の使いやすそうなところは、外付けにOPアンプが必要ですがDAC内部の抵抗をつかってバイポーラ出力ができるという点でした。
もっとも、他の電圧出力のDACでもバイポーラ出力にするにはOPアンプが必要ですが、DAC8831は必要な抵抗がDAC内にあるので抵抗の精度とかをあまり気にする
必要はないというところです。


外付けのOPアンプが必要になりますが、バイポーラ出力が簡単につくれます。

2)ADCはなんだったけ?

ADCはほんとに何を注文したか思い出せなくて、あとで注文履歴をみてADS8685IPWRということがわかりました(笑。
で、これにした最大のポイントはデータシートをみて思い出しました。
 入力レンジが変更できるということと、なぜか単電源動作なのにバイポーラの入力ができる点です。これについては、勘違いかもしれませんが
酔っ払いモードなので深くは考えていないです。ハイ。


ADCはこれを選びました。

でも、素面の今になって再度読み直してみると書いてありますね。どういう原理で、実現しているかはすごく気になります。


ただ、このADCは機能がいろいろとあるのでレジスターの設定とかがあり、すこし扱うのが難しそうです。
マニュアルをちゃんと読まないとだめですね。

ちょっと選択ミスった?

データシートの最初にHigh Speed : 500kSPSとあったので、速度は全然気にしていなかったけど
ブロック図をみていて気になるものがあります。2nd ORDER LPFなるものがはいっています。

LPFが入っていますが、この特性が気になります。

で、マニュアルを眺めていくとLPFの特性がありました。なんと、500kSPSなのにLPFのカットオフ(-3dB)は15kHzのようです。
ちょっと低いような・・・、こんなもんかも知れないような・・・・100kHzくらいを期待したのですが・・・・ちょっと選択ミスったかな?
でも、エイリアスに悩まされなくてもいいかも・・・・とりあえずポジティブシンキングです。

もう、買っちゃたもん!

パルス信号を観測するには、すこし低いLPFですが、普通の正弦波をあつかうならこんなもんでしょう。10kHzの正弦波を正確にトレースしようと思えば
32点程度の観測点が必要ですが、そうなるとサンプル速度は320kSPSになりますので、このADCの仕様が500kSPSを考えると妥当なLPFの設定でしょう。
それに、そこまで早く動かすのは難しいでしょう(早くても100kSPSくらいが限界です)。


結構低めのLPFが入っています。


部品到着! 2020.8.1

 DAC8831とADS8685が到着しました。それぞれのパッケージはSO-14(1.27mm)とTSOP16(0.65mm)なので、
それに合う変換基板を用意します。
 DAC8831はSO14なので、SO28用の変換基板をつかってICを2個乗せます。
ADS8685はTSOP16なのでSSOP28用の変換基板の両端を切り落として短くした変換基板を用意しました。


まずは変換基板を用意しました。

まずはADS9685から試してみましょう!

とりあえず変換基板にICを取り付けます。変換基板には必要となるパスコン類やRESET端子のプルアップ抵抗などは
事前にとりつけておきました。とくにパスコン関係はICのできるだけ近くにとりつけたほうがいいので、変換基板上がいいでしょう。


まずは変換基板にICをとりつけて、パスコンも実装です。


動かしてみましょう!

ADS8685の長所としては、+5Vの単一電源ながら、バイポーラ(正負電圧)の測定ができるところにあります。
もし本当なら無茶苦茶便利なDACです。絶対ファンになってしまうと思います(笑。

まずは、カタログどおりに動くかどうかが試してみたくなったので、簡単なボードに乗せて
動作確認です。

小さい基板にのせて評価用の回路をつくります。

こういった評価のためにPICを載せた基板があるので、それに接続して確認してみます。

PICを搭載したテスト用の基板に接続です。

すばらしい!
入力にファンクションジェネレータから振幅2.5V、2Hzの正弦波をADS8685に入力して、生成されるADCのコードを確認してみました。
ADCのサンプルは10ms毎として100点をサンプリングします(約1秒間)。
ADS8685は入力にプログラムできるアンプが搭載されており、バイポーラでの入力範囲を±3VREF(約±12V)〜±0.625VREF(約±2.5V)
の5段階で可変できます。それぞれのゲインでの測定結果は下図になります。
 
 GNDレベルのAD変換コードが0x8000、すなわち32768ですが本当にバイポーラで動いていますね。すばらしいです。

ちゃんと、バイポーラで測定できています。

つぎに、入力をGNDに短絡して変換の安定性をみてみましょう。感度を最大の0.625VREFに設定しての測定です。
変換結果は下図になりますが、±1.5LSBに納まっているようです。簡単な変換基板をつかっていますが、
S/Nは結構いいかんじです。
 本来はGND接続なので変換コードは32768になるはずですが、1.5LSB程度のオフセットがのっています。
これは、あとでソフトで補正です。ちなみに、0.625VREFレベルでの1LSBは78uVですから小さいものです。


変換の安定性も高いようです。

ちなみに、評価用のPICを64MHzで動かしてみてどのくらいのサンプリング速度がでるかを計測してみると、
およそ100kSPSとなりました。PICもやればできるものです(笑。データの収集プログラムにはビット演算が含まれるので、
これを省略できればもっと早いサンプル速度が実現できそうです。すなわち、直接AD変換結果をシリアルRAMに書き込むように
すれば、いまとり2〜3倍の変換速度は得られるでしょう。


次はDAC8831かな・・・

リファレンスはどうしよう?
つぎはDAC8831ですが、DACについてはあまり懸念する材料がないので、事前に評価をする必要はないでしょう。
ただ、どうしようかと悩むのは基準電圧源です。データシートでは2.5Vの基準電圧源をつかっています。データシートでは
リファレンス電圧は1.25VからVDDの範囲なので、3.2768Vに設定すれば、1LSB=0.1mVになるので扱いやすいかもです。
ただし、リファレンス入力のインピーダンスが低いのでOPアンプでバッファリングしたものを接続する必要があります。
さて、この電圧はどこから調達しようか? TL431(2.495mV)をベースにするかな?それとも、ADS8685からもリファレンス
電圧(4.096V)がでているので、そこからつかうのがいいかな?

結局、あんちょこに・・・

TL431をつかうことにしました。一応、安定化のために定電流用に”SK246(BL)を搭載はしておきましたが、
どのくらい電圧が安定するかは実際につかってみて確認しましょう。ちなみに、DAC8831のリファレンスの入力抵抗が
7.5kΩで、TL431の出力インピーダンスが0.2Ωです。この程度の差があれば大丈夫だと思うけどな〜。

DAC8831は1つの変換基板に2つ搭載しました。パスコンとリファレンス電源もここに搭載です。

制御回路は

 今回のI/O基板はDACとADCがそれぞれ2chしか搭載しません。というか、前につくったRaspi-IO基板のドータ基板みたいな位置づけなので
ディジタルIOは必要ないためです。
 またDACとADCのRasPiからのアクセスを直接行うことは考えていません。というのも、RasPiのGPIOから直接アクセスすると、LINUX-OSの割り込み
の影響をうけて、サンプリング時間にばらつきがでるためです。それを解決する方法もありそうですが、ソフト的なハードルが私のハードルとして
すこし高いかな〜ということで、今回はハードウエアで逃げることにしています。具体的には、RasPiとDAC,ADCの間にはシリアルSRAMを挟み込んで、
それを使ってデータの受け渡しを行います。具体的には、DACの場合だと、出力したい電圧のデータあるいはデータ列をシリアルSRAMに書き込みます。
そして、その後に制御をPICに受け持たせます。PICは一定間隔のクロックをシリアルSRAMとDACに送信することで、一定間隔でのデータを出力します。
ADCだとこの反対で、まずはPICの制御下でADCでのサンプル結果をシリアルSRAMに書き込みます。 もちろん、PICの一定クロックで等間隔にデータを
収集します。収集が終われば、RasPiとシリアルSRAM間で通信をしてデータを読み取ります。
 まあ、結構面倒なことになりますが、まあこれも遊びのうちです。

ただし、折角PICも搭載するのでこのDACとADCはRasPiなしでも独立して動くようにしようかと思っています。データの受け渡しはUSB接続でのRS232C
を考えているので、そうすればWin-PCに直接データを送ることができます。

制御部の回路図を検討してみましょう

単純なもので、シリアルSRAMの信号をRasPiで行うかPICで行うかの切替を行うだけなので、そう大した回路にはなりません。
必要なのでは
  シリアルSRAM・・・・5個 (2個DAC用、2個ADC用、1個はコマンドデータ用)
  ロジックIC ・・・・・・6個程度
という感じです。アナログ部分はOPアンプ1個程度です。DAC8831をバイポーラ出力するときの抵抗類はICの中にあるので外付け抵抗はありません。
またADS8685についても、PGA(可変ゲインアンプ)がICの中にはいっていますし、バイポーラ入力ができるので外付け部品はほとんどありません。


検討中の回路図です。


ちょっとTea Time!? PICのI/Oタイミングの憂鬱

RasPi用のIO基板にはシリアルSRAMとしてマイクロチップ社の23LC512を使います。
これは、512kBitの容量があり、バイトに直すと64kバイト、16Bitワードにすれば32Kワードになります。
ADCのサンプルを100kSPSにしても、32kWあれば約0.3秒間のデータを採取することができます。
これだけの容量がありながら、1個170円(秋月)で購入できるのが嬉しいです。

で、このシリアルSRAMについてはできるだけ高速に動かさないと、DACもADCもサンプル速度が遅くなるので
PICは最高速の64MHzで動かす予定です。できれば、オーバクロックさせて80MHzで動かすかもです。
64MHzで動かした場合のI/Oパルスの幅は約63nsになります。これは、PICが4クロックで1命令を実行するので、
1命令の実行時間は1/(64Hz/4)=0.0625(E-6s)になるからです。 

動かない・・・

シリアルSRAMのアクセスタイムは25nsなので、1命令の時間に比べると随分早いので
あまり、なにも考えずに動作確認のプログラムを組んだところ、書き込んだデータと読み込んだデータの
不一致が生じるエラーが発生しました。
 配線間違っていないかな〜・・・・23LC512が悪いのかなあ〜・・・やっぱりPICのプログラムが悪いのかなあ・・・・
色々悩んだ末に、PICの動作クロックを16MHzと今までの1/4に下げたら
ようやくエラーがなくなりました。

 アクセスタイムに余裕があるはずなのになぜだろう?

クロック等の波形をみても、さほど崩れている様子はありません。そのためクロックラインにダンピング抵抗を
入れても改善せずです。
 で、エラーがでるときのデータを眺めてみると、まずは現象がつかめました。

1ビットずれている・・・・

すなわち、
書き込みデータ: 0011000011110000
読み込みデータ: 0001100001111000

という感じになっています。


23LC512のテスト基板です。64MHzでなぜか動かない・・・・

この現象から、シリアルSRAMにクロックを送り込んでからのアクセスタイムがおいついていないことがわかりました。

んん??待てよ

シリアルSRAMのアセスタイムがおいついていないんじゃなくて、PICの読み込みタイミングの問題じゃないかな?
いままで、なにも考えずに1命令が62nsなので、1つの命令を実行してから、次の命令まで62nsあると無条件に
思い込んでいましたが、I/Oをあつかう場合は、1命令4クロックの中でどの時点でデータの書き込み、読み出しが
行われるか、それがわからないと単純に考えることはできません。

データシートを調べてみる!

しかしPICのデータシートってなんでこんなに分量あるのだろう?調べようとしているPIC18F46K22は全部で539ページもあります。
と、いいながらもPICのデータシートの電気的特性については巻末にまとめて書いてあることが多いので、後半部を探します。
で、439ページにみつけました。

なるほど!

原因fがはっきりしました。PICのI/Oのタイミングですが1命令4クロック(Q1〜Q4)の中でいえば、書き込みがQ4クロックの最後、
そして読み込みがQ1サイクルの最後です。すなわち、I/Oにパルスを書き込んで、データを読み出すまでの時間は1クロック分しかありせん。
64MHzだと1クロック16nsなので、これはシリアルSRAMのアクセスタイム25nsを大幅に下回ります。ちなみにPICのクロックを32MHzにしても
動きませんでしたが、32MHzでは1クロック31nsなのでアクセスタイム以上になりますが、PIC自体のDELAYとかが数nsあるでしょうから
ギリギリ動かなかったのでしょう。16MHzならば1クロック63nsですから、かなりの余裕がでます。


PICのI/Oタイミングです。I/OのWRITEはQ4クロックの最後、READはQ1サイクルの最後です。1クロックの差しかありません。

ということで、対処としてはシリアルSRAMにクロックを送り出した後に、1命令分のWAITを入れることで無事解決しました。

反省・・・
 思い込みは危険。なにかトラぶったらまずはデータシートを確認しましょう!(面倒だけど・・・・)。


(Tea Time!? おしまい)


話はもどって

基板に組んでいきましょう!

まずは必要な素子のレイアウトを考えます。余裕で載るかな〜と思っていたら、案外キチキチでした。
ロジックICは半田付けしやすいように、基板のランド穴を1つ飛ばして配置したいので、結構レイアウトが限定されます。
あと、LCD取り付けのピンソケットの位置は動かせないので、それも配置上のネックになります。

まずは必要な素子の配置を検討です。

配置が決まれば、あとは回路図を眺めつつ配線です。
しばし、いやしばらく格闘・・・・。
BGMを鳴らしながら、冷房をきかせて、ルンルンルン〜・・・・

イタタタ!! 床に落ちている抵抗のリード線が足の裏に刺さってしまいました・・・・ やっぱりスリッパ履こう・・・・

イタタタ!! ピンセットの先が太ももに刺さった〜!! ピンセットをこぼれて、とっさに足を閉じてしまいました・・・。
         短パンだと太ももが無防備です。

イタタタ!! 腰が・・・・・ しばらく猫背の姿勢を続けていたせいか背中と腰が・・・・ ちょっと休憩・・・グビグビ、プハー!!!

とりあえず完成!
 配線が完了しました。

とりあえず配線は完了しました。

DACならびにADCの電源は5Vなので、その電圧レギュレータはこの基板での肝になる部分なので超低ノイズのAK1110を使いました。
評価途中のものを拝借です。


5Vのレギュレータは初物の超低ノイズのAK1110をつかってみました。


舞台裏は相変わらず乱雑です。

ソフト作成!

配線のチェックも兼ねて、ソフトを組んでいきましょう。
しかし、ロジックICの各種制御の点数が多くて、40PinのPICのI/Oをすべて使っています。その定義ファイルを書くだけでも結構面倒です。
まあ、のんびりやりましょう。

正常なのかな? 2020.8.3

ちょこちょこっとソフトをつくり、動作をチェックし、配線の間違いを修正し・・・・という感じで進めています。いつになることやら。
で、ふと消費電流が気になったので測定してみると、なんと250mA!も流れています。
え?そんなに流れるの?予想では100mA前後かな〜と思っていたのですが・・・・・。
とりあえず、今のところ動いているので大丈夫だと思うのだけど、どこかロジックの出力が短絡してるのかな〜???

ICをすべて触っても、ほとんど熱を感じません。ほのかに暖かいのはDCDCのコイルくらいです。

一番電流が流れそうなのはアナログ部分です。5Vで動いていますが15Vからのドロップ電源なので、DCDCに数倍の負荷電流がかかります。
アナログの5Vで10mA流れれば、DCDCには最低で3倍、効率も考えると4倍の電流が元電源の5Vに流れます。

ざっと試算すると

アナログ部
  DAC(DAC8831) ほぼゼロ(超低消費電力です)。
  ADC(ADS8586)  7.5mA(MAX)×2=15mA
  OPアンプ      正負10mAとして20mA
 −−−−−−−−−−−−−−−−−−−
 合計          35mA

 
35mAをDCDCの効率を考えて元の5Vの電流にすると約140mA
ということは残りロジックで100mAとなります。こちらも試算すると

ディジタル部
  PIC       約20mA(64MHz)
  SRAM     3mA(MAX)×5=15mA
  ロジックIC  10mA(多すぎ?)×6=60mA
 −−−−−−−−−−−−−−−−−−−−−
  合計           95mA


試算結果の合計は235mAです。んん・・・実測に近いから、なんとなく正常のような気もしてきた。
あと、これにバックライト付きのLCDが乗るので、全体で300mA程度になりそうです。

ただ、300mAなのでUSBポートからの給電でもいけそうなのでスタンドアロンでも動くようにしておいたら、
オキラクにつかえるDAC,ADCになりそうです。でも、大丈夫かな〜。というのも、消費電流を測ろうとして
菊水の実験用電源(最大1A)につないだら、電源がトリップしました。突入電流が1Aを越えると、
自動的に電圧が落ちるので、さらにDCDCに電流が流れてまた電流保護が働いて、の繰り返しで動きません。
こんなものをUSBにつないでいいものかどうかが心配です。

精度を確認してみよう! 2020.8.4

ソフトはまだ製作途上ですが、基本的な部分については動作が確認できたので、
ちょっとここいらでどの程度の精度がでているか確認してみたくなりました。

まずは基本となるDACの直線性からです。
ただ、測定機器がテスターしかありませんので、厳密な精度という点では難しいです。
さらに、テスターの分解能(=精度だと思う)が1V以上では1mV、1V未満でも0.1mVしかありません。
それに対してDACの出力は正負2.49Vで分解能が16bitですから1LSB=0.076mVですので、測定できるのは
DAC-CODEとDAC出力電圧の傾きと、あとはDAC-CODE=0時のゼロオフセット程度になります。
もっと、精度の高い電圧計がほしいところです。

あれ、おかしいな?

まずは、DACに一定のコードを入れて、出力電圧をテスターで測定です。測定は手動なので結構面倒です。
これを図にずると下記になります。マクロ的には一直線ですね。もっとも、これがばらついているようだと話になりません。

DAC-CODEと出力電圧の関係。これだけみれば直線にみえますね。

で、誤差を調べるために上図から直線近似線をもとめて、そこからの誤差をプロットです。

げげげ!ゼロ付近で誤差大きい!

なんと、ゼロ付近でおきな誤差がでています。およそ6mV程度の誤差です。1LSB=0.076mVなので
79LSBの誤差です。んん・・・・なんでだろう?
 これが単電源でバッファーつきの電圧出力のDACならなんとなく理由はわかるのですが・・・。
すなわち、レールtoレールといわれるICでもあって、GNDあるいはVCCに極近いところだと直線性が乱れます。

でも、このDACって純粋なR-2R出力であり、外部に正負電源で動くOPアンプを接続しているので、
GND付近での直線性は問題ないはず。また基準電圧もVCC(5V)より随分低い2.49Vで動作しているので、
上値がさちることもないはずです。

なにが原因だろう????


DAC-CODEと出力電圧誤差の関係。ゼロ付近で大きな誤差がでています。なぜかな?

原因はDGNDが抜けていました・・・

基板を裏返して、DAC周辺を眺めていて原因らしきものを発見です。なんと、DGND(ディジタルGND)の配線が抜けていました。
おそらく、これでGND付近での精度がでなかったのでしょう。

やり直し!
DGNDの配線を修正して、やり直しです。こんどは、電圧誤差がDAC-CODE全領域を通じて1mV以下になりました。
これでようやく正常になりました。

DAC-CODEと出力電圧誤差の関係。DGNDを接続したら正常になりました。

このとき、DAC CODEと出力電圧の関係は下記式になりました。
有効数字の桁数は適当です。 こんな式を提出しようものなら、ぼろくそに言われそうです(笑。

出力電圧(V) = 0.000075989094 (DAC-CODE) - 2.490112187389


この式からDACの中点の8000h(32768)の値は約-0.1046mVです。-1.37LSBになります。このあたりは、OPアンプのオフセットでしょうか。
ちなみに、2つあるDACの出力は持っているテスターでは、差がまったくでませんでした。すばらしい安定性です・・・というより
もっているテスターがショボイだけかも(汗。

ADCの実力は如何に!

DACの出力範囲が正負2.490Vに対して、ADCのレンジは0.625VREF(VREF=4.096V)の設定で正負2.56Vです。
DACとADCのレンジがほぼコンパラなので、DACの出力を直接ADCに入力して、ADCの精度評価を行います。
そして、(面倒なので)DACの1LSBとADCの1LSBは同じで扱います。

DACの出力を正としての、エラーは下図のようになりました。
いや〜すばらしいですね。およそ±0.5LSBの範囲におさまっています。
データシートをみると、ADC(ADS8685)の標準INLが±0.5LSBで、DAC(DAC8831)の標準INLが±1LSBですから、
合計すると1.5LSB程度の誤差がでてもおかしくないところですが、さすが一流メーカ(ADとBB)ですね。
きちんとした品質管理です。


DACの出力を正として、ADCに直接入力したときの、ADCの変換エラーです。この精度なら満足です。

ちなみに、DAC出力とADC変換値の関係式は下記になりました。
係数の0.972はDACとADCのレンジの差です(2.490/2.56=0.97265)。

0CH (ADC−CODE) =  0.9720954 (DAC-CODE) + 913.6088626
1CH (ADC−CODE) = 0.9721059 (DAC-CODE) + 917.9008595


さて、最終的にほしい式は、DACの場合は設定したい電圧に対してのDAC-CODEであり、
ADCの場合は計測されたADC-CODEからの入力電圧への換算です。面倒ですが、計算しておきましょう。
備忘録です。

DAC-CODE = 13159.783(設定電圧) + 32769.33 (CH0,CH1共通)
入力電圧(ADC-0CH) = 7.81704E-05 (ADC-CODE) - 2.561529
入力電圧(ADC-1CH) = 7.81695E-05 (ADC-CODE) - 2.561864

PICで浮動小数点の計算をさせようものなら、時間がかかって仕方ないですがRasPiなら時間はほとんど気にすることもないので、
関数の引値、戻値はdoubleでいいでしょう。


さて、ひきつづきソフトをつくりましょう。

でも、そろそろ酔いが回ってきました・・・・・・・・


ADCのサンプリング速度を確認してみよう (2020.8.5)

全体の精度が確認できたので、今度は速度についても確認しておきましょう。
今回のIO基板では、DACならびにADCの変換ならびにサンプリング速度を上げるために、
必要なデータは直接的にシリアルSRAMから供給、あるいはシリアルSRAMに格納するようにしています。
PICはSRAMとDAC、ADCの駆動のためのクロック発生に特化します(もちろん、他の仕事もありますが・・)。

そのため、構成はADCの場合ですが下図のようになっています。
SRAMもADCもどちらもインターフェイスがSPIなので、クロックを共有して、データの入出力を直結してやれば、
PICはクロックを出すだけで、ADCのデータが勝手にSRAMに格納されます。
もっとも、これができるのがADCが16ビットであることと、SRAMがバイト単位でのシーケンシャルな書き込み(読み出し)
ができるからにほかなりませんが・・・・。

ADC(ADS8685)のデータは直接シリアルSRAM(23LC512)に叩き込みます。

実際の回路ではSRAMには最初にデータを書き込むアドレスを指定しなくてはならないので、
その間はADCへのクロック(CLK)の供給は停止するようになっています。細かいところは省略ということで・・・・・

ADCとSRAMのタイミングは下図のようになります。

ADC(ADS8685)はCONV信号の立ち上がりでアナログ値をサンプリングして、AD変換を開始します。その時間は1usです。
その間はCONV信号はHIGHのまま保持します。そして1us後にLOWにするとMSB(最上位)からAD変換データがでてきます。
そして、クロックを1つ送るごとに、次のデータビットがでてきます。

SRAM(23LC512)については、一旦書き込み開始のアドレスを設定しておけば、あとはCLKパルスを入れてやればどんどんデータを溜め込んでくれます。
最大容量は32kW(16bit=1ワード)分ですが、それを超えればサイクリックにデータを上書きしていきます。

で、下の図からわかるようにADCのデータ出力とSRAMの必要な入力データ、そしてクロックは同一タイミングになりますから、互いに共有できるというわけです。


ADCとSRAMも動作タイミングです。

サンプリング速度を試算してみよう!

PICは1命令は1サイクル(62.5ns)で実行しますので、サンプリング速度については、実測しなくてもプログラムのステップ数から試算することができます。
下図はサンプリングのプログラムになります。もっとも高速にサンプルするバージョンになっています。
PICのIO操作は1命令1サイクルです。while(loop--){}文については、事前に何サイクル必要が調べておき、9サイクルということがわかっています。
あと、ADC_CLOCK_OUTとあるのはI/OをHIGH、LOWにするマクロなので、これが2命令サイクルになります。
で、トータルで1ループ58命令サイクルになります。時間にすると58us×62.5ns=3.625usです。

周波数にすると275.86kHzですから結構な動作速度が得られています。
これをPICだけで実施すれば、数分の1の速度になってしまうはずです。


ADCサンプリングのプログラムです。単純にクロックを叩くだけの作業です。

で、本当に275.86kHzのサンプリング速度がでているかを確認するために、発振器で2759Hzの正弦波をつくって、
ADCで変換してSRAMにデータ格納してみました。ちゃんと1周期100点(0〜99)のデータが得られていますね。
ADCのスペックが最大500kSPSに対して、実際のI/O基板で276kSPSまで得られたのはよしとしましょう。


2759Hzの正弦波をサンプリングしてみました。1周期のデータ点数が100点なので、サンプル速度は276kSPSになります。

PICの割り込みを使わなければ、クロックはつねに一定間隔ででてきますから正確なサンプリングが可能です。
最高サンプリング速度は276kSPSですが、途中で止めたい場合も想定してスイッチ等のポーリングも入れる必要があるでしょうから、
汎用的なADCでのサンプルルーチンはもう少し速度は遅くなるかもしれません。

#ADCの変換時間の1usは完全になにもしていない時間なので、この間にサンプル中断のポーリング処理を入れれば
#サンプル速度を落とさずに済むかもしれないと画策中です。

最終コーナに入る前に!

PICとの接続ソフトをこれから組んでいきますが、流石に裸の基板のままだと何がおこるかわからないので、
ちょっとだけ養生しておきました。2mmのアクリル板を基板の表と裏に配置です。とくに、基板の裏はφ0.16mmのポリウレタン被覆銅線が
むき出し状態なので、ちょっと引っ掛けたら、簡単に切れてしまいます。


すこしだけ養生しておきました。



裏面の配線の保護が必要です。

(つづく)