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.

[参考译文] ADS114S08B:从 ADC 读取原始数据时发生故障

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1469834/ads114s08b-trouble-reading-raw-data-from-adc

器件型号:ADS114S08B

工具与软件:

您好!

我尝试使用 TI ADS114S08B ADC 测量0.4至1.867伏范围内的电压、该电压是将4 -20 mA 信号转换为电压的 INA199C1DCK 的输出。 我将使用通过 SPI 传输的 MSP430来控制它。 我可以写入 ADS114S08B 上的寄存器、并读回它们、以确认设置符合我的预期、但当我尝试读取转换数据时、结果没有意义。 ADC 在多个电压条件下读取相同的值、始终保持相同的值、绝不会出现轻微的变化(例如、始终为5120、而不是5119或5121)。 然后这些值突然跳至下一个离散级别:

我读出的值始终与上面显示的值完全相同。  压力传感器的精度约为+-3 psi、但我读取的 ADC 输出代码与298和395 psi 相同。  我使用电压表测量每个电平的电压以进行确认。 我有一个3.3V 的单极电源、使用2.5V 的内部基准电压。我正在进行单端测量、在 AINCOM 连接到 GND 的情况下将 AIN8读取为正电压作为负电压。 以下是我的原理图的一部分:

下面是显示如何设置寄存器的代码片段:

unsigned int ads114s08b_configure(void){
    WREG(0b11, 0b00000000);         //  0x0   dec: 0   // Gain Setting register: disable PGA, set gain to 1
    WREG(0b100, 0b00110100);        //  0x34  dec: 52  // Data Rate register: internal clock, single-shot conversion mode, 20 SPS
    WREG(0b101, 0b00111010);        //  0x3A  dec: 58  // REF register: positive and negative reference buffers disabled, internal 2.5V reference enabled, internal reference always on
    WREG(0b10, 0b10001100);         //  select channel AIN8  dec 140
}

我已禁用 PGA 并将增益设置为1。 我怀疑问题在于我读取数据的方式。 我按照手册第72页的伪代码启动并配置 ADC:

我 被名为"发送16个 SCLK 上升沿以读出 DOUT/DRDY 上的转换数据"的行弄糊涂。 在我的代码中、我只发送了一个虚拟字节以实现这一点。 我是否应该切换 SCLK 线16次或者是否发送一个虚拟字节可用?  

unsigned int RDATA(void) {
    volatile unsigned int bytes = 0;
    volatile unsigned int byte1;
    volatile unsigned int byte2;

    while (!(IFG2 & UCB0TXIFG));        // Wait until the transmit buffer is empty
    UCB0TXBUF = 0b00010011;             // Send first byte

    while (!(IFG2 & UCB0TXIFG));        // Wait until the transmit buffer is empty
    UCB0TXBUF = 0b0;                    // Send first dummy byte

    while (!(IFG2 & UCB0RXIFG));        // Wait for the RX buffer to have data
    byte1 = UCB0RXBUF;                   // Return the received data
    printf("byte1: %d\n", byte1);

    while (!(IFG2 & UCB0TXIFG));        // Wait until the transmit buffer is empty
    UCB0TXBUF = 0b0;                    // Send second dummy byte

    while (!(IFG2 & UCB0RXIFG));        // Wait for the RX buffer to have data
    byte2 = UCB0RXBUF;                   // Return the received data
    printf("byte2: %d\n", byte2);

    return (byte2 << 8) | byte1;        // shift the 2nd byte recieved to the MSB and combine the bytes
    //return (byte1 << 8) | byte2;
}

当我运行上述代码时、返回的第一个字节似乎始终为0、第二个字节是一个值。 我不确定哪个字节应该是最高有效字节、哪个是最低有效字节。

如果有人有任何见解或建议,我会非常感谢。 我很乐意提供更多信息。

此致!

Mason

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

    尊敬的 Mason Maguire:

    我应该切换 SCLK 行16次还是发送虚拟字节没问题?

    是的、ADC 需要16个 SCLK 读回数据。 您的数据事务应如下图所示(来自数据表)

    您能否向我们发送显示读取数据事务的逻辑分析仪图、以便我们与下图进行比较? 更多信息另请查阅数据表9.5.4的"读取数据"部分

    -Bryan

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

    我能够在连接逻辑分析仪后解决此问题、以下是 RDATA (0x12)命令的结果:

    我在代码中发现了导致问题的2个错误。 我正在读取图中所示 DOUT/DRDY 线上的前2个字节。 转换数据是第二个2个字节(0x07和0xF3)。 我添加了一个额外的读取来提取第一个字节、并在读取接下来的两个字节之前将其丢弃。

    另一个错误是我将最低有效字节移动到了最高有效字节的位置。 一旦我纠正了这两个问题、电压读数现在很高。  

    感谢您的帮助!

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

    尊敬的 Mason Maguire:

    我很高兴您能够快速解决这个问题、这些逻辑分析仪对于这些类型的调试工作非常重要

    -Bryan

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

    确实、再次感谢