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.

[参考译文] ADS131E08S:连续模式下的数据不起作用!

Guru**** 2393725 points
Other Parts Discussed in Thread: ADS131E08S, ADS130E08EVM-PDK, ADS131E08EVM-PDK

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/792797/ads131e08s-data-in-continuous-mode-doesn-t-work

器件型号:ADS131E08S
主题中讨论的其他器件: ADS130E08EVM-PDKADS131E08EVM-PDK

您好!

我想尝试在数据连续模式下使用 ADS131E08S。 我使用 Arduino IDE 完成了一个小型测试程序、但在检索数据时遇到了一些问题。

我的代码如下

void sendCmd (uint8_t cmd)

 mySPI.beginTransaction(SPISettings(8000000、MSBFIRST、SPI_MODE1));    
 digitalWrite (SS、low);    
 myspi.transfer (cmd);
 delayMicroseconds (2);
 digitalWrite (SS、HIGH);
 myspi.endTransaction();


void setup(){  

 sendCmd (ADS_CMD_RESET);

 延迟(20);
 sendCmd (ADS_CMD_SDATAC);
 延迟(20);

 digitalWrite (ADS_START、HIGH);
 writeReg (0x01、0x94);
 writeReg (0x02、0xE0);
 writeReg (0x03、0xC0);
 writeReg (0x05、0x60); //jauge 3增益12
 writeReg (0x06、0x60); //jauge 2 gain 12
 writeReg (0x07、0x10); ///温度 CJC 增益:1.
 writeReg (0x08、0x60); //jauge 1增益12
 writeReg (0x09、0x90); //未使用
 writeReg (0x0A、0x90); //未使用
 writeReg (0x0B、0x90); //未使用
 writeReg (0x0C、0x90); //未使用
 延迟(10);
 digitalWrite (ADS_START、LOW);
 
 延迟(10);
 sendCmd (ADS_CMD_OFFSETCAL);
 延迟(200);
 
 appState= app_initial;
 


设置完成后、我检查寄存器...一切都好。

要启动数据连续模式...(使用串行命令)

sendCmd (ADS_CMD_RDATAC);
delayMicroseconds (5);
digitalWrite (ADS_START、HIGH);

停止数据连续模式...

digitalWrite (ADS_START、LOW);
delay (10);
sendCmd (ADS_CMD_SDATAC); 

在主循环函数内、我检查 DRDY 引脚何时变为低电平。

void loop(){

 if (digitalRead (DRDY)=低电平)
 {    
  readAllData();
 }

空 readAllData (空)

 长 CHX、CH1、CH2、CH3、CH4;
 uint32_t ret;  
 uint8_t b0;

 mySPI.beginTransaction(SPISettings(8000000、MSBFIRST、SPI_MODE1));   
  
 digitalWrite (SS、low);     
 //---- statistiques
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CHX =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CHX |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CHX |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道1
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CH1 =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CH1 |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CH1 |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);    
 

 //---- 通道2.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CH2 =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CH2 |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CH2 |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道3.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CH3 =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CH3 |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CH3 |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);  

 //---- 通道4
 B0 = mySPI.transfer (ADS_CMD_NOP);
 Ch4 =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 Ch4 |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 Ch4 |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道5.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CHX =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CHX |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CHX |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道6.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CHX =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CHX |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CHX |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道7.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CHX =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CHX |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CHX |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道8.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CHX =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CHX |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CHX |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);

 //---- 通道8.
 B0 = mySPI.transfer (ADS_CMD_NOP);
 CHX =((((uint32_t) b0)<< 16)|((b0 & 0x80)? 0xFF000000:0x00000000);
 CHX |=((((uint32_t) mySPI.transfer (ADS_CMD_NOP))<< 8);
 CHX |=(uint32_t) mySPI.transfer (ADS_CMD_NOP);
 
 th.val =(float) ch3*2*2400/16777215;
 J1.val =(浮点) Ch4*2*2400/12/16777215;
 j2.val =(float) ch2*2*2400/12/16777215;
 J3.val =(浮点) CH1*2*2400/12/16777215;   
    
 myspi.endTransaction();
 

采集看起来正常(DRDY 引脚会定期变为低电平)、但我的 readAllData 函数似乎很糟糕、并提供错误的数据值。

可以帮帮我吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有可为我提供帮助的 ADS131E08S 示例源代码?
    提前感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Abdi、


    在读回数据时、可能会有许多事情会导致问题。 这可能是一个测量问题、其中输入未正确连接、或者基准电压施加不当(尽管对于该器件、仅有一个内部基准选项)。 这也可能是一个通信问题、其中 ADC 提供/DRDY 脉冲、但数据的时钟输出速度不够快、不会在新数据输出时被下一个/DRDY 脉冲中断。

    为了帮助调试这个问题、我认为您应该首先确保您能够正确地从器件读回。 首先发出 SDATAC 命令、然后读回器件的寄存器。 确保它与您认为应该在寄存器中的值相匹配。 如果在启动时执行此操作、则确保值为默认值。 如果您写入寄存器、则确保这些值是您写入器件的值。

    然后、您可以将器件重新置于 SDATAC 模式。 当您读回器件时、您将以周期速率从 ADC 获取数据、由/DRDY 脉冲指示。 一旦/DRDY 变为低电平、您就必须一直到下一个/DRDY 脉冲读取数据、否则新数据将覆盖该数据。 如果发生这种情况、结果读取将不正确。 我想您的数据会发生这种情况。

    检查的最佳方法是查看与示波器或逻辑分析仪的 SPI 通信。 您将需要查看与/DRDY 引脚相关的情况、并查看时钟输出数据所需的时间。

    我们确实有一些可用的源代码、但我不确定它会对您有所帮助。 如果您下载 ADS130E08EVM-PDK 软件(不是 ADS131E08EVM-PDK 软件)、则可以找到用于开发评估模块的一些源代码。 其中一些也在 LabView 中、一般而言、我认为这不是一个特别好的使用示例。 无论如何、这里是一个包含有关此代码的信息的线程。

    e2e.ti.com/.../2874038


    吴约瑟
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Joseph、
    感谢您的回答。 我认为您对时钟输出数据和 DRDY 脉冲非常关注。
    我将进行更多调查并随时向您通报情况。
    感谢您的支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Abdi、



    我一段时间内没有听到您的声音、因此我想我会检查一下您是否在接收数据时发现了错误来源。 正如我在上一篇文章中提到的、我认为您的数据收集因新的数据转换完成而中断。 这会提供错误的数据。 要解决此问题、您需要使用/DRDY 作为转换完成的指示器、然后在下一个/DRDY 指示之前收集数据。

    我现在将关闭此帖子、但如果您仍有疑问、请发帖、我们可以再次对此进行处理。


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

    您好、Joseph、

      很抱歉我迟到了。 我已经修改了我的代码、现在一切都正常。

    非常感谢:-)