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.

[参考译文] ADS1258:ADC Arduino UNO 通信和输出解释

Guru**** 2391005 points
Other Parts Discussed in Thread: ADS1258, ADS127L11

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1347330/ads1258-adc-arduino-uno-communication-and-output-interpretation

器件型号:ADS1258
主题中讨论的其他器件: ADS127L11

您好!

 我们正在尝试使它适用于 ADC ADS1258以评估它是否适合未来的项目。 为了方便这一点、我们开发了一个定制电路板来适应我们测试环境的几何限制、并根据随附图像中描述的配置将其进行连接。

我们的目标是绕过内部多路复用器、直接从 ADCINN 和 ADCINP 引脚采集数据。

遵循数据表中概述的说明和提供的示例代码、我们已经使用 Arduino UNO 与 ADC 建立通信。 在示波器的帮助下、我们已确认 MISO、MOSI 和 SCLK 均可按预期正常运行、DRDY 可按预期切换。

用于此目的的代码如下:


 

#include <SPI.h>

#define CS_PIN 10  // Chip select pin for ADS1258
const int DRDY=2;
byte stat,data1,data2,data3;
float dataF;

void setup() {
  Serial.begin(9600);  // Initialize serial communication
  pinMode(CS_PIN, OUTPUT);  // Set CS pin as output

  // Initialize SPI communication
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV16); // Set SPI clock frequency (16 MHz / 16 = 1 MHz)
  
  // Initialize ADS1258
  digitalWrite(CS_PIN, HIGH); // Deselect ADS1258
  delay(100); // Delay for stable operation
  digitalWrite(CS_PIN, LOW);  // Select ADS1258
  
  // Send configuration commands to ADS1258
  SPI.transfer(0xC0); // Send command: reset
  delay(100); // Delay for reset to complete
  
    digitalWrite(CS_PIN, HIGH); // Deselect ADS1258


  digitalWrite(CS_PIN, LOW);  // Select ADS1258

  // Configure ADS1258 settings for single-ended operation (example settings, adjust as needed)
  SPI.transfer(0x60); // Send command: write register
  SPI.transfer(0x3A); // Send value to write: CTRL0 register value (example: PGA = 1, SPS = 30)

  digitalWrite(CS_PIN, HIGH); // Deselect ADS1258


  digitalWrite(CS_PIN, LOW);  // Select ADS1258
  // Configure MUX register to select ADCINN and ADCINP as input channels directly

  SPI.transfer(0x62); // Send command: write register

  SPI.transfer(0x17); // Send value to write: CTRL0 register value (example: PGA = 1, SPS = 30)

  digitalWrite(CS_PIN, HIGH); // Deselect ADS1258

  digitalWrite(CS_PIN, LOW);  // Select ADS1258
  // Configure MUX register to select ADCINN and ADCINP as input channels directly

  uint8_t read= SPI.transfer(0x50);
  read= SPI.transfer(0x00);
    Serial.print("register control0:");
  Serial.println(read,HEX);

  Serial.println(read,HEX);
  read= SPI.transfer(0x00);
    Serial.print("register control1:");
  Serial.println(read,HEX);

  Serial.println(read,HEX);
  read= SPI.transfer(0x00);
    Serial.print("register control2:");

  Serial.println(read,HEX);

  // Deselect ADS1258
  digitalWrite(CS_PIN, HIGH);

  digitalWrite(CS_PIN, LOW);
  uint8_t stat=SPI.transfer(0x00);


}

void loop() {
  // Select ADS1258
  digitalWrite(CS_PIN, LOW);
  
  // Send command to read data
  SPI.transfer(0x01); // Send command: read register
  SPI.transfer(0x12); // Send register address: DATA register
  delay(1); // Delay for conversion
 SPI.transfer(0x00) << 16; // Read MSB

  // Read data from ADS1258
  if (digitalRead(DRDY)==LOW)
  {
   delayMicroseconds(30);

  int32_t rawValue = 0;
  //uint8_t stat=SPI.transfer(0x00);

  rawValue |= SPI.transfer(0x00) << 16; // Read MSB
  rawValue |= SPI.transfer(0x00) << 8;  // Read middle byte
  rawValue |= SPI.transfer(0x00);       // Read LSB
  // Deselect ADS1258
  
  digitalWrite(CS_PIN, HIGH);
  
  // Convert raw value to voltage (example: assuming Vref = 5V, 24-bit resolution)
  float voltage = (5.0 / 7864320.0) * rawValue; // Vref / (2^24) * rawValue786432
  
  // Print voltage value to serial monitor
 // Serial.print("Voltage: ");
  Serial.println(rawValue,HEX);
 // Serial.println(" V");
 //Serial.println(stat,HEX);

  // Delay before next reading
  delay(100);
  }
}



但是、通信似乎完全错误。 在读取控制寄存器时、我们不会获得默认值、如果我们尝试在控制寄存器中写入新值、以便绕过内部多路复用器并固定多路复用器的一个通道以不扫描内部信号、 在下一次读取控制寄存器时、该值与通过 SPI 发送的值不同(发送的突发通过示波器进行了验证)。 此外、转换后的数据似乎是错误的、并且不会响应施加的输入电压的变化。


您是否注意到我们的方法存在任何问题?

我们也对示例代码中的库进行了实验、但遇到了相同的结果。 即使只是在启动时对 control0的简单读取也无法按预期显示0x0A。

非常感谢您提供的任何见解。

此致、

温琴佐

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

    尊敬的 Vincenzo Di Capua,

    向您提问:您为什么以这种方式使用此 ADC、即绕过多路复用器? 如果您只需要单通道 ADC、例如 ADS127L11、我们有更好的器件可以建议

    您向 ADC 应用的信号源是什么? 由于您要驱动非缓冲调制器输入、因此需要确保采样电容器能够在每次调制器对输入进行采样时稳定下来

    您能否提供与 ADC 之间通信的逻辑分析仪图像? 请包括 CS、DOUT、DIN、SCLK 和 DRDY、 并且请标记您的图片、以便清楚了解每个通信框架的意图

    最后、我强烈建议您使用16 MHz 离散时钟振荡器、而不是使用晶体作为 ADC 时钟。 许多客户在使这些晶体启动时遇到问题、如果没有时钟(或使用间歇性时钟)、ADC 将会 出现不稳定的行为。 您可以通过 e2e 进行搜索、找到有关此问题的数十篇文章、解决此问题的唯一可靠方法是使用分立式时钟。

    -Bryan

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

    您好、Bryan、 非常感谢您的提示、

    为了回答您的问题、我们将从外部1V DC 应用到输入中(仅适用于这些最初的测试)。

    发送3次0x00以读回转换的 ADC 数据

    发送3次0x00以读回转换的 ADC 数据

    通道15上的 ADC 时钟在 CLOCKIO 引脚上测量。

    再次感谢您提供任何提示。

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

    尊敬的  Vincenzo Di Capua,

    您如何确定何时读取数据? 通常、您会监控 DRDY 引脚、等待它从高电平转换到低电平、然后读取数据。

    在您提供的屏幕截图中、DRDY 多次降到低电平、其中似乎没有一个与您实际读取数据时发生

    在执行任何操作之前、您应该能够为 ADC 加电、提供时钟信号、然后看到 DRDY 以大约1 /默认数据速率运行、即23.7kSPS。 你看到这发生了吗?

    您还可以尝试按照我之前的建议使用分立式时钟振荡器、以排除 ADC 时钟/晶体的任何问题

    -Bryan