主题中讨论的其他器件: 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。
非常感谢您提供的任何见解。
此致、
温琴佐