【MFT2019】AD7193_TSSOP_4CH動作OK<3日かかった>

MACNICA MOUSERで5個注文して、4日かかって米国から届いたAD7193 TSSOPをピッチ変換基板に半田してからCPU基板に搭載して配線してから、SPI IFでの制御プログラムを作りましたが、3日ほどかかってしまいました。当初AD7194で動作しているので、それの4Ch縮小版だと思っていたのですが、多CH読込の仕様が違っていて、結局プログラムを書き換えました。

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

●TSSOP_AD7193_4CHADCシステム作り備忘録

①TSSOP半田不良でトラブッタ件

半田付後テスターで導通チェックしても実際の回路で
 駆動してみると導通していなかった
=>SPIでマイコン接続してコミュニケーションレジスタでSTATUSレジスタを読むだけの動作でもエラーがでてしまって
どこが悪いかわからなかったのですが、AD7193のパッケージを押すとエラー番号がFF,00,80,40とコロコロ変わったので、これは半田不良だろうということで、再度 半田こてでなぞって、半田を載せなおして、吸い取り線できれいに吸い取ったり2-3回繰り返してようやく、安定したSTATUS80が出るようになりました。TSSOPの半田付の怖さがわかりました。これは慣れと熟練が必要だと悟りました。
最初は、セパレートの小さい基板に半田したのですが、SPIの引き回しが長いので、良くないと思いCPU基板に載せ替えました。

②CPU選定
クワエルマウス用にUSBHID機能がついているCPUを探しました。STM32シリーズでライブラリーがSTM社から提供されているのですが、mbed用のライブラリーでは、NUCLEO F4xxシリーズ用しか対応してませんでした。
愛用のNUCLEO L432KCでは、ライブラリー使えなかったので、大きいですが、F446REをクワエルマウス母艦CPUとしました。F446RE上に基板を載せて、そこにAD7193基板と4CH分のターミナルブロックとUSBHID接続端子も付けました。

折角、4Chが1チップに収まってTSSOPを準備したのに、こんなでかい基板になって残念ですが、クランク踏力ベクトル測定基板などに使う場合はTSSOPは威力を発揮すると思います。
STM32のUSB HID接続に関しては、信州MAKERSのアドバイザー様であるTeruki様から教えていただいたリンク記事からインポートしてデバイスモードを動作させたらすんなり動作しました。
https://qiita.com/eggman/items/9e7dad30e4d2833af17f

USBHID用のケーブルは、いらなくなったUSB Aケーブルを切って
D+,D-、GNDの3本をCPUの指定ピンに接続すればOKです。
D-:PA_11,D+:PA_12 だけでOKです。他のピンは使えないようですので、USBHID用に確保しておかないといけません。

●AD7193ドライブプログラムではまった
半田不良を直して、CPUとSPIの接続確認まで1日かかってしまって次に既存のAD7194のプログラムで簡単に動作する予定だったのですが、全く動作してくれませんでした。
STATUS が80でOKなのですが、24ビットデータがFF,FF,FF固定でしか出てこない現象が続いていて、これは、読み取りタイミングが合ってないためということで、AD7194とAD7193の仕様書の比較作業から始めました。https://www.analog.com/media/en/technical-documentation/data-sheets/AD7193.pdf
1日がかりで眺めてようやく違いが見つかりました。仕様書の35ページのSingleConversionの説明がAD7194と違っているのを発見。

If several channels are enabled, the ADC sequences through the enabled channels and performs a conversion on each channel. When a conversion is started, DOUT/RDY goes high and remains high until a valid conversion is available.

ということで、どこかにまとめてCh設定しているところがあるはずのなので、レジスタ仕様をみるとConfigレジスタのCH設定にありました。AD7194だと1CHずつしか設定できないのですが、AD7193だとauto ch scan機能がついているので、CH切り替えを毎回しないで済むそうです。

AD7193:Config Reg

■CON17 to CON8  (Short, TEMP, CH7 to CH0 ):

Channel select bits. These bits select which channels are enabled on the AD7193 (see Table 23 and Table 24).

Several channels can be selected, and the AD7193 automatically sequences them.

The conversion on each channel requires the complete settling time. When performing calibrations or when accessing the calibration registers, only one channel can be selected.

ということで、プログラムを書き換えて動作させようとしましたが、例によって、CH切り替え間のSettling時間を確保しないと各CHが同じ値になってしまう現象がでますので、wait_ms(1)としてCH間を区切ると無事4Ch動作するようになりました。
WHILEループ部を備忘録しておきます。

while(1){
//MODEレジスタへモード設定データ書き込み
ad7193.write(0x08);//MODEレジスタ書き込み指定
ad7193.write(0x08) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
ad7193.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
ad7193.write(0x01) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//設定レジスタへ設定データ書き込み
ad7193.write(0x10);//設定レジスタ書き込み指定
ad7193.write(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま
ad7193.write(0x0f) ;//設定レジスタ15-8bit書き込み=01ch3ch 自動スキャン設定 AIN1+ AIN2-
ad7193.write(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
i++;
//=====================0ch==================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV[0]=int((data0*65536+data1*256+data2));///5084);
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//==================1ch=====================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV[1]=int((data0*65536+data1*256+data2));///5084);
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//=================2ch======================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV[2]=int((data0*65536+data1*256+data2));///5084);
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//================3ch=======================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV[3]=int((data0*65536+data1*256+data2));///5084);
//pc.printf(“data0x=%x,data1x=%x,data2x=%x,V[%d]=%d\n\r”,data0,data1,data2,i,mV[i]);
//wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//if(i%3==0){
pc.printf(“%d,%d,%d,%d,%4.4f\n\r”,mV[0],mV[1],mV[2],mV[3],t.read());
//}
}

●トータルスループット
1mecのWAITをいれるとCHが増えるたびにサンプリング周期が遅くなります。出力文で2msecは食います。
pc.printf(“%d,%d,%d,%d,%4.4f\n\r”,mV[0],mV[1],mV[2],mV[3],t.read());

  CH数  LOOP周期 サンプリング周波数
4msec 250Hz
5.5msecc 181Hz
6.2msec 161Hz
7.7msec 130Hz

●以後
クワエルマウスは2CH駆動ですので、181Hzで動作させられるので、通常のマウスと変わらない応答でUSB HIDを経由してカーソルを移動させることができるので制御方法の開発を本格的に開始できるようになりました。

※TIPS
その後、2個ほど追加で作って、違うCPUに載せてみましたが、配線間違いやタイミングのデバッグで苦労しました。コツとして以下メモしておきます。
①初動作時にデータが同じ値しかでてこない
●SPIが動いてない可能性がある
=>CS(SSEL)がLOWになっているか?
=>オシロでSCLK、MOSI、MISOの波形がきれいにでているか?
=>TSSOPの足の上部とCPU間をテスタであたって導通をチェック
対策1:配線間違いをチェックする
対策2:TSSOP半田付け部分を再度半田こてで押しながら溶かす

●SPI信号がでているのに、データがでてこない
=>STATUSレジスタを見る文を何か所にいれる
各CHの読み込み前にSTATUS読み込みを入れるとそのCH番号が返ってくれば正常。

//SPI0CH 1CH 読み込み関数 移動平均は、MA=1で使ってない
void AD7193_MA(int i,int MA){
//__disable_irq();//割り込み禁止
//pc.printf(“AD719MA:%d,%d\n\r”,i,MA);
myled1=1;
int j;
ad7193_con();
/*
//=====================status-mode check0ch =======================
ad7193.write(0x40);//status request
sdata0=ad7193.write(0x0);//status read
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
pc.printf(“0ch_status_mode-check_ sdata0=%x\n\r”,sdata0);
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//=====================0ch==================================
*/
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV0arry[i%MA]=((double)data0*65536+(double)data1*256+(double)data2)*dmV;
mV0=mV0arry[i%MA]/1000;
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
/*
//=====================status-mode check1ch =======================
ad7193.write(0x40);//status request
sdata0=ad7193.write(0x0);//status read
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
pc.printf(“1ch_status_mode-check_ sdata0=%x\n\r”,sdata0);
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
*/
//==================1ch=====================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV1arry[i%MA]=((double)data0*65536+(double)data1*256+(double)data2)*dmV;
mV1=mV1arry[i%MA]/1000;
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//pc.printf(“data0x=%x,data1x=%x,data2x=%x,V[%d]=%d\n\r”,data0,data1,data2,i,mV[i]);if (i>MA && MA>0 ){
mV0sum=0;
mV1sum=0;
for (j=0;j<MA;j++){
mV0sum=mV0sum+mV0arry[i%MA];
mV1sum=mV1sum+mV1arry[i%MA];
}
mV0=mV0sum/MA/1000;
mV1=mV1sum/MA/1000;}

// __enable_irq(); // 許可
myled1=0;
return;
}

 

One thought on “【MFT2019】AD7193_TSSOP_4CH動作OK<3日かかった>”

  1. mbedに一本化できるようになったんですね!
    いらぬ脱線を招いてしまったのではと少し心配していたのですが安心しました(笑
    基板を大きくさせてしまったことは残念でしたが、核となる6分力センサやクワエルマウスの操作性に注力できるようになること、期待しております。

コメントを残す

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