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.

[参考译文] ADS7028:从 ADS7028读取数据时出现问题

Guru**** 2526700 points
Other Parts Discussed in Thread: ADS7028

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1158728/ads7028-issue-reading-data-from-the-ads7028

器件型号:ADS7028

我尝试使用 ADS7028 IC 来利用它的特殊功能、从它的八个输入通道之一输出16位 RMS 读数。

我为其创建了一个电路板、并通过其 SPI 通道将其连接到 Adafruit ESP32羽毛开发板。 经过数小时的调试后、我仍然无法从 ADS7028的 SDO 引脚获取任何(有意义)数据。  

将逻辑分析仪连接到 SPI 通道后、CS、SDI 和 SCLK 引脚上的所有内容均应如此。 不过、奇怪的是、当我将 CS 引脚置为低电平以启动 SPI 读取或写入时、SDO 引脚立即开始显示活动、即使在 SCLK 开始移动之前也是如此。 我的固件中的任何内容都不会表明我在进行 SPI 传输时出现任何问题。 我真的对这里的情况感到很损失。

我可以附加电路板和原理图文件、固件、逻辑分析仪的输出、甚至只是我的设置图片、如果这样有助于确定 SDO 线路可能存在的问题。


一如既往地感谢您的帮助!

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

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

    您好 Ben、

    您共享的总线映像显示您正在读取 Recent CH1_LSB 寄存器。  

    这不是 RMS 数据的存储位置。 可以从(0xC1) RMS_LSB 和 (0xC2) RMS_MSB 寄存器中读取 RMS 数据。 由于只有一个通道可用于 RMS、因此有一个指定的寄存器可存储此数据。  

    此外、 仅当设置了 General_CFG 寄存器中的 STATS_EN 位时、才会更新 NEW_CH1_LSB 寄存器。  

    但愿这对您有所帮助。 如果没有、我建议我们仔细检查器件设置配置、以确保器件设置正确且数据收集正确。  

    此致、

    Cynthia

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

    很抱歉、我并不是说让人困惑。 最后我想读取 RMS 电压、但首先、我要查看是否可以读取其中一个通道(在本例中为通道1)的电压、以确保器件正常工作。


    我将附加我正在运行的代码。 令我感到困惑的部分是、一旦 CS 变为低电平、SDO 线路就会被拉高。 我本以为 SDO 线路只会在 CLK 的上升沿或下降沿切换状态。 这似乎是导致我无法获得任何有意义的数据的原因、但我不确定。

    这是我正在运行的 Arduino sketch。 在设置循环中、我将写入四个寄存器以设置器件、以便所有输入通道都是模拟输入、器件设置为手动模式、然后在通道寄存器中将其设置为1以查看通道1。


    在主循环中、我从寄存器 A2和 A3读取数据、以查看通道1中最新数据的 MSB 和 LSB。




    #include <SPI.h>
    const byte READ = 0b00010000;     // ADS7028's read command
    const byte WRITE = 0b00001000;   // ADS7028's write command
    
    //ADDRESSES
    const byte PIN_CFG = 0x5;
    const byte OPMODE_CFG = 0x4;
    const byte SEQUENCE_CFG = 0x10;
    const byte CHANNEL_SEL = 0x11;
    
    // pins used for the connection with the sensor
    // the other you need are controlled by the SPI library):
    const int chipSelectPin = 10;
    const int testPin = 21;
    
    void setup()
    {
      Serial.begin(9600);
      //SPI Settings
      //SPI.beginTransaction(SPISettings(60000000, MSBFIRST, SPI_MODE0));
      SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE0));
    
      // start the SPI library:
      SPI.begin();
    
      pinMode(chipSelectPin, OUTPUT); // Set GPIO22 as digital output pin
      digitalWrite(chipSelectPin, HIGH);
    
    
      //For manual mode
      //Using PIN_CFG (Section 8.4.2)
      //Configure channels as AIN/GPIO
      delay(10);
      writeRegister(PIN_CFG, 0x00);
      //Select manual mode
      //CONV_MODE = 00b
      delay(10);
      writeRegister(OPMODE_CFG, 0x00);
      //SEQ_MODE = 00b
      delay(10);
      writeRegister(SEQUENCE_CFG, 0x00);
      //Configure desired channel ID in MANUAL_CHID field
      //Select channel 1
      delay(10);
      writeRegister(CHANNEL_SEL, 0b00000001);
      delay(100);
      
    }
    
    void loop(){
      byte MSB = 0x00;
      byte LSB = 0x00;
      uint16_t analogData = 0;
    
      LSB = readRegister(0xA2);
      delay(5);
      MSB = readRegister(0xA3);
      analogData = ((MSB << 8) | LSB);
      
      Serial.print("Data is: ");
      Serial.println(analogData);
    
      delay(500);  // delay of one second
    }
    
    
    
    
    
    unsigned int readRegister(byte thisRegister) {
      byte dummyData = 0b00000000;
      byte inByte = 0; //incoming data from ADS7038
      byte buffer[] = {READ, thisRegister, dummyData}; 
      unsigned int result = 0;   // result to return
    
      //Bring CS low to initiate read
      digitalWrite(chipSelectPin, LOW);
    
      //Initiate transfer
      SPI.transfer(buffer, sizeof(buffer));
    
      //Bring CS high to decode read command
      digitalWrite(chipSelectPin, HIGH);
      delayMicroseconds(1);
      
      //Bring CS low to read requested register data
      digitalWrite(chipSelectPin, LOW);
      inByte = SPI.transfer(0x00);
      result = result | inByte;
      
    
      //End of SPI read
      digitalWrite(chipSelectPin, HIGH);
      return (result);
    }
    
    void writeRegister(byte thisRegister, byte thisValue) {
    
      byte buffer[] = {WRITE, thisRegister, thisValue}; 
      digitalWrite(chipSelectPin, LOW);
      SPI.transfer(buffer, sizeof(buffer));
      digitalWrite(chipSelectPin, HIGH);
    }




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

    当 CS 为高电平时、数字总线将进入三态、因此 SDO 的状态可以保持高电平或低电平、具体取决于 CS 变为高电平之前的过去状态。 SDO 的状态不会影响新的数据帧、因此不应影响器件输出的精度。

    感谢您共享代码、但最好的是数字总线的示波器快照、包括 CS、SDI、SDO、 SCLK。 这将有助于调试、确认总线上的实际情况是预期要传输的内容。 请将此框架与问题分享。  

    在手动模式下、ADC 测量数据不会存储在任何寄存器中。 最近的寄存器仅在自主模式下更新;这也需要通过设置 General_CFG 寄存器中的 STATS_EN 位来启用。 要在手动模式下读取数据、器件只需要一个具有正确时钟脉冲数的新帧、并且将在 N+2帧中可用。

    此致

    Cynthia