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(); } |
●結論
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のスループットは向上可能ということです。