【ロードセル】AD7193をM5StcikCでSPI接続した<SingleConversionにした>

SmartCalibrationProbeの開発中ですが、ひずみゲージ4CHアンプ AD7193を今までmbed Nucleo F446REで接続していたので、今回初めてarduinoIDEへmbedのプログラムを移植してAD7193のプログラムを作りました。4CHあるので、XYZ以外にもう1分力余裕があります。
何故CPUを変えたかというと,M5StickCだとIMUとBlueToothが内蔵されているためmbedCPUでシステムを組むより小さくてかつ、制作手間が少ないからです。

●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様がサンプル例を作ってくれて感謝です。

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は使えません。

 

 

 

 

 

 

 

コメントを残す

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