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)を 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)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) |
●プログラム
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); // //—–Register01[7:5(DataRate)4:(OperationMode)3:(ConversionMode)2:1(VREF)0:(TemperatureSensor mode)]——— //—–Register02[7:DRDY)6:(DCNT)5:4(CRC)3:(BCS)2:0(IDAC)]—————————————————– //—-Register03[7:5(I1MUX)4:2(I2MUX)1(RSERVED)0(AUTO)]—————————————————- //Start/Sync } |
●動作結果
①ロジアナ測定
2000spsなので500μsec周期でcontinuousでDRDY信号がピン割り込みに入ってくるように設定してある。
つまり、1回start/reset命令をいれると後はDRDYが自動発生する。
②周期ばらつき
周期はそろってばらつきも使えるレベルです。CH間遅延は、0.85msecで許容レベルだと思います。
しかし、最高速2000spsで2CH切り替えだと340Hz相当しかサンプリングがでない点が
プログラム上、シリアルで通信している速度限界です。
ちなみにUSBシリアルの速度は460800bpsでないとこの速度はでません。