【MAFS2019】AD7794初期動作できた<2日がかり>

なんとか、1CHデータサンプリングができるようになりました。LT1167よりノイズが少ない感じです。
●動作させるまで2日(土日でなんとかできそうです)
初めてのICは手こづるのが常ですが、今回は、2日で初期動作できて良かったです。全部動作できたらまとめて基礎学習カテゴリーの記事にしておきます。
ひたすら、レジスタの解説文を何度も何度も読んで頭にはいるまで、学習する以外にありませんので、時間的余裕は見たほうがいいです。
https://www.analog.com/media/jp/technical-documentation/data-sheets/ad7794_jp.pdf

●AD7794のコツ
①EVAL-AD7794ソフトがありますが、レジスタの基本を学習してからでないと使えませんので、まずはレジスタのペーパー学習をします。
●レジスタを自分でまとめてみた
EXCELにコピぺして、自分で一目でレジスタ読み書きができるような表を作ります。私の作ったものをアップしておきます。
AD7794_レジスタメモ

 

●レジスタ動作の概要
①コミュニケーションレジスタ(CR)
マイコンと通信する玄関口にあたるレジスタです。SPIで送受信の開始は全てこのレジスタに通信の方法を書き込んでから次の動作を指示します。
やり方は ad7794.write(COMレジスタデータ)と送信して次の動作を指定します。
CR7は、常にゼロでCR7-CR0でデータを書き込むことをenaleにセットします。

CR6:これが重要なBITで0=次の動作が書き込み、1=次の動作が読み込みです。
CR5-CR3:この3BITで、次の動作をさせるレジスタ番号を指定します。
データを読み込むには、CR6=1,CR5-CR3=011となります。
CR2:データレジスタの連続読み出し(未だこれは動作させてない)
CR1CR0は常にゼロです。
●コミュニケーションレジスタ指定から次の動作
①ステータスレジスタを見る場合(SR)
ad7794.write(0b01000000)といれると、次の動作ではステータスレジスタ値が
DOUTから出力されてMISOにSCLOCKに同期して戻ってきます。
ad7794.write(0x40);//0b01000000=0x40
status data=ad7794.write(0x00);//status読込
でステータスレジスタ値が戻ってきます。
受信しているのにwriteというのはしっくりしませんが、SPIではwriteは
クロックを発信して受信するのでクロックをwriteしていると考えるろ判り易いと思います。

エラーがあるとSR6が1になっておいるので、ステータス値が0xc0とか0x40はエラーです。エラーは設定レジスタが不適切か回路の配線がおかしいとか、電圧オーバーなどがあります。また、変換タイミングをSR7のBIT変化で見られます。
②モードレジスタ(MR)と設定レジスタ(CON)値の決め方
まず最初に設定値を決めます。しかし、全仕様など理解しているわけはないので
EVAL-AD7794ソフトで、動作するレジスタ設定を決める必要があります。
基板の1CH:AIN1(+)-AIN1(-) にロードセルをつないで動作を確認しました。
デフォルトでは動作しないので、赤丸の値に変更してようやくデータ波形がでるようになりました。動作したときの設定レジスタ値=0x690をプログラムで設定します。
サンプリング周波数もデフォルトでは16.7Hzでデータ収集時間が遅いので
123Hz以上にすると迅速にグラフが動いてデータ取得動作が判ります。

●モードレジスタと設定レジスタの値
今回は1CHのみ250Hzで設定しました。
①モードレジスタで指定します。(MR)
モードレジスタは、16ビットですので、コミュニケーションレジスタで指定してから
次に2行動作コマンドをいれます。
モードはデフォルトは連続変換モードになってます。
・連続変換モード:一度データレジスタの読込動作が開始されるとコミュニケーションレジスタからコマンドを送らないでもデータが連続して送られてくるモードです。
連続といっても指定したCHのデータだけですのでCH切り替えは設定レジスタで行わないと他のCHは見られません。
サンプリング周波数は、MR3-MR0の4ビットで指定します。

※上表でMR9に1が入ってますが誤記です。
※250Hzの設定の仕方
//モードレジスタの書き込み動作0b00001000=0x08を指定する
ad7794.write(0b00001000);//コミュニケーションレジスタへの書き込み
ad7794.write(0x00);//モードレジスタのMSBはゼロを書き込みます。
ad7794.write(0x02);//LSBには、0b00000010=0x02で250Hzを書き込みます。

②設定レジスタの書き込み(CON)
設定レジスタでは、重要なパラメータを設定しますので、一番最初に設定したほうがいいです。
◎ゲイン値はCON10-CON8に書き込みます。
◎リファレンス電圧は、内部を使ってますのでCON7,CON8で10を書き込み


◎アクティブCHを指定:CON3-CON0までで書き込むデータレジスタのCH番号をここで指定しますので、CH毎に設定レジスタを毎回指定しないといけないみたいです。設定レジスタのデフォルト値は0x710ですが
※設定レジスタの書き込み例
//設定レジスタの書き込み動作0b00010000=0x10を指定する
ad7794.write(0b00010000);//コミュニケーションレジスタへの書き込み
ad7794.write(0x00000110);//設定レジスタのMSBは0x06をゲイン64です
ad7794.write(0x10010000);//LSBには、0x90で内部Ref,Buf,1Chを書き込みます。

 

●試運転用プログラム
(適当に並べてあるだけですので、参考程度です NUCLEO L432KC)

 

// MBED driver for AD9850 digital synthesizer using hacked SPI interface
// Liam Goudge Sept 2013#include “mbed.h”SPI ad7794 (PA_7,PA_6,PA_5); //NUCLEO L432KC MOSI, MISO, SCLK
DigitalOut CS(PA_4); // Chip select
//DigitalOut ADReset(p15); // Pin 15 is reset line for AD9850
Serial pc(USBTX, USBRX); // tx, rx for debug terminal
Timer t;
int data,data0,data1,data2 ;
int sdata,mdata0,mdata1,data_1;
int cReg0,cReg1;
double mV;
void RegCheck(){
ad7794.write(0x50);//設定レジスタ読込み指定
cReg0=ad7794.write(0x0);//設定レジスタ値MSB読込
cReg1=ad7794.write(0x0);//設定レジスタ値MSB読込
//モードレジスタ250Hzへ設定
ad7794.write(0x08);//モードレジスタ書込指定
ad7794.write(0x00);//モードレジスタMSB書込
ad7794.write(0x02);//モードレジスタLSB書込
//モードレジスタ確認
ad7794.write(0x48);//モードレジスタ読込指定
mdata0=ad7794.write(0x00);//モードレジスタMSB読込
mdata1=ad7794.write(0x00);//モードレジスタLSB読込250Hz
ad7794.write(0x40);//status request
sdata=ad7794.write(0x0);//status read
pc.printf(“modeR=%x,%x,cReg=%x,%x,status=%x\n\r”,mdata0,mdata1,cReg0,cReg1,sdata);
}int main()
{

pc.baud(115200);
CS=0;
ad7794.write(0x10);//設定レジスタ書込み指定
cReg0=ad7794.write(0x6);//設定レジスタ値MSB書込み
cReg1=ad7794.write(0x90);//設定レジスタ値MSB書込み
RegCheck();
ad7794.write(0x50);//設定レジスタ読込み指定
cReg0=ad7794.write(0x0);//設定レジスタ値MSB読込
cReg1=ad7794.write(0x0);//設定レジスタ値MSB読込

ad7794.write(0x40);//status request
sdata=ad7794.write(0x0);//status read
pc.printf(“cReg=%x,%x,status=%x\n\r”,cReg0,cReg1,sdata);
//int data=ad7794.write(0x5c);
//ad7794.write(0x20);//Filter Register 指定
//ad7794.write(0x0);//Filter Register 0設定
t.start();
while(1)
{
//RegCheck();
ad7794.write(0x40);//status request
data_1=data;
data=ad7794.write(0x0);//status read
//pc.printf(“status=%x,%x,if=%x\n\r”,data,data_1,data&0xf0);
if (data!=data_1 ) {//7bit目がクリアされたら変換完了でデータレジスタアクセス
ad7794.write(0x58);
data0=ad7794.write(0x11);
data1=ad7794.write(0x11);
data2=ad7794.write(0x11);
mV=(data0*65536+data1*256+data2)/5084;
//pc.printf(“%6.4f,%d,%d,%d\n\r”,mV,data0,data1,data2);
pc.printf(“%6.4f,%d\n\r”,mV,t.read_ms());
}
//wait_ms(2);
//CS=1;
}
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です