SmartCalibrationProbeの開発中ですが、ひずみゲージ4CHアンプ AD7193を今までmbed Nucleo F446REで接続していたので、今回初めてarduinoIDEへmbedのプログラムを移植してAD7193のプログラムを作りました。4CHあるので、XYZ以外にもう1分力余裕があります。
何故CPUを変えたかというと,M5StickCだとIMUとBlueToothが内蔵されているためmbedCPUでシステムを組むより小さくてかつ、制作手間が少ないからです。
追記=>読者の方からコメントが入ってます。本記事の使い方ではダメだとのご評価ですので、本記事を参考に
なさらないようにお願いいたします。私は、現在AD7193は使いこなせなくて、もっと簡単なADS122U04を使うことにしてます。ADS122U04は、読者の皆さん自作されてお仕事でも使われてますので、動作は大丈夫だと思います。
https://shinshu-makers.net/shinshu_makers/wp-admin/admin.php?page=stats#!/stats/post/13149/shinshu-makers.net::shinshu_makers
※本記事の読者様へ
一応接続できたのはよかったのですが、数日後再度接続しようとしたら全く動作しなくなりました。
SPI接続の場合、ノイズなどに非常に敏感で、配線を平行に引き回したり、CPUの近くに平行にならべたりすると
干渉ノイズで異常動作したりします。特に、M5系のCPUは、ノイズが多い感触をもってます。本記事の
とおりに制作されても、動作が安定する保証はございません。私の場合は、AD7193の安定動作は、
STM32 Nucleo系のCPUで、配線と配置にきを使って何とかAD7193を安定接続しているのが現状 どなたか
M5系で、AD7193を安定接続できたら、投稿していただければ助かります。宜しくお願いいたします。もし、AD7193が敷居が高い感じなら、LT1167を3個使った3ChひずみアンプをM5StickCで作った例があります、プログラムが簡単で配線もADCなので、ノイズはかぶりますが、確実にデータは得られます。
=======================================================================
※2021年9月1日追記【AD7193より安くてシンプルなADS122U04を使い始めました】
★SPIでなくUART接続なので干渉ノイズの問題が無い簡単接続です
M5AtomのUSBシリアルは460800bpsができないので、速度は、他のCPUより遅いので1KHz以上はでませんが、
1CH使用で600Hz、2CH使用で370Hzサンプリング速度がでます。
【M5】M5Atomと2CHひずみゲージアンプADS122U04基板作った<小さな2CHひずみアンプ>
AD7193とM5系でSPI接続のトラブルが多いのでSPI接続でなくUART接続が可能なΣデルタ型ADCチップを探しあてました。TexasのADCでADS122U04という安くて、小さい2CHのADCですが、配線がラフでもきちんと接続できるし1CHで2000sps 2Chで370spsもでるのでAD7194,AD7193ほど多CHが必要ない場合に便利です。下記はADSとmbed接続の基本的な記事レジスタの使い方は下記2個の記事で解説してあります。
【ひずみゲージアンプ】ADS122U04の動作その1<UARTで楽ちん動作>
【ひずみゲージアンプ】ADS122U04の動作その2<2CHで370Hz出る>
========================================================================
●M5StickCだとAD7193 連続モードが動かない
mbed Nucleo F446REのプログラムを移植したのですが、
連続モードが動作しませんでした。
=>1CH、2CHなら動くけど3CH以上が読まない現象
オシロでタイミング追って解析するのも面倒なので、
SingleConversionモードにして、切替えながら読み込むプログラムを
作りました。
※SingleConversionモードは仕様書の35ページにあります。
https://www.analog.com/media/en/technical-documentation/data-sheets/AD7193.pdf
SingleConversionなら確実に接続確認できるので
多少遅くなっても
(連続がSettlingtime 1msecがSingleConversionでは2msecになるだけです)
ということで、mbedよりは1chにつき1msec遅くなりますが、M5StickCでも
AD7193が使えるようになりました。
プログラムは、GITのここに置いてあります。
https://gist.github.com/dj1711572002/2aa2ef97dc3fde3e98f97ff2d3425ea8
AD7193の書き込み部だけ下記です
●ArduinoのSPI命令は、SPI.transfer()だけで、送信、受信両方できます。mbedは、writeだけですがArduinoは、複数byte読み書きもできるのでSPIコマンドは便利なものがあります。
●しかし、この命令セットの原因か、AD7193の連続読込ができない課題が
発生してます。多分mbedとタイミング系がちがうと思います。
AD7193は、数十μsecのタイミングずれでエラーになるのでシビアです。
//==================AD7193Initialize===================================== //########################################################################## int AD7193_Sinit(int chNo){//**************************AD7193 Set******************************************************* if(chNo==0){chN=0x00;} if(chNo==1){chN=0x02;} if(chNo==2){chN=0x04;} if(chNo==3){chN=0x08;}//delay(1); //set_AD7193(); //MODEレジスタへモード設定データ書き込み recvdata= SPI.transfer(0x08);//MODEレジスタ書き込み指定 recvdata= SPI.transfer(0x28) ;//MODEレジスタ23-16bit書き込み=Single変換モード+InternalClock4.8MHz recvdata= SPI.transfer(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま recvdata= SPI.transfer(0x01) ;//MODEレジスタ7-0bit書き込み=4800Hz設定 //mode書き込み確認 recvdata= SPI.transfer(0x48);//MODEレジスタ書き込み指定 mdata0=SPI.transfer(0x00) ;//MODEレジスタ23-16bit書き込み=Single変換モード+InternalClock4.8MHz mdata1=SPI.transfer(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま mdata2=SPI.transfer(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定 // pc.printf(“INIT:mdata:%x,%x,%x\n\r”,mdata0,mdata1,mdata2); //設定レジスタへ設定データ書き込み recvdata= SPI.transfer(0x10);//設定レジスタ書き込み指定 recvdata= SPI.transfer(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま recvdata= SPI.transfer(chN) ;//設定レジスタ15-8bit書き込み=1ch-4chSingleCH設定 AIN1+ AIN2- recvdata= SPI.transfer(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128 //Config書き込み確認 recvdata= SPI.transfer(0x50);//Configレジスタ書き込み指定 condata0=SPI.transfer(0x00) ;//MODEレジスタ23-16bit書き込み=Single変換モード+InternalClock4.8MHz condata1=SPI.transfer(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま condata2=SPI.transfer(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定} //*****************************************************************************************************************//***************************************************************************************************************************** void setup() { M5.begin(); chipid = ESP.getEfuseMac(); sprintf( chipname, “M5StickC_%04X”, (uint16_t)(chipid >> 32)); SerialBT.begin(chipname); M5.IMU.Init(); // put your setup code here, to run once: SPI.begin(0,26,32,-1);//sclk,MISO,MOSI,SS=CS // MODE register writing //AD7193_init();//Initialize ad7193}void loop() { j++; //===================SingleConversion Loop========================== for (i=0;i<3;i++) { AD7193_Sinit(i); delay(2); //=====================AD7193 0ch================================== recvdata=SPI.transfer(0x58); data0=SPI.transfer(0x0); data1=SPI.transfer(0x0); data2=SPI.transfer(0x0); mVA[i][j%MA]=((double)data0*65536+(double)data1*256+(double)data2)/5084; //No MA} |
●M5StickのSPI接続基板備忘録
M5StickCでのSPI接続はやりにくいのであまり事例がありませんが
毎度LangShip様がサンプル例を作ってくれて感謝です。
https://lang-ship.com/blog/work/m5stickc-spi/
この例は、SPIの液晶Displayへの接続でライブラリーを使われてますが、結線方法を教えていただきました。
MISOとMOSIのコネクタが異なっていて、MOSIはGroveコネクタからでます。この使い方はSPIとしては、SPIノイズのリスクが大きいので、M5StickCでは、SPIを使うことを推奨してないのではないかと思います。
●基盤配線上の注意
AD7193はブレッドボードでは動作しません。
基板でCPUとできるだけ短距離で結線する必要があります。
しかし、近づけすぎると、CPUと干渉を起こすことがあるのでやっかいです。今回のこのレイアウトはCPUから少し遠ざけてます。
groveコネクタは2mmピッチ特殊品なのでSwitchSecienceで4pin コネクタセットを仕入れました。
結線は、太いカラー線を使って、わざとばらばらになるようにしてます。線と線がくっついて並行になると電磁誘導ノイズがのるのでSPIエラーになることがありますので、SPIの配線は、難しいです。
●TIPS
⓪SPIは、ブレッドボード的配線ではノイズで動きません、ですので、CPUからできるだけ短距離で配線するレイアウトにします。M5Stickだと基板上ではないのでそうしても長くなる欠点あるので、SPIは難しいと思いますので、ESP32-DEV-KITのほうがいいと思います。
①AD7193 TSSOPが無事動作するか?
これはSingleConversionモードで1CHずつ動作させたほうがいいです、連続モードだとプログラムのバグか基板配線ノイズか、TSSOPの半田エラーから判別がつかなくなりますので、Singleにして、プログラム側と配線ノイズの影響を極力減らして確認作業したほうがいいです。
②初めての場合は、AD7194のEVALボードからスタートしたほうがいいです、TSSOPの半田付けとプログラムを初めてやるとリスクが大きすぎていけませんのでAD7194でTSSOPのリスクない基板上にCPUを載せて、短距離SPIで確実にSingle動作プログラムを完成させて、
それをベースにAD7193 TSSOPに挑戦したほうが確実です。
③M5StickCの外付けSPIを動作させると、内蔵DISLAYは使えません。
内蔵DIPLAYもSPIを使っているので、DIPLAY表示関係を動作させるとAD7193の読み込みタイミングがずれてしまってデータが化けます。ですので、M5SitckCをSPI接続で使う場合は、DIPLAYは使えません。
※追記2020年10月
その後、原因不明な現象でAD7193 SPI接続が動かなくなりました。M5シリーズのSPI接続3例やったのですが、初期的に動作してもつかっているうちに動作できなくなる現象が多発してます。
暇ができたら根本解析をしますが、もし、作られて動作しなかったらそういうことだとおもいます。
代替え案1:LT1167で3CH基板を作って動作ささえてます。
代替え案2:SPIは、MBEDなど実績のあるマイコンにして無線通信をESP-NOWで行うほうほうです。これは、意外と汎用性があって便利です。M5シリーズのSPIは、安定しないで終わるかもしれません。
AD7193のデータシートにGNDデザインや、パスコンに関する注意書きが明記されているのですが、変換基板を使用なさっている時点でアウトかと思われます。
それと、CSをGNDに落とされていますが、データシートの最初のほうにタイミングチャートが記載されています。数字としては0ns(min)と書かれていますが、CSを無視しているわけではないので、CS信号は与えたほうがよいのではないかと思います。
とんとかいも様
コメント有難うございます。データシートをよく理解してない時点で失敗だとのご指摘有難うございます。
AD7193動作がうまくできなくて、SPI接続のアンプは、私の電子工作でレベルでは無理だとあきらめてました。
現在は、ADS122U04でUARTで接続して使ってます。
多CHを使うときに、改めて、AD7193のデータシートから学習しなおしたいと存じます。
できるなら、AD7193の電子工作事例があれば助かります。
これからもご指導宜しくお願いいたします。