This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS1218:来自与 Arduino UNO 连接的 ADC ads1218的数据无效

Guru**** 1129500 points
Other Parts Discussed in Thread: ADS1218
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1214970/ads1218-invalid-data-coming-from-adc-ads1218-interfaced-with-arduino-uno

器件型号:ADS1218

您好!  

我正在尝试读取与 Arduino Uno 连接的 ads1218 ADC 的数据。 我已经在 AIN0 (+ve)和 AIN1 (-ve)中连接了5V 直流输入、4Mhz 晶体振荡器(2个22pF 电容器并联)用于 XIN 和 XOUT 引脚、fosc=4Mhz、fMOD =31.25kHz、PGA=1。 我的连接如下:

由于 Arduino 时钟为16MHz 且 fosc 为4Mhz、因此根据数据表、SCLK 周期可用于高达4tosc 周期(高达1MHz)、因此使用 SPI 时钟分频函数(SPI.setClockDivider(SPI_CLOCK_DIV16)、Arduino SPI 时钟可分频为1MHz 电平。

DRDY:引脚6

DIN:引脚11

DOUT:引脚12

SCLK:引脚13

CS:引脚7

 
#include <SPI.h>
#define RESET 0x06                                                    //Send the RESET command (06h) to make sure the ADS1220 is properly reset after power-up
#define START 0x08                                         //Send the START/SYNC command (08h) to start converting in continuous conversion mode

// define the ads1218 command
#define RDATA 0x01    // read the latest ad conversion data
#define WREG 0x50     // 2 byte command, write data to register 0-15
#define DSYNC 0xFC    // Sync DRDY
#define RESET 0xFE    // reset the register to the power of the data, stop the continuous read mode, does not affect the ram data


#define ADS1218_CS_PIN 7
#define ADS1218_DRDY_PIN 6
int32_t stat;

void syncSerialData(void)   
{
  noInterrupts();
  digitalWrite(ADS1218_CS_PIN, LOW);
  delayMicroseconds(500);
  SPI.transfer(DSYNC);
  delayMicroseconds(500);
  digitalWrite(ADS1218_CS_PIN, HIGH);
  interrupts();
  delay(2000);

}

void waitForDataReady(int timeOut)  //wait for data ready
{
  // wait for /DRDY = 1
  while ((digitalRead(ADS1218_DRDY_PIN)) != LOW);

  // wait for /DRDY = 0
  while ((digitalRead(ADS1218_DRDY_PIN)) == LOW);
}


void setup()
{
pinMode(ADS1218_CS_PIN, OUTPUT);
digitalWrite(ADS1218_CS_PIN, HIGH);
Serial.begin(9600);           
  SPI.begin();                          
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV16); // SCLK upto 4tosc periods

  // setup register (00)
   SPI.transfer(0x50);
   SPI.transfer(0x1E); //speed:4Mhz ; fmod:fosc/256,ref enable,2.5Vref,,buffer enable,bit order:0 MSB first
  
  
  // Setting the MUX register channel requirement
  SPI.transfer(0x51);// write command: 0101 mux address(01)
  SPI.transfer(0x05); // wreg -1(6 register to write due to 6 channels)
  SPI.transfer(0x01); // ain0 and ain1 

  // Write command to address 02
  SPI.transfer(0x52); // analog control register
  SPI.transfer(0x00);// PGA set to 1
  
  syncSerialData();    // Sync Data Ready with Serial clock edge
  delay(50); 

}

void loop()
{

digitalWrite(ADS1218_CS_PIN, LOW);                        //Take CS low
SPI.transfer(RDATA);
delayMicroseconds(12.5); // used:4Mhz (50tosc))

stat= SPI.transfer(0) ;
stat = (stat<<8) | SPI.transfer(0); 
stat = (stat<<8) | SPI.transfer(0);
digitalWrite(ADS1218_CS_PIN, HIGH);                 //  Clear CS to high
if (stat & 0x800000 )
{
  stat = (stat | 0xFF000000);
}
Serial.println(stat);
delay(50); // 
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sushmita:

    请参阅有关所使用的通信传输和命令的数据表。  例如、WREG 命令是一个两个命令序列。  例如、您的代码显示命令(0x50)和寄存器数据0x1E。  但写入寄存器命令要求您发送命令以及要写入的寄存器数量-1后跟数据。  因此、对于这个序列、写入寄存器0的操作将是0x50 0x00 0x1E。

    我认为对于 MUX 寄存器写入可能存在一些困惑。  由于只有一个 ADC、因此您一次只能进行一次测量。  ADS1218不具有 FIFO 或自动扫描功能。  因此、正确的过程是写入0x51 0x00 0x01。

    最后的寄存器配置为0x52 0x00 0x00。  请注意、在所有情况下的每个通信事务都要求 CS 在整个传输期间保持低电平。  我在设置中没有看到这种情况发生。  要验证寄存器写入、可以读回寄存器内容以验证内容。  使用示波器或逻辑分析仪来检查传输是否符合预期也是一种好方法。

    我还将使用示波器验证 DRDY 是否正在切换。  如果您没有看到这种情况、则表示振荡器未正确启动、模拟和数字电源引脚上的电源不正确、或者可能某些引脚悬空/连接不正确、例如 PDWN、POL、RESET 等

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您提供的信息。 寄存器寻址在我的代码中完成了错误。 我将纠正该部分、并检查数据是如何提供的。

    我对 SCLK 周期存有疑问、因为在数据表中、 SCLK 周期可用于多达4至16个周期、因此我的微控制器时钟为16MHz、因此4 * tosc= 1MHz (fosc 为4Mhz) 因此、在我的代码中 、使用 SPI 时钟分频函数(SPI.setClockDivider(SPI_CLOCK_DIV16)将 Arduino 时钟分频为1MHz 电平、以进行 SPI 操作是正确的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sushmita:

    1MHz SCLK 将是您在进行所需设置时可以用于通信的最快时钟。  时钟分频器设置似乎正确、但您始终可以使用示波器或逻辑分析仪验证时钟频率。

    此致、

    Bob B