【M5】M5AtomliteとAD7194_SPI接続<M5Atom5個仕入れた>

スマートキャリブレーションシステムこつこつと開発してます。
被測定物として中華ロードセルで組んだ5分力計をターゲットとして
システム開発実験台を制作してます。
M5StickC2個、M5Atomlite2台でESP-NOWで接続します。
PCから同期信号、TARE動作など指示できるようにします。
M5Atom lite 小さくて安くて高性能なので一挙に5個に増やしました。
M5StackBasic1個/M5StickC5個/M5Atomlite5個といつのまにか
中華CPU中毒になってしまいました。

●AD7194EVALボードをM5Atom liteでSPI接続
今までNucleo L432KCでSPI接続していたのですが、スマートキャリブレーションシステム全体がM5シリーズでESP-NOW接続になったため
mbedは、邪魔なので、この際AD7194もM5シリーズ ArudinoIDEで
プログラムをmbedから移植しました。

L432KCを抜いて、コネクタに基板をさして、基板上にM5Atomliteを装着しました。しかし、M5Atomは、固定ねじが無いため、USB-Cコネクタを指すとぐらついて接触不良を起こします。M5StickCだと固定ねじがあるのですが、M5Atomの固定方法が課題です。

●M5StomのSPI接続
これはM5StickCでAD7193接続したときとほぼ同じですが

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


AD7194なので、CH切替の方法が違ってくるので、プログラムは別物になります。
①SPIピン配線
CS(SS)はGNDにしておきますので、sclk,MISO,MOSI3本配線します。AD7194 Evalボードの日本語マニュアルの20ページのJ2ピンから
SPI線を引き出します。

AD7194 EVAL ボード SPI M5Atom lite SPI   (私の決めたピン配置です)
    DOUT(データ出力) MISO(データ入力)  GPIO33
      DIN(データ入力) MOSI(データ出力 GPIO23
    SCLK(クロック) SCLK(クロック) GPIO19
    CS(チップセレクト) 無(-1) GND接続


 

②プログラム
mbedを移植して、SPI.write()に置換するだけです。
AD7193とM5StickC接続では、連続モードが動作しなかったのですが、
AD7194EVALボードでは、連続モードで動作しました。
GITのGISTにアップしてあります。M5StickCの設定のままでOKでした
https://gist.github.com/dj1711572002/5122a210c2921e6569978d0e8c77ae37

6CHサンプリングOKですが、不思議なことに1CH目が2CHにずれて、6CH目が1CH目になってしまってます。このずれ設定のしかたかプログラムのバグかわかりませんが大勢に影響ないので後回しにします。

※その後、原因不明な現象でAD7193 SPI接続が動かなくなりました。M5シリーズのSPI接続3例やったのですが、初期的に動作してもつかっているうちに動作できなくなる現象が多発してます。
暇ができたら根本解析をしますが、もし、作られて動作しなかったらそういうことだとおもいます。
代替え案1:LT1167で3CH基板を作って動作ささえてます。

 

【M5】M5StickC_3CHひずみアンプ基板作った<GPIO32,33,36フルで使う>

代替え案2:SPIは、MBEDなど実績のあるマイコンにして無線通信をESP-NOWで行うほうほうです。これは、意外と汎用性があって便利です。M5シリーズのSPIは、安定しないで終わるかもしれません。

【M5】M5AtomliteをESP-NOW通信SPPモジュール化した<手頃な無線>



//AD7194 M5Atom SPI test
//2020.08.16 Shinshu-Makers#include <M5StickC.h>
#include <SPI.h>int i=0,j=0;
int MA=10;
uint8_t data0,data1,data2;
uint8_t recvdata;
uint8_t mdata0,mdata1,mdata2;
uint8_t condata0,condata1,condata2;
uint8_t stdata0,stdata1,stdata2,stdata3;
uint8_t sdata;
//float mV0,mV1,mV2,mV3;
//==========data Movng Average parameters ===================
double mV0arry[500];
double mV1arry[500];
double mV2arry[500];
double mV3arry[500];
double mV4arry[500];
double mV53arry[500];//double mV3arry[100];
double mV0sum,mV1sum,mV2sum,mV3sum,mV4sum,mV5sum;
double mV0ave,mV1ave,mV2ave,mV3ave,mV4ave,mV5ave;
double mV0,mV1,mV2,mV3,mV4,mV5;
double mVA[6];
//=========================================================================
//====================AD7194 CH change=====================================
//=========================================================================
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;
}
//設定レジスタへ設定データ書き込み
recvdata= SPI.transfer(0x10);//設定レジスタ書き込み指定
recvdata= SPI.transfer(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま
recvdata= SPI.transfer(chN) ;//設定レジスタ15-8bit書き込み=1CH設定 AIN1+ AIN1-(=AIN2)
recvdata= SPI.transfer(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
//Config書き込み確認
recvdata= SPI.transfer(0x50);//Configレジスタ書き込み指定
condata0=recvdata= SPI.transfer(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
condata1=recvdata= SPI.transfer(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
condata2=recvdata= SPI.transfer(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
recvdata= SPI.transfer(0x40);//status request
sdata= SPI.transfer(0x0);//status read
//Serial.print(“status=”);
//Serial.println(sdata);
//pc.printf(“ch=%d,sdata=%x:condata:%x,%x,%x\n\r”,ch,sdata,condata0,condata1,condata2);}
//=============================================================================
//=============================================================================
//=============================================================================

//====================================AD7194 Initialize===========================================================
//##########################################################################
int AD7194_init(){

//**************************AD7194 Set*******************************************************

delay(1);
//set_AD7194();
//MODEレジスタへモード設定データ書き込み
recvdata= SPI.transfer(0x08);//MODEレジスタ書き込み指定
recvdata= SPI.transfer(0x08) ;//MODEレジスタ23-16bit書き込み=連続変換モード+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書き込み=連続変換モード+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(0x01) ;//設定レジスタ15-8bit書き込み=1ch-4ch自動スキャン設定 AIN1+ AIN2-
recvdata= SPI.transfer(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
//Config書き込み確認
recvdata= SPI.transfer(0x50);//Configレジスタ書き込み指定
condata0=SPI.transfer(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
condata1=SPI.transfer(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
condata2=SPI.transfer(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定

}
//*****************************************************************************************************************

//*****************************************************************************************************************************
void setup() {
M5.begin();
// put your setup code here, to run once:
SPI.begin(19,33,23,-1);//sclk,MISO,MOSI,SS=CS=GND
// MODE register writing
AD7194_init();//Initialize AD7194

}

void loop() {
i++;
ch_Change(i%6);

recvdata=SPI.transfer(0x58);
delay(1);//1msec以上WaitいれないとCH切り替えできない
data0=SPI.transfer(0x0);
data1=SPI.transfer(0x0);
data2=SPI.transfer(0x0);
mVA[i%6]=((double)data0*65536+(double)data1*256+(double)data2)/5084; //No MA
//mV0arry[i%MA]=((double)data0*65536+(double)data1*256+(double)data2)/5084;
delay(1);//1msec以上WaitいれないとCH切り替えできない
recvdata= SPI.transfer(0x40);//status request
sdata= SPI.transfer(0x0);//status read
//Serial.print(“status=”);
// Serial.println(sdata,HEX);

if(i%6==0)
{
Serial.print(mVA[0],1);
Serial.print(“,”);
Serial.print(mVA[1],1);
Serial.print(“,”);
Serial.print(mVA[2],1);
Serial.print(“,”);
Serial.print(mVA[3],1);
Serial.print(“,”);
Serial.print(mVA[4],1);
Serial.print(“,”);
Serial.print(mVA[5],1);
Serial.print(“,”);
Serial.print(sdata,HEX);
Serial.print(“,”);
Serial.println(millis());

}
}

コメントを残す

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