【MFT2019】AD7194_6CHスループット10msec<PC転送時間長い>

AD7194EVALボードのmbedプログラムで6CH転送を作ってみたのですが、CH切り替え時間0.83msecX6ch=約5msecにPCへのデータ転送時間が4-5msec発生していてトータルスループット10msecとなってしまいました。100Hzと遅いサンプリングになってしまいましたがUSBシリアル転送速度が遅いのが課題となってきました。

※2021年9月1日追記  もっと手軽な2CHΣデルタ型アンプもあります。
AD7194は8CHのΣデルタ型ADCアンプですが、それほど多CHは必要なくて、安くて小さいけどΣデルタ型で速度が速いアンプを2年ほど探して遂に探しあてました。TexasのADCでADS122U04というUARTで制御できる
使い勝手のよい小型アンプです。
【ひずみゲージアンプ】ADS122U04の動作その1<UARTで楽ちん動作>
【ひずみゲージアンプ】ADS122U04の動作その2<2CHで370Hz出る>

●結果

pc.baud(115200)設定で

pc.printf(“%4.0f,%4.0f,%4.0f,%4.0f,%4.0f,%4.0f,%4.3f\n\r”,mV[1],mV[2],mV[3],mV[4],mV[5],mV[0],t.read());  行が入っている場合

pc.printfをコメントアウトしてなくすと

●USBシリアルの転送速度検証
115200bpsでは 10msec周期

teratermの受信最高速921600bpsまで上げてみました。
6-7msec周期まで高速化できましたが、転送が安定しません。

テストプログラム

// AD7194 EVAL Board mbed NUCLEO 432KC SPIIF Program
// Differential 1Ch AIN1(+) AIN2(-)
//2019/03/23 Shinshu-Makers
#include “mbed.h”
SPI ad7194 (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,sdata0,sdata1,mdata0,mdata1,mdata2,sdata_1;
int condata0,condata1,condata2;
int cReg0,cReg1;
double mV[6];
void ch_Change(int ch){
char chN;
switch (ch){
case 0:
chN=0x01;
break;
case 1:
chN=0x23;
break;
case 2:
chN=0x45;
break;
case 3:
chN=0x67;
break;
case 4:
chN=0x89;
break;
case 5:
chN=0xAB;
break;
}//設定レジスタへ設定データ書き込み
ad7194.write(0x10);//設定レジスタ書き込み指定
ad7194.write(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま
ad7194.write(chN) ;//設定レジスタ15-8bit書き込み=1CH設定 AIN1+ AIN2-
ad7194.write(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
//Config書き込み確認
ad7194.write(0x50);//Configレジスタ書き込み指定
condata0=ad7194.write(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
condata1=ad7194.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
condata2=ad7194.write(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
ad7194.write(0x40);//status request
sdata=ad7194.write(0x0);//status read
//pc.printf(“ch=%d,sdata=%x:condata:%x,%x,%x\n\r”,ch,sdata,condata0,condata1,condata2);}int main()
{
int i;pc.baud(921600);
CS=0;//Chip Selct Low設定
//set_AD7194();
//MODEレジスタへモード設定データ書き込み
ad7194.write(0x08);//MODEレジスタ書き込み指定
ad7194.write(0x08) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
ad7194.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
ad7194.write(0x01) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//modeレジスタ書き込み済み確認
ad7194.write(0x48);//MODEレジスタ書き込み指定
mdata0=ad7194.write(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
mdata1=ad7194.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
mdata2=ad7194.write(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//pc.printf(“mdata:%x,%x,%x|n\r”,mdata0,mdata1,mdata2);
//Configレジスタ設定書き込み
ad7194.write(0x10);//設定レジスタ書き込み指定
ad7194.write(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま
ad7194.write(0x01) ;//設定レジスタ15-8bit書き込み=1CH設定 AIN1+ AIN2-
ad7194.write(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
//Configレジスタ書き込み済み確認
ad7194.write(0x50);//Configレジスタ書き込み指定
condata0=ad7194.write(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
condata1=ad7194.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
condata2=ad7194.write(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//pc.printf(“mdata:%x,%x,%x,condata:%x,%x,%x|n\r”,mdata0,mdata1,mdata2,condata0,condata1,condata2);

t.start();
i=0;
while(1)
{
i++;
ch_Change(i%6);
ad7194.write(0x40);//status request
sdata_1=sdata0;
sdata0=ad7194.write(0x0);//status read
//pc.printf(“read In status=%x\n\r”,sdata0);
//pc.printf(“%x\n\r”,sdata0 );
if (sdata_1!=sdata0 ) {//CH変更変でデータレジスタアクセス
ad7194.write(0x58);
data0=ad7194.write(0x0);
data1=ad7194.write(0x0);
data2=ad7194.write(0x0);
mV[i%6]=(data0*65536+data1*256+data2)/5084;
wait_us(800);//WaitいれないとCH切り替えできないSettlingTime
//pc.printf(“==============%4.1f,%x,%x,%x,%4.4f\n\r”,mV,data0,data1,data2,t.read());
if (i%6==0){
//pc.printf(“%d,%x,%x:,%4.0f,%4.0f,%4.0f,%4.0f,%4.0f,%4.0f,%4.3f\n\r”,i,sdata_1,sdata0,mV[1],mV[2],mV[3],mV[4],mV[5],mV[0],t.read());
pc.printf(“%4.0f,%4.0f,%4.0f,%4.0f,%4.0f,%4.0f,%4.3f\n\r”,mV[1],mV[2],mV[3],mV[4],mV[5],mV[0],t.read());
}
}
}

}

●結論
AD7194とNUCLEO L432KCの組み合わせでは
6ch転送周期は
115200bps=>10msec
921600bps=>7msec  ということで
100Hz台の速度しか出ませんでした。

●更に高速化するには
単なるAD変換ICならたくさんあるのですが、ひずみゲージが使えるゲインアンプを内蔵して低ノイズのΣデルタ方式となるとAnalogDevice社ICにAD7194以外はないようです。それ以上習うなら多CHADCと低ノイズ計装アンプICをCH数だけディスクリートで実装した基板を作る以外になさそうです。
計装アンプ側:計装アンプだけ膨大にあるのでその中から
ひずみゲージ用のアンプをさがせばいいと思います。
https://www.analog.com/jp/parametricsearch/11080

AD側:マルチプレクサでCH切り替えする方式ではなく
AD変換器がCH数だけ複数個ある同時サンプリングタイプ
AD7768あたりが最高性能かと思います。
https://www.analog.com/jp/products/ad7768.html
https://www.analog.com/media/jp/technical-documentation/data-sheets/AD7768-7768-4_jp.pdf
●以後
6CH 10msecスループットが実現できたので
6分力センサを作成して、Bite Forceセンサを組立ててから
PC用ポインティングデバイスとしてMFT2019へ出展申請を目標としてがんばります。
=>2019年8月末記
その後、PCの転送速度を460800bpsまで上げる機会があって試してみたら、115200bpsの4倍まで速度があがりましたので、今回の10msecは、3msec以下になる可能性はあります。要するに、PCの転送速度だけですので、マイコン内のメモリーにログするだけならSettlingTime+ADCクロック+記録処理時間で1~2msec程度までは、AD7194のスループットは向上可能ということです。

コメントを残す

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