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**** 2549940 points
Other Parts Discussed in Thread: ADS1256, ADS1256EVM-PDK

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/699762/ads1256-not-able-to-read-and-write-the-values-to-the-configuration-registers

器件型号:ADS1256

你(们)好

我有 ADS 1256开发板、并尝试使用 STM 立方体和 SW4 (基于 Eclipse 的工作区)连接 STM32F446ZE。  

有时、我只能在将特定数据写入任何寄存器时从配置寄存器中读取默认值。 我的意思是在写入命令被发送后。 如果我写入数据(其中包含 LSB 位1)、那么我将获得响应读取命令的默认寄存器值。   如果我写入数据(其中包含 LSB 位0)、那么我将获得0x00寄存器值以响应读取命令。   

此外、我无法向寄存器写入任何值。 在这里、我附加了使用逻辑分析仪捕获的 SPI 通信详细信息。

e2e.ti.com/.../6201.SPI.zip

谢谢、

Harsha  

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

    您好、Harsha、

    欢迎访问 TI E2E 论坛、感谢您分享您的逻辑分析仪屏幕截图!

    我注意到您正在对不同的寄存器进行读取和写入、是有意读取还是打算读回您尝试编程的值?

    当前、您正在发送"0x54 0x00"命令、该命令将写入"I/O"寄存器、当您发送"0x10 0x00"命令字节时、您正在从"状态"寄存器读取数据。

    WREG 命令被忽略、因为当高半字节位全部设置为"0"时、"I/O"寄存器不允许您写入低半字节位。 请参阅下面的 I/O 寄存器说明:
    I/O: GPIO Control Register description

    您的 RREG 命令当前仅读取状态寄存器。 第一个"0x31"结果似乎有效。 请注意、该寄存器的 LSB 遵循/DRDY 引脚的状态、因此在连续读数之间可能会有所不同;但是、在上半字节中仍应看到相同的值。 在第二次读取中、ADS1256看起来不响应 RREG 命令。 也许/RESET 或/PWDN 引脚被设定为低电平、或者同一 SPI 总线上的其它器件在此期间也处于激活状态吗? 如果不是、您是否在 ADS1256上看到常规/DRDY 脉冲以指示其处于活动状态?

    最后一个重要的建议... 确保在读取或写入器件寄存器之前发送 SDATAC 命令。 如果您处于 RDATAC 模式、则该器件可能会忽略 RREG 和 WREG 命令。 我建议首先发送 SDATAC 命令、以确保您不处于 RDATAC 模式。

    此致、
    Chris

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

    感谢您的快速回复。
    是的、这是有意阅读和写作。 首先、我只尝试读取"状态"寄存器、但只有几次我得到了正确的响应。 我添加了 WREG 命令。 我确实会在 DRDY 引脚上看到常规脉冲。 复位和 SYNC/PWDN 引脚被上拉。 SPI 总线上只有 ADS1256。
    在读取和写入寄存器之前、我没有使用 SDATAC 命令。 现在、我将在禁用连续数据读取模式后检查响应、并告知您结果。

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

    我有几个疑问。

    1).同步过程的频率如何?

    2).自校准和系统校准之间有何区别? 如果我们发出 SELFOCAL 或 SYSOCAL 命令、OFC 寄存器将被更新。 那么、我们需要执行哪一个呢? 我们需要多久进行一次校准?

    此致、
    Harsha B S
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Christopher、
    我要问的问题很少。 请帮帮我!

    现在、我能够读取和写入 ADS1256配置寄存器值。 在我的电流设置中,Vref 为2.5V。 如果我从 ADC 通道0测量5V 电压,则得到十进制的8388607,并且该值正确(2^23 = 8388608)。 当我将接地端连接到通道0时、我从读取命令中获得17543十进制值。 我认为该值应为0十进制。 我是对的吗??


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

    您好、Harsha、

    很高兴您能在周末使用 RREG 和 WREG 命令!

    回答您的最新问题...

    [报价用户="Harsha B S]1).同步过程需要多长时间?

    仅当需要重新启动 ADC 转换(例如、通过多个通道进行多路复用)或需要在固定时间开始转换(例如、如果需要多个 ADS12A 同时从多个传感器采样电压)时、才需要同步。 除了这些用例、您可能不需要担心同步问题。

    [引用 USER="Harsha B S]2).自校准和系统校准之间有何区别? 如果我们发出 SELFOCAL 或 SYSOCAL 命令、OFC 寄存器将被更新。 那么、我们需要执行哪一个呢? 我们需要多久进行一次校准?[/quot]

    "自校准"和"系统"校准之间的差异与您尝试解决和删除的错误有关...

    执行"自"校准时、您将自行消除 ADC 的初始偏移和增益误差。 "系统"校准用于消除系统的总偏移和增益误差;例如、这是由来自传感器、信号调节电路和 ADC 的误差组合产生的。

    "自"校准更易于执行、因为您只需发出自校准命令、ADC 就会 在内部为您测量其自身的偏移和增益误差。 "系统"校准要求您在外部提供正确的0V 和满量程电压。 通常情况下、系统失调电压校准是可行的、但系统增益误差校准不可行、因为它需要非常精确的满量程电压。

    您执行哪种类型的校准以及执行频率由您决定... 只要可能、我建议进行"系统"校准、因为它可以消除的误差比仅 ADC 误差更多。 您校准的频率取决于您期望偏移和增益变化的频率。 如果您的系统在环境温度范围较宽的环境中运行、您可能需要经常重新校准、以消除偏移和增益误差对温度的依赖性、或以其他方式调用之前在类似温度下执行的校准中的校准系数。

    [引用 USER="Harsha B S">当我将接地连接到通道0时、从读取命令中得到17543十进制值。 我认为该值应为0十进制。 我的回答是否正确?[/引述]

    理论上,是的… "17543"的转换结果对应于~10mV 的电压(VREF = 2.5且 PGA = 1V/V)。 负输入通道连接至-10mV、或者 ADC +任何信号调节电路+输入信号源本身都会导致10mV 的偏移误差。

    您可能会尝试将正输入和负输入(至0V)整合在一起、以查看此误差中有多少来自您的信号源。 无论剩余的任何误差是偏移电压、您都应该能够通过"系统"偏移校准将其移除。

    此致、
    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Christopher、
    感谢详细的解释。 它对我帮助很大。 在执行校准和同步时、我还有一些疑问。

    我按照以下步骤读取连接到 ADC 通道 AIN0至 AIN3的多个传感器。 请确认我的程序是否正确。
    > SRDATAC 命令(连续停止读取数据)
    >选择 ADC 通道(MUX 寄存器写入)
    >执行同步(SYNC + WAKEUP 命令)
    >从传感器读取数据
    >返回到第一步。
    1)。 每次我更改 MUX 寄存器以选择 ADC 通道时、是否需要执行同步?


    我已按照以下步骤执行系统失调电压和增益校准。

    系统偏移校准:
    我选择了单端读取模式、正输入连接到接地、负输入连接到 AINCOM (也连接到 AGND)。 然后发出 SYSOCAL 命令。

    系统增益校准:
    我选择了单端读取模式、正输入连接到5V、负输入连接到 AINCOM (也连接到 AGND)。 然后发出 SYSGCAL 命令。

    2)。 请确认这些校准方法是否正确。 我们是否需要对每个通道执行此过程?
    3)。 如果我有校准后的 OFC 和 FSC 值、我是否可以使用这些值直接写入这些寄存器、而不是再次校准
    电压是多少?

    4)。 ADS1256中的缓冲器使能如何帮助我们? 缓冲器启用后对 ADC 读数有什么影响?

    5)。 我需要了解第一次检测连接到通道的传感器的过程、然后开始读取传感器。
    基本上需要知道如何处理传感器检测电流源来检测传感器。


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

    您好、Harsha、

    您的欢迎! 关于多路复用过程、序列看起来正确;请记住在重复步骤1之前等待/DRDY 变为低电平。 关于您的其他问题...

    1) 1)我不确定是否有必要、但发布它将使 ADC 切换通道速度更快。

    2) 2)是的、它们与您描述的内容看起来是正确的。

    3) 3)是的、您可以保存校准系数并在稍后再次调用它们。 [6/20更新]:如果您需要单独校准每个通道、这将特别有用。

    4) 4)缓冲器增加 ADC 的输入阻抗。 如果您的传感器没有低输出阻抗、则可能需要缓冲器来防止负载。

    5) 5)要检测传感器是否存在、您需要按照与 ADC 通道多路复用类似的步骤进行操作、但对于其中一个(或多个)通道、您需要启用传感器来检测电流源并测量输入电压。 如果电压测量值大约为~5V 或接近~0V、则可以分别指示存在开路或短路。

    请注意、在尝试测量实际传感器电压时、需要禁用传感器检测电流源以获得最佳测量精度。

    我希望这对您有所帮助、
    Chris

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

    感谢您的回复。

    今天、我使用 ADS1256的传感器检测功能进行了测试。 我通过启用0.5uA 电流源对此进行了测试。
    在测试时、我选择了单端模式并对所有通道进行了测试。

    当 ADC 通道打开时,我读取的 ADC 值大约为2161753十进制。
    当 ADC 通道短接表示 Psel 和 Nsel 短接时、I 读为十进制的16772893。 这是满量程值、足以进行识别。

    在这里、我可以轻松区分"短路"、但识别"开路"不太容易。
    这是因为当我连接传感器时、这些值会发生碰撞、该传感器提供的电压与开路情况下相同。 开路条件值不为零。 这些与您所说的"如果电压测量值约为~5V 或接近~0V、则可以分别指示存在开路或短路。" 但在本例中、它是反相的。 请告诉我、我们的理解中缺少任何内容。



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

    您好、Harsha、

    很抱歉、我昨天急于给您回复、我对开路电压的回答不正确...因为有一个3V 钳位被启用、开路电压应该更接近3V (而不是5V、正如我在上面所说的那样)。

    我对 ADS1256EVM-PDK 进行了快速测试、 对于开路电压、在启用0.5uA SDCS 的情况下、当输入悬空时、我测量的电压大约为2.71V、如下所示:

    在开路情况下、您似乎测量的电压为1.28V、这是正确的吗? 这对应于连接到输入的大约2.5MOhms 的有效阻抗。 也许、在断开传感器连接的情况下、输入之间仍然存在这条弱电导路径? 如果没有焊剂残留物会导致这种电导、请务必清洁 PCB。

    注意:如果我将 SDCS 增加到2或10uA、那么我测量的电压会略大于3V。 您还可以尝试将 SDCS 电流增大到2uA 或10uA、以便在输入断开时增大测量电压。 但是、请确保在连接传感器时、您仍然使用这些较高的电流测量远低于3V 的电压、以免将连接的传感器误认为存在开路。

    此致、
    Chris

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

    您好、Christopher、

    我已逐波使用 ADS1256开发板。 在该板中,RC 电路连接到每个 ADC 引脚。 RC 电路的电阻值为1k 欧姆、电容值为0.1uF。 测得的开路电压似乎约为640毫伏。 它不是大约3伏。 我也使用2uA 和10uA 电流源进行了检查、但它不是大约3V。 对于10uA、我们得到大约4.4伏;对于2uA、 我们在开路情况下得到大约2.4伏。

    理论上、当 ADC 短路时、我们应该读取"0"的 ADC 值、但正如我昨天提到的、我将获得满量程 ADC 值。 为什么 ADC 在短路时读取该满量程电压?

    在我的应用中、如果我想定期检查传感器集成、那么 我如何确保传感器输出电压在3伏限制范围内? 我认为使用5V 模拟传感器无法实际实现此功能。 我对吗???

    请在下表中找到测量的详细信息。  

    0.5uA SDCS

    2uA SDCS

    10uA SDCS

    ADC 值

    CRO 电压

    ADC 值

    CRO 电压

    ADC 值

    CRO 电压

    开路

    1103365

    624mV

    4209867

    2.3V

    6966209

    4.4V

    短路

    16772508

    0V

    16775703

    0V

    15413

    0V

    短接33k 电阻

    32702

    24mV

    143194

    80mV

    731592

    400mV

    此致、

    Harsha B S

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

    您好、Harsha、

    您正在读取的大十进制值实际上是负数。 例如、"16772508"(十进制)是"FFED9C"(十六进制)、当您对24位 ADC 代码进行符号扩展时、它实际上表示"-4708"。 当我将十进制代码转换为电阻值时、我得到以下结果...

    总体而言、结果似乎可以、但可能有些失调电压会影响短路输入情况...

    在测量短路输入时、如何配置 OFC[2:0]寄存器? 请确保您将其重置为默认值、 或者、确保这些通道的校准系数正确(例如、如果您校正了另一个通道上的较大偏移、并且没有为此通道重新编程这些寄存器、则会产生较大的偏移误差)。

    作为参考、当我测量 ADS1256EVM-PDK 上的短路输入时、我得到 的结果约为-270欧姆@ 0.5uA、-95欧姆@ 2uA 和-20欧姆@ 10uA。

    @ 10uA 开路情况下的误差可能是由于输入电压钳位造成的、否则10uA * 1.2 MOhm 将为12V。 我仍然认为、在输入断开的情况下、电流可能有一条泄漏路径(电阻近似值为1.2M Ω)。 它们在 ADC 输入上的任何其他组件(除 RC 滤波器之外)是否也会导致这种情况?

    此致、
    Chris

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

    您好、Christopher、

    感谢你的答复。

    是的。 我没有考虑 ADC 输出是二进制补码形式。 现在、我纠正了该转换过程。 如果您提供了一个高效的转换代码补丁、我可以实施该补丁来将 ADC 字节转换为电压/整数值、这将对我更有帮助。  

    我已经检查了 ADC 开发板的原理图、发现只有 RC 电路连接到输入端。 (1千欧姆和0.1 μ F)

    下面列出了较新的测量值。

    0.5uA SDCS

    2uA SDCS

    10uA SDCS

    ADC 值

    电压

    ADC 值

    电压

    ADC 值

    电压

    开路

    4892259

    2916mV

    6125239

    3650.9242mV

    7058076

    4206.93mV

    短路

    -4704

    -2.803V

    -1562

    -0.9310mV

    15339

    +9.142mV

    短接33k 电阻

    34262

    +20.42mV

    147885

    +88.1462mV

    756079

    +450.658mV

    这些是校准系数。  每次复位后、我都会执行自校准。 这些值几乎保持不变(1或2个十进制变化)

    OFC0:160 Decimal

    OFC1: 253十进制

    OFC2: 255十进制

    FSC0: 025十进制

    FSC1: 167十进制

    FSC2: 073十进制

    "如果您校正了另一个通道上的大偏移量、但没有为此通道重新编程这些寄存器、则会产生较大的偏移误差"

    我不理解你刚才提到的内容。 请解释这一点。 我们是否需要对每个通道执行校准?  

    此致、

    Harsha B S

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

    您好、Harsha、

    [引用 user="Harsha B S">如果您提供了一个高效的转换代码补丁、我可以实施该补丁来将 ADC 字节转换为电压/整数值、这将对我更有帮助。  [/报价]

    我写了一篇博客、其中包含一些示例代码、介绍了如何在 C 语言中使用符号扩展。您可以在以下位置找到它: e2e.ti.com/.../it-s-in-the-math-how-to-convert-adc-code-to-a-voltage-part-1

    从那时起、我仍然使用相同的方法、但我更喜欢编写代码、如下面的示例所示、因为我认为这种方法更干净、更不容易出错...

    //版权所有(c) 2018 Texas Instruments Incorporated
    
    //示例读取数据函数
    Int32_t ReadData ()
    {
    uint8_t ADC_DATA[3];
    
    //在此处插入 SPI 通信
    //在 ADC_DATA 数组中收集数据
    //其中 ADC_DATA[0]保存 MSB
    //和 ADC_DATA[2]保存 LSB
    
    //返回32
    位扩展转换结果* int32位 signt
    if (ADC_DATA[0]& 0x80u){signByte = 0xFF000000;}
    否则{signByte = 0x00000000;}
    
    int32_t upperByte=((int32_t) ADC_DATA[0]& 0xFF)<< 16;
    int32_t 中间字节=((int32_t) ADC_DATA[1]& 0xFF)< int32_t
    < int32_t <t <t <int32_dateByte =(int32_t)< 0xFF;int32_t < int32_t <t <t <int32_t <t <t <t < int32_int32_t
    
    返回(signByte | upByte |中间字节|低字节);
    } 

    注意:此代码片段取自 www.ti.com/.../toolssoftware 上的示例代码

    [报价用户="Harsha B S">我已经检查了 ADC 开发板的原理图、发现只有 RC 电路连接到输入端。 (1千欧和0.1 μ F)[/QUERP]

    好的。 我不认为您的开路阻抗仅为1.2mM 是一个大问题、尤其是因为我在 EVM 上仅测量5mM。 但是、如果您想确定、可以尝试移除电容器并清洁 PCB、以仔细检查是否没有寄生泄漏路径。

    [引用用户="Harsha B S"]

    "如果您校正了另一个通道上的大偏移量、但没有为此通道重新编程这些寄存器、则会产生较大的偏移误差"

    我不理解你刚才提到的内容。 请解释这一点。 我们是否需要对每个通道执行校准?  

    [/报价]

    为了获得最佳性能、是的、您需要在每个通道上执行系统校准。 每个通道都可能具有唯一的失调电压和增益误差、尤其是在考虑信号调节或滤波的外部影响时。

    但是、如果您仅执行自校准、则可能不需要执行此操作。 自校准可消除大部分 ADC 误差(仅 ADC 误差)、因此每个通道的校准系数可能非常相似。

    此致、
    Chris

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

    您好、Christopher、

    感谢您的回复。

    我是否可以知道偏移和满量程寄存器值到底是如何影响 ADC 读数值的?  

    请举例说明。 或者,您能指导我在哪里可以获得这些详细信息吗?

    例如、如果输入电压为10mV、并且基于这些寄存器值、ADC 读数将如何变化。

    谢谢、此致、

    Harsha B S

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

    您好、Harsha、

    查看  ADS1256产品页面"工具与软件"选项卡上的 ADS1255-7设计计算器、了解其是否有用。 有一个"Calibration"选项卡、显示如何将 OFC[2:0]和 FSC[2:0]寄存器值转换为"V"和"V"单位。

    此致、
    Chris