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.

[参考译文] ADS1256:通道间差分读数中的出血/噪声..

Guru**** 2541030 points
Other Parts Discussed in Thread: ADS1256

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/818367/ads1256-bleedover-noise-in-differential-readings-between-channels

器件型号:ADS1256

我注意到从通道中提取差分数据时会发生溢出。

这里是输出:其中0是通道0、1通道1是1、2、以此类推。

通道0:1.718778v
通道 1:0.068488v <--它来自哪里?
通道 2: 000106v
通道 3:0.000100v

唯一连接了任何内容的通道是具有负载单元(4线制惠斯通)的通道0和1 (通过运算放大器运行)、其中通道0具有输出电压、通道1是运算放大器产生的 Vref

运算放大器和负载单元确实共享相同的5V+和 VCC。  采样率为30k (实际只有4000个样本/秒)、增益设置为4。  

如果代码有价值、也很乐意分享代码。 我无法判断漏气是正时还是电气的、因为它在没有重量时会运行全部零(或非常接近于零)。

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

    在此处添加一些风味文本、还有几个运行...

    通道 0:1.787240
    通道 1: 0.068414
    通道 2: 0.000148
    通道 3: 0.073314

    通道 0: 1.792080
    通道 1: 0.068454
    通道 2: 0.000041
    通道 3: 0.068475

    通道 0: 1.787111
    通道 1: 0.073335
    通道 2: 0.000097
    通道 3: 0.000079

    通道 0: 1.718776
    通道 1: 0.073346
    通道 2: 0.000138
    通道 3: 0.000073

    这些输出是运行的最后一个结果、每个运行包含对循环中每个通道的1000次读取(因此设置通道0、SYNC、WAKE、DRDY、RDATA、 读取,设置通道1.... 等等)

    谢谢

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

    Josh、您好!

    欢迎访问 TI E2E 论坛!

    当您说没有连接到其他通道时、您意味着通道2和3悬空吗?
    如果是这种情况、那么在读取这些通道时不会告诉您可能测量的电压。 您可以尝试将未使用的输入接地并重新测量。 如果这样做、您可能会看到这些通道上的测量结果趋向于零、但由于噪声、它们仍然可能不为零。
     

    4kSPS 数据速率
    当通道间复用时、请记住、SINC5数字滤波器对最后5个转换结果执行移动平均、因此复用时的有效数据速率(每次转换后切换通道) 在较高的数据速率下将数据速率降低约5倍(在较慢的数据速率下、数字滤波器看起来更像具有单周期延迟的 SINC1滤波器)。  ADS1256数据表中的表14提供了每个数据速率的预期多路复用器循环吞吐量列表。
     

    您还询问了在通道1上测量的值...

    您希望在该通道上看到什么电压?

    请注意、在下一个/DRDY 下降沿之前、应随时钟输出所有 ADC 数据。 如果您的 MCU 很慢地时钟输出数据、并且在新转换结果就绪时仍在时钟输出数据、则您移出的值可能是旧数据和新数据的组合。 换句话说、可能会获得损坏的数据。 为了检查是否会发生这种情况、我建议以低得多的数据速率运行 ADS1256、并观察测量结果是否变得更加合理。

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

    Chris、

      感谢您的回复... 您的一些评论引导我了解非常有用的方向、并提出了新问题...  首先、我是浮动2~7并且只有0和1被插入...  当我将它们锁定到与电路板相同的位置时、它们仍然很吵。 但是、在 lark 上、我添加了第二个电源(台式可调)、将其设置为5V、并将我的所有模拟输入设置为...(因为我使用的是差分)。  在此设置中、新的台式电源为我的称重传感器提供5V 电压、为运算放大器提供5V 电压(其中0和1连接到)。 然后、我在其中添加了2~7 μ m、他们清理得很好...  因此、很明显电路板电源噪声很大、我的模拟信号应该避免电路板... 好的、就是这样。。。

    现在、在引脚0/1上测量的值(差值)... 这现在有点令人困惑。  我最终验证了我发送的内容是否符合我的预期。  不过、情况似乎并非如此。 我将电源硬接线至引脚0/1、因此我应该得到一个与输入匹配的输出... 但我不是:(..

    这是计算电压的 C 代码(如果是问题)


    电压=读数*5.0/0x7fff

    这是布线:
    AIN0 =电源+端子
    AIN1 =电源-端子

    AIN2 ~ AIN7 =悬空(已拔出)

    测试代码执行100个读数、然后对最后3个读数求平均值、它仅将通道0/1读取为单个差分通道。

    以下是一些结果:
    电源电压为2V

    • 2.104512v - 15000sps
    • 2.105127v - 15000sps
    • 2.101307v - 15000sps
    • 2.101245v - 15000sps
    • 2.109394v - 30sps
    • 2.109432v - 30sps
    • 2.109398v - 30sps

    电压为0v

    • 0.073317v - 15000sps
    • 0.070043v - 30sps

    4V 电源

    • 3.276422v - 15000sps
    • 3.276467v - 15000sps
    • 3.274836v - 15000sps
    • 3.273214v - 15000sps
    • 3.437569 - 30sps
    • 3.437581 - 30sps
    • 3.437623 - 30sps
    • 3.437624 - 30sps

    首先、我希望这些数字几乎达到他们的数字...  但它们是关闭的(0应该读取到非常接近于零、但它的读数更接近0.1V)、因为摆幅并不完全有意义... 读数为0至2V、但低于4V ... 数字在15000个样本和30个样本之间变化。  

    最后、我尝试处理校准问题、但数字完全奇怪、因此我很高兴地知道了代码的这一位。

    除非我考虑这种错误、否则我的电源和 ADS1256所说的电源之间应该有很强的相关性...  

    是否有用于使用校准的协议? (例如、我应该在每次增益变化或数据速率变化后进行校准。 或者在校准时、我是否需要确保发送的是0v 还是发送的是5V? 我真的需要校准吗?)..

    因为对于分辨率介于17位和23位之间的器件、其噪声远高于我的预期、读数似乎不以可重复的方式与输入相关... 但是、我完全确定它在我身上、因此我尝试弄清我在集成中缺少什么...  

    谢谢




    Josh

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

    Josh、您好!

    为了了解电源产生的误差和噪声以及 ADC 产生的误差和噪声、我建议将 AIN0和 AIN1短接在一起(并连接到接地端)。 然后测量 AIN0-AIN1之间的差分电压、以查看 PCB 上 ADS1256的偏移和噪声性能(不求平均值)。

    另一个需要检查的问题是您的基准电压源。 如果基准电压不准确、则 ADC 将出现较大的增益误差。 ADS1256的参考源是什么? 注意:ADS1256仅接受2.6V 基准电压、因此请确保不要将电源电压用作此器件的基准电压。

    如果您碰巧有一个原理图、您可以分享它将非常有帮助。

    关于校准、此时我建议您不要校准、直到确信您获得可靠的测量结果。 如果在读取错误时尝试包括校准、则校准可能会掩盖问题并使问题更难解决。 但是、应该可以允许 ADS1256执行其自己的自动校准。

    准备好使用外部激励开始校准系统后、您需要在连接了称重传感器的情况下提供校准信号(例如、帮助校准组合的 ADC +基准+称重传感器误差)。 在称重传感器上未施加负载的情况下执行系统偏移校准有助于消除偏移误差以及称重器重量引起的偏移(如果适用)。 应始终在增益校准之前执行偏移校准。 对于增益校准、您可能无法从称重传感器生成100%满量程(即5V)信号、因此您可能需要将最大重量应用到称重传感器(或尽可能大、具有已知校准重量) 并测量结果以计算增益误差。 确定增益误差后、您能否使用增益误差校正因子手动对 FSCx 寄存器进行编程。 ADS1255-7设计计算 器可帮助您了解24位 FSC 值的重要性。

     

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

    因此、我尝试集成了两个板、它们都为我提供了类似的结果。  我已删除我的所有运算放大器和负载单元... 我正在发送 A0、只是读取一个基准电压。

    下面是10000次读取的图形(这是7500次采样/秒设置、但不使用开放流、因此我每次读取1次、因此实际速度大约为3500次)。



    它沿正常方向运行、然后随机地出现这些下降。 这些压降的原因是...  在本测试时、我使用了一个简单的电压分离器来发送一个非常小但已知的电压。 此外、我要测试的电路板具有1.6V 的基准电压、如果这一点可能与此相关。  

    也许看到这会帮助你去“哦,你应该…… "此时、我有一个已知的稳定电压被发送到单个通道、我正在正确读取它、除非它随机返回一个几乎固定的非正确数字、

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

    Josh、您好!

    在转换为电压之前、您是否会在能够共享的文本文件中包含原始数据(十六进制代码值)?

    此外、我也很高兴查看您的代码。 如果您不想在此处发布您的代码、您可以通过 以下电子邮件将其发送给我:pa_deltasigma_apps@ti.com

    ...我首先想到的是、您的代码可能是在转换完成时读取数据、而您将收到损坏的数据。 您可能需要进一步降低 ADC 数据速率并读取每个转换结果两次、以查看结果是否匹配。

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

    我在 UDOUBLE 阵列中有数据、因此将其作为十六进制写入应该非常容易。  代码基本上是 Waveshare 提供的免费内容(只是进行调整以写入文本文件而不是屏幕)。 我目前在办公室、但我将在今晚发布一些内容。 我还将介绍如何执行您建议的一些内部审计。

    谢谢!

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

    你对时间的建议给了我一个很好的方向...  我在每个读取块之间增加了几微秒(精确度为3秒)、现在数据开始更合理地返回...   

    是否有参考 C 或 C++实现、我可以根据...审核此代码库。 我对 基于 BCM2835库的实施没有什么信心。 虽然我可能仍会继续使用 BCM2835库。 更高级别的代码充其量似乎只是粗略的、因此我想从更可信的来源进行代码审核。

    此处是我的图表、其中每个读取的字节之间的延迟为3微秒、以供参考。

    因此、它看起来我是+/- 0.002伏、比我以前好得多...  

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

    Josh、您好!

    为该器件发布一些示例 C 代码是我的积压工作、但在平均时间内、我可以共享一个代码片段和一个指向简单示例项目的链接、这可能会有所帮助...

    示例项目可在此 E2E 主题上找到: https://e2e.ti.com/support/data-converters/f/73/p/338399/1182307#1182307

    下面是如何读取数据的示例代码片段:  

    //发送 RDATA 命令以读取数据
    //注:在调用此函数
    之前等待/DRDY 变为低电平 Int32_t dataRad_BYCommand (void)
    {
    uint8_t dataRx[3];
    
    SET_CS (0);//设置/CS 引脚为低
    电平 SPI_SEND_TD (RDATA_Ocode);// uint8_t dataRx[3];//发送/dock_delay
    
    =0x00_byte;//发送/dit_day_byte
    = 0x00_d/发送/dock_byte (0_byte);////时钟输出中字节
    dataRx[2]= SPI_SEND_BYTE (0x00);//时钟输出 LSB
    SET_CS (1);//将/CS 引脚设置为高
    
    电平//符号扩展和返回结果
    返回(int32_t)(((((dataRx[0]& 0x80)? (0xFF000000):(0x00000000)|
    ((Int32_t)(dataRx[0]& 0xFF)<< 16)|
    ((Int32_t)(dataRx[1]& 0xFF)<< 8)|
    (((Int32_t)(dataRx[2]& 0xFF)<< 0))
    ;} 

    注意:上述代码在"SET_CS()函数内有一些内置延迟、该延迟将第一个 SCLK 上升沿延迟至/CS 下降沿之后至少50ns。

    此外、RDATA 命令与发送"0x00"到时钟输出数据之间的 T6延迟是一个重要的时序参数。 我不认为在"0x00"字节之间延迟是必要的、但上述代码确实在字节之间存在一些固有的延迟、因为 SPI 外设被配置为一次发送一个字节、并等待 TX/RX 操作完成、然后再发送下一个字节。

    我在 SPI 外设中看到的另一个可能的问题是、您通常需要读取每个 RX 字节(即使它无关)。 例如、发送"RDATA"字节时接收到的 RX 数据并不重要、但如果您不读出、它将保持在 SPI 的 FIFO 中、如果它不是首先从 FIFO 中清除、则会作为数据计时。

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

    我用一个 八illiscope 双倍检查我的电压、可以放心地说输出现在可能只是噪声(经过大量代码审阅后)。  所以、我继续尝试征服持续 阅读... 这里的所有样片都无法正常工作。 但我能够在这种情况下工作  

    ADS1256_SetChannal (通道);
    ADS1256_WriteCmd (CMD_SYNC);
    DEV_DELAY_us (10);
    ADS1256_WriteCmd (CMD_WAKEUP);
    DEV_DELAY_us (10);
    DEV_Digital_Write (DEV_CS_PIN、0);
    ADS1256_WaitDRDY ();
    DEV_DELAY_us (8);
    DEV_SPI_WriteByte (CMD_RDATAC);
    DEV_DELAY_us (8);
    
    对于(i = 0;i <count; i++){
    ADS1256_WaitDRDY ();
    buf[0]= DEV_SPI_ReadByte ();
    DEV_DELAY_us (3);
    buf[1]= DEV_SPI_ReadByte ();
    DEV_DELAY_us (3);
    buf[2]= DEV_SPI_ReadByte ();
    
    读取=(((UDOUBLE) buf[0]<< 16)& 0x00FF0000;
    读取|=((UDOUBLE) buf[1]<< 8);//注意它是错误的读取|=(buf[1]<< 8)*/
    读取|= buf[2];
    IF (读取和0x800000)
    读取|= 0xFF000000;
    ADC_Value[i]=读取;
    while (DEV_Digital_Read (DEV_DRDY_PIN)= 0);//您必须等待位上升、或者您可以双读取
    }
    DEV_SPI_WriteByte (CMD_SDATAC);
    DEV_Digital_Write (DEV_CS_PIN、1); 

     进入环路的时间至关重要、您必须在调用 RDATAC 之前打开 CS、然后在 SDATAC 之后关闭它... 此外、如果您不等待 DRDY 变为高电平、您还可以退出时序... 简而言之、它是一个触发器。 但这对我来说一直都很有效... 所有的一切,除非看起来完全错误,我认为这一切现在都在运作。  

    感谢您的所有帮助!

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

    Josh、您好!

    我对延迟回复表示歉意。 我离开办公室几天。

    您的代码定序看起来正常。 我刚才对/CS 操作有一个评论:

    • /CS 可在命令之间和数据读取之间切换。

      也许您的"ADS1256_WriteCmd ()"函数正在控制/CS 引脚、但如果没有、请在发送 SYNC 和 WAKEUP 命令之前确保/CS 为低电平。

      此外、我建议在读取数据之前和之后切换/CS (即在计时输出数据之前将其设置为低电平、并在计时输出 LSB 后将其设置为高电平)。 通过切换/CS、您可以确保在每次读取数据时启动新的 SPI 帧。 否则、在 SCLK 信号上发生干扰的情况下、您将面临与 ADS1256不同步的风险。

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

    即使在连续循环中、您也会在循环的每个节拍上降低和升高 CS?  psudo 代码如下:

    CSLow()
    SYNC ()
    WAKE()
    WaitDRDY ()
    ![CDATA[
    CSHigh()
    环路
       CSLow()
       ReadByte()
       ReadByte()
       ReadByte()
       CSHigh()
       DoStuffToBytes()
    EndLoop

    我以为我玩了这个游戏,但我的行为非常奇怪,但如果这是你的意思,我可以再玩一次

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

    Josh、您好!

    如果我编写代码、我可能会执行如下操作:

    CSLow()
    SDATAC() //在读取或写入寄存器之前确保器件处于 SDATAC 模式
    CSHigh()

    CSLow()
    //在此处配置设备寄存器...
    CSHigh()

    CSLow()
    SYNC ()
    CSHigh()

    CSLow()
    WAKE()
    CSHigh()

    CSLow()
    RDATAC()
    CSHigh()

    环路

    WaitDRDY ()

    CSLow()
    ReadByte()
    ReadByte()
    ReadByte()
    CSHigh()

    DoStuffToBytes()

    EndLoop

    您可能不需要在如此接近的命令(例如 SYNC 和 WAKE)之间切换/CS。 然而、只要 ADC 长时间处于闲置状态、我建议将/CS 设置为高电平、以减少 SCLK 上出现鼻毛刺的可能性。