【ひずみゲージアンプ】ADS122U04の動作その2<2CHで370Hz出る>

ADS122U04は1CHでは1000~2000Hzの高速サンプリングが可能ですが、2CHとなると様子が変わります。

●2CHでの動作のさせ方
仕様書には、1CHと2CHの切り替えについては、記述はありませんでした。そこで、周期毎に偶数周期で1CH
奇数周期で2Chに交互切り替えで2個のCHのデータを取得することにしました。遅延が発生するので、
最高速にして1Ch-2CH間の時間差を1msec以内に抑えました。

①1CHから2CHの切り替え方法
周期を最高速2000spsにして、1周期で1CH次の周期で2CHと交互にCHを切り替えてADCを
行う方法をとりました。
●レジスタ設定備忘録

WREG
0x00 遇数回周期:0x55,0x4E
奇数回周期:0x55,0x6E
//Register00[7:4(MUX)3:1(GAIN)0(PGA_BYPASS)]

奇数回周期で1CH(AIN0p-AIN1n),偶数回で2CH(AIN2p-AIN3n)を
割り込みサブルーチン内で交互に切り替えて出力する交互切り替えで
偶数回7:0(0000 1110=0x0E)
7:4(0000)MUX AINp=AIN0,AINn=AIN1
奇数回7:0(0110 1110=0x6E)
7:4(0110)MUX AINp=AIN2,AINn=AIN33:1(111)GAIN128,

0:0(0)PGA enabled]

0x01 0x55,0x42,0xDE //Register01[7:5(DataRate)4:(OperationMode)3:(ConversionMode)2:1(VREF)0:(TemperatureSensor mode)]
DataRateは最高速2000sps ,TuroboMode,ContinuosMode,Vref11,7:0(1101 1110=0xDE)7:5(110)DataRate2000sps,4:(1)TURBO Mode,

3:(1)Continuous conversion mode,

2:1(11)VDD-VSS VRef,

0:(0)Temp disabled

0x02 0x55,0x44,0x08 //Register02[7:DRDY)6:(DCNT)5:4(CRC)3:(BCS)2:0(IDAC)

DRDY信号はDefaultでStart/reset命令で発生する
7:0(0000 1000=0x08)

7:(0)DRDY,

6:(0)DCNT disable,

5:4(00)) invert,

3:(1)BCS On,

2:0(0)IDAC off

0x03 0x55,0x46,0x00 //—-Register03[7:5(I1MUX)4:2(I2MUX)1(RSERVED)0(AUTO)]
7:0(00000000=0x00)7:5(000)default,4:2(000)default,1:(0)Reserved,0:(0)Manual Read
0x04 0x55,0x48,0x48 //Register04[7:(Reserved)6:(GPIO2DIR)5:(GPIO1DIR)4:(GPIO0DIR)3:(GPIO2SEL)2:(GPIO2DAT)1:(GPIO1DAT)0:(GPIODAT0)]-

7:0(0100 1000=0x048)
6:(1)GPIO2output,
5:(0)GPIO1Input,
4:(0)GPIO0Input,
3:(1)GPIO2SEL DRDY,
2:(0)GPIO2DAT Low,
1:(0)GPIO1DAT Low,
0:(0)GPIO0DAT Low

●プログラム
GISTにアップしておきます。mbed用ですが、純正C++なので他のマイコンへも移植は容易だと思います。
※2021/9/7 RREGのレジスタアドレス指定バグ訂正しました。
https://gist.github.com/dj1711572002/47d0090e92f010c5655bddcf245106cc

//—————-Texsus ADS122U04————————–
#include “mbed.h”
Serial pc(USBTX,USBRX);
Serial device(p9, p10);//p9TX p10RX
DigitalOut myled(LED1);
InterruptIn DRDY(p8);//DataRdy Pin
//DigitalIn DRDY(p8);//DataRdy Pin
Timer t;
double ft1,ft2;
int RREGwait;
int flipN;
uint8_t RR0,RR1,RR2,RR3,RR4;
uint8_t d0,d1,d2,d3,d4,d5,d6;
double data1ch,data2ch;
int DRDYflag=0;
//==================InterruptIn DRDY====================
void flip() {
flipN++;
if(flipN%2==0)
{
//1CH—–Register00[7:4(MUX)3:1(GAIN)0(PGA_BYPASS)]————————————————————–
device.putc(0x55);//Synchronization word 0x55
device.putc(0x40);//WriteREGister 0x04 0x00(0000register00 Selected)
device.putc(0x0E);//7:0(0000 1110=0x0E)[7:4(0000)MUX AINp=AIN0,AINn=AIN1 3:1(111)GAIN128, 0:0(0)PGA enabled]
wait_us(50);device.putc(0x55);
device.putc(0x10);
wait_us(10);
d0=device.getc();
wait_us(10);
d1=device.getc();
wait_us(10);
d2=device.getc();
wait_us(10);
data1ch=(d0+d1*256+d2*65536)*0.000393391;
ft1=(double)t.read_us()/1000;
// pc.printf(“%d,%8.3f\n\r”,data1ch,ft);
}
else
{
//2CH—–Register00[7:4(MUX)3:1(GAIN)0(PGA_BYPASS)]————————————————————–
wait_us(50);
device.putc(0x55);//Synchronization word 0x55
device.putc(0x40);//WriteREGister 0x04 0x00(0000register00 Selected)
device.putc(0x6E);//7:0(0110 1110=0x6E)[7:4(0110)MUX AINp=AIN2,AINn=AIN3 3:1(111)GAIN128, 0:0(0)PGA enabled]
wait_us(50);device.putc(0x55);
device.putc(0x10);
wait_us(10);
d3=device.getc();
wait_us(10);
d4=device.getc();
wait_us(10);
d5=device.getc();
wait_us(10);
data2ch=(d3+d4*256+d5*65536)*0.000393391;//pc.printf(“d0=%x,d1=%x,d2=%x,data=%d\n\r”,d0,d1,d2,data);
ft2=(double)t.read_us()/1000;
//pc.printf(“%d:CH2=%d,%8.3f\n\r”,flipN,data2ch,ft);
pc.printf(“%8.3f,%8.3f,%8.3f,%8.3f\n\r”,data1ch,data2ch,ft1,ft2);
//myled = !myled;
//pc.printf(“————-DRDY Falled—————-\n\r”);
}
}
//===========================================================
int main() {
pc.baud(460800);
device.baud(115200);
DRDY.fall(&flip); // attach the address of the flip function to the rising edge
//ADS122U04 RESET
device.putc(0x55);
device.putc(0x06);
wait_us(1000);

//
//================Register Setting=============================================================================
RREGwait=500;//RREG wait time usec 2*Tbaud(10usec)
//—–Register00[7:4(MUX)3:1(GAIN)0(PGA_BYPASS)]————————————————————–
device.putc(0x55);//Synchronization word 0x55
device.putc(0x40);//WriteREGister 0x04 0x00(0000register00 Selected)
device.putc(0x0E);//7:0(0000 1110=0x0E)[7:4(0000)MUX AINp=AIN0,AINn=AIN1 3:1(111)GAIN128, 0:0(0)PGA enabled]
wait_us(1000);
device.putc(0x55);//Synchronization word 0x55
device.putc(0x20);//Synchronization word 0x55
wait_us(RREGwait);
if (device.readable())
{
RR0=device.getc();
}
wait_us(1000);
pc.printf(“\n\r”);
pc.printf(“********0x0E:”);
pc.printf(“RR0=%x\n\r”,RR0);

//—–Register01[7:5(DataRate)4:(OperationMode)3:(ConversionMode)2:1(VREF)0:(TemperatureSensor mode)]———
device.putc(0x55);//Synchronization word 0x55
device.putc(0x42);// WriteREGister 0x04 0x02(0010register01 Selected)
device.putc(0xDE);//7:0(1101 1110=0xDE)[7:5(110)DataRate2000sps,4:(1)TURBO Mode, 3:(1)Continuous conversion mode,2:1(11)VDD-VSS VRef,0:(0)Temp disabled]
wait_us(1000);
device.putc(0x55);//Synchronization word 0x55
device.putc(0x22);//Synchronization word 0x55 訂正 0x21=>0x22
wait_us(RREGwait);
if (device.readable())
{
RR1=device.getc();
}
wait_us(1000);
pc.printf(“*********0xA8:”);
pc.printf(“RR1=%x\n\r”,RR1);

//—–Register02[7:DRDY)6:(DCNT)5:4(CRC)3:(BCS)2:0(IDAC)]—————————————————–
device.putc(0x55);//Synchronization word 0x55
device.putc(0x44);// WriteREGister 0x04 0x04(0100register02 Selected)
device.putc(0x08);//7:0(0000 1000=0x08)[7:(0)DRDY,6:(0)DCNT disable, 5:4(00)) inverte,3:(1)BCS On,2:0(0)IDAC off]
wait_us(1000);
device.putc(0x55);//Synchronization word 0x55
device.putc(0x24);//Synchronization word 0x55  訂正 0x22=>0x24
wait_us(RREGwait);
if (device.readable())
{
RR2=device.getc();
}
wait_us(1000);
pc.printf(“********0x08:”);
pc.printf(“RR2=%x\n\r”,RR2);

//—-Register03[7:5(I1MUX)4:2(I2MUX)1(RSERVED)0(AUTO)]—————————————————-
device.putc(0x55);//Synchronization word 0x55
device.putc(0x46);// WriteREGister 0x04 0x06(0110register03 Selected)
device.putc(0x00);//7:0(00000000=0x00)[7:5(000)default,4:2(000)default, 1:(0)Reserved,0:(0)Manual Read
wait_us(1000);
device.putc(0x55);//Synchronization word 0x55
device.putc(0x26);//Synchronization word 0x55  訂正 0x23=>0x26
wait_us(RREGwait);
if (device.readable())
{
RR3=device.getc();
}
wait_us(1000);
pc.printf(“*********0x00:”);
pc.printf(“RR3=%x\n\r”,RR3);
wait_us(1000);
//—-Register04[7:(Reserved)6:(GPIO2DIR)5:(GPIO1DIR)4:(GPIO0DIR)3:(GPIO2SEL)2:(GPIO2DAT)1:(GPIO1DAT)0:(GPIODAT0)]—————————————————-
device.putc(0x55);//Synchronization word 0x55
device.putc(0x48);// WriteREGister 0x04 0x08(1000register04 Selected)
device.putc(0x48);//7:0(0100 1000=0x08)[6:(1)GPIO2output,5:(0)GPIO1Input, 4:(0)GPIO0Input,3:(1)GPIO2SEL DRDY,2:(0)GPIO2DAT Low,1:(0)GPIO1DAT Low,0:(0)GPIO0DAT Low
wait_us(1000);
device.putc(0x55);//Synchronization word 0x55
device.putc(0x28);//Synchronization word 0x55  訂正 0x24=>0x28
wait_us(RREGwait);
if (device.readable())
{
RR4=device.getc();
}
wait_us(1000);
pc.printf(“*********0x48:”);
pc.printf(“RR4=%x\n\r”,RR4);

//Start/Sync
device.putc(0x55);
device.putc(0x08);
// wait_us(100);//************************このWAIT重要************************************
t.start();
//====================LOOP======================================
while(1)
{
wait_us(500);//5msec Period
//Start/Sync
// device.putc(0x55);
//device.putc(0x08);
//wait_us(100);//************************このWAIT重要************************************
// wait_us(50);

}
}

●動作結果

①ロジアナ測定
2000spsなので500μsec周期でcontinuousでDRDY信号がピン割り込みに入ってくるように設定してある。
つまり、1回start/reset命令をいれると後はDRDYが自動発生する。

②周期ばらつき
周期はそろってばらつきも使えるレベルです。CH間遅延は、0.85msecで許容レベルだと思います。
しかし、最高速2000spsで2CH切り替えだと340Hz相当しかサンプリングがでない点が
プログラム上、シリアルで通信している速度限界です。
ちなみにUSBシリアルの速度は460800bpsでないとこの速度はでません。

コメントを残す

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