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.

[参考译文] ADS7038:返回错误的 ADC 值

Guru**** 2454490 points
Other Parts Discussed in Thread: ADS7038

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1400970/ads7038-erroneous-adc-values-being-returned

器件型号:ADS7038

工具与软件:

我查看了 TI 论坛、但找不到最终的解决方案、因此发布了一个新问题。

ADS7038芯片有问题。 我似乎一次又一次地得到了错误的 ADC 值。 这在我的生产卡上发生、但我还使用与 TI ADS7038开发板通信的 NXP S32K146开发板重新创建了它。 我认为这可能是 SPI 时钟问题。

我有一些示波器 JPG 和 CSV 读数、这些读数会显示有趣/怪异的效果。 这些来自我的生产卡、但我想从 NXP/TI 的组合中获取一些迹象、以便从公式中省去我们的生产卡设计。 这需要几天时间。

我正在从 ADC 通道3读取、并附加了通道编号、因此在从 ADC 返回的24位 MISO 中、我应该得到0xABCd00、其中0xABC 是 ADC 值、d 是通道编号(3)。

我在1Hz 和/或1KHz 下注入1V..2V 的锯齿输入。 我已将 AVDD 设置为3V。 这应该意味着我期望的值在1300..2730范围内。
我发送 WRITE CHANNEL_SEL 3、然后发送 WRITE SYSTEM_STATUS 0、并在执行第2条命令时获取 ADC 读数。 然后、我重复此序列(当前尽可能快、但以固定频率运行时也会失败-在这里发现了原始问题)。
我已经修改了我的代码、如果我获得一个非3通道数或者 ADC 读数小于100或者 ADC 读数大于3700、那么我发送一个(无效的) SPI 消息0xDDEEFF 并在一个断点处停止。 当看到该0xDDEEFF 值时、我让示波器停止记录。
理想情况下、代码不应命中断点、且示波器不应停止记录。 遗憾的是、JPG 中也没有这种情况。

JPG、尤其是最后一个 JPG、显示 ADC 读数增加(由于锯齿输入) 0x7cc、0x7e1、0x7F1、0x000、0x80c (0x000是错误值)。
有趣的是、在0x000上、ADC 尝试驱动一个高电平位、但它持续时间不到一个时钟脉冲。
如果需要、我还在 CSV 文件中提供了4个通道(C1 = CLK、C2 = MISO、C3 = CS、C4 = MOSI)的录制文件。

当我第一次观察到这个问题时(在有示波器跟踪之前)、我认为它总是在2048 (这是4096 12位 ADC 最大范围的一半)左右发生。 在连接的 JPG 中、问题看起来像是 ADC 尝试从1 (意味着 ADC >= 2048)开始、这将支持"在 MSB=1 (ADC 大约2048)附近发生"。 然而、对0.5V..1V 范围内的锯齿(因此无法接近2048 ADC)进行进一步测试时也会出现问题。 这可能是一个因素,但不是完整的故事。

我对大多数寄存器使用默认值、具体来说、CPOL/CPHA 都为0。 通道1和3设置为模拟输入、所有其他通道均设置为 GPIO 输入。 在我使用 NXP/TI 开发板时、我将所有通道设置为0V 或3V、但通道3除外、它具有锯齿状结构。

在其他测试中、我注意到以下几点

  • 错误的通道编号(通常是所需通道的两倍)、即通道6、而不是3。
  • 有时、我使用的是通道0、但使用的频率要比获得所需通道的两倍还要低。
  • 我还进行了一些读取、寄存器、0操作、并取回了看起来像 ADC 读数(2字节的 ADC/通道值、然后是0x00)的内容、而不是寄存器读取(1字节的寄存器值、然后是0x00 0x00)。

在读取寄存器0中、返回 ADC 读数、我猜 ADC 未正确解释命令、因此拒绝了该命令、并因此输出了最新的 ADC 读数。 如果底层问题是时钟问题、那么这是合理的、并且与我看到双倍通道数的情况相反。

你是否能够说明这个问题? JPG 和 CSV 文件是否有帮助?

谢谢
Darren
    e2e.ti.com/.../Z2_2D002D00_got-you-1_2D002D00_00001.csve2e.ti.com/.../Z3_2D002D00_got-you-1_2D002D00_00001.csve2e.ti.com/.../Z4_2D002D00_got-you-1_2D002D00_00001.csve2e.ti.com/.../Z1_2D002D00_got-you-1_2D002D00_00001.csv

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

    Darren、您好!

    读取转换数据时、将使用20位宽的 SPI 帧、其中前12位是转换数据、接下来的4位 将是本例中附加的通道 ID 位、后跟四个0。  

    24位 SPI 帧用于器件编程操作、例如读取和写入寄存器。  

    这是否会对您看到的问题有所帮助?

    此致、
    Joel

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

    我发现数据表非常令人困惑、例如第8.3.12.2节提到存在设置位(0x18)和清除位(0x20)、但数据表中没有其他内容显示如何使用它。 这是一个应从此数据表中删除的来自其它 ADC 芯片的特性吗、或者此数据表中缺少"设置位/清除位"部分吗?

    至于16位宽或20位宽的 SPI 帧问题...第8.3.9节提到了"最低12个 SCLK。 其余时钟可选。" 因此、我希望24位帧可以。 有趣的是、图中不存在 SDI 线。  由于 SPI 将始终从 ADC 返回 MISO 数据、因此如果前一条命令是"读取、寄存器、虚拟"、第8.3.12.2.2节显示寄存器值在前8位中返回、然后是0以填充到通过 MOSI 发送的帧的其余部分。 如果前一条命令不是读取命令、那么我想 ADC 将始终返回最新采样的12位 ADC 值、后跟可选的通道编号或状态、然后是0、以填充通过 MOSI 发送的帧的其余部分。 这没有明确提及、但很常见、一个必须返回值的 ADC 也可能返回最新的 ADC 样本。

    第8.4.2节中的图34意味着 ADC 结果以24位帧形式返回(因为"切换到 ainz"是写入 channel_sel、z 序列)。 这是我将使用的"write、channel_sel、3"、然后使用另一个"write、register、refresh_value"。 由于我们的设计/代码标准、我们需要刷新 ADC 寄存器。

    因此、我认为发送20位宽的 SPI 帧而不是24位帧不会有用。 我想这必须是一个"无操作、0x00、0x0"(最后部分是4位、以形成20位帧)。

    我还没有提到我 在 CONV_MODE = 0、SEQ_MODE = 0、OSC_SEL = 0、CLK_DIV = 0的情况下运行。 我也是以8MHz 比特率运行、但我看到同样的问题也是以较慢的速率运行。

    我现在尝试在 NXP/TI 开发板组合上重复设置和示波器轨迹。

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

    Darren、您好!

    看起来您包含的前两个图像是相同的。 如果 这里应该有另一张图片、并且您认为它可能有用、您能否将其包含在您的回复中?

    Set Bit 和 Clear Bit 命令的工作原理与单寄存器写入命令完全相同。 唯一的区别是 SDI 上前8个位上提供的操作码。 唯一的区别是、设置位命令将 在不修改其他位的情况下将 SDI 的8位数据字段中指定的位设置为高电平。 清除位命令将 在不修改其他位的情况下将 SDI 的8位数据字段中指定的位设置为低电平。 但是、这一点值得在数据表中加以澄清、我将仅作为建议!

    似乎您正确地使用了该器件、是的、您可以在获取最新转换数据时为该器件发出24位命令。  

    以上所有内容都让我相信这很可能是时钟问题。 通道编号加倍的问题可能是由意外的位移位(0011变为0110)引起的。  乍一看、似乎您满足了最低时序要求。 虽然我的第一个结论是 CS 在错误数据之前没有保持足够长的高电平、但它似乎是~250ns。 您能否确认这一点? 您是否还能确认 SCLK 在转换期间运行的频率?  

    如果事实证明时钟不是问题、那么可能是您使用的单个器件有问题。 如果调整时序不起作用、您是否能够与其他器件直接交换?

    此致、
    Joel

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

    两个 JPG 是相同的(我在范围上的错误)。

    我在 NXP 开发板上复制了与 TI 开发板通信的问题。 然而,目前的想法是这样的 可能 测试设置问题、我们要做更多的测试。

    目前、我们有示波器轨迹、显示来自2条消息的6个连续字节、具有有趣的 MISO 迷你尖峰。 我们不确定这是由于时钟、接地或其他原因、进一步测试是为了解决该问题。

    下面的6幅图沿着皮转式迹线的顶行显示了相同的6条单独的 SPI 消息、底行缩小了不同的单字节。 输入是锯齿波增大、因此我们应该会看到通道3的 ADC 读数增加。 返回的读数为...

    • 消息1 = 0x7b0通道3
    • 消息2 =  0x7b6通道3
    • 消息3 =  0x7b1通道3 (值略小于之前的值-可能在读数的噪声裕度范围内)
    • 消息4 =  0x7b4通道6 (错误通道、但 ADC 读数似乎正常)
    • 消息5 =  0xFF0通道0 (天哪)
    • 消息6 =  0x7ae 通道6 (错误、但 ADC 读数似乎正常)

    CS =蓝色

    CLK =黄色

    MOSI =绿色

    MISO =红色

    CPOL = 0、CPHA = 0

    比特率= 1MHz (1us/位)

    当 CLK 为低电平时 、MISO 为下一位为上升沿做好准备。

    图1

    消息4 =  0x7b4通道6 (错误通道、但 ADC 读数似乎正常)

    字节1 = 0x7B (所有看起来均正常)

    每次 CLK 变化时都有小幅振铃。

    图2

    消息4 =  0x7b4通道6 (错误通道、但 ADC 读数似乎正常)

    字节2 = 0x46 (amiss 是什么、应该是通道3)

    在此、MISO 上-72.205us 标记附近有一个小的尖峰。 有趣的是、如果 ADC 尝试在此处发送一个1、然后其他位向下移动、我们可能会得到0x53、这意味着通道3上为0x7b5、这更有意义。

    在这里、ADC 读数出错并会影响我的项目。 这就是我开启"输出通道编号"功能的原因。 在这种特定情况下、虽然读数0x7b4是相当合理的、因为它是12位 ADC 值的 LS 位。 但是、如果第一个字节出现尝试驱动1但变为0的微小尖峰、则它可以成为 ADC 值的 MS 位、并将0x800变为0x000、这是值的重大更改。

    所有其他 CLK 变化上的振铃与第一张图片一致。

    图3

    消息4 =  0x7b4通道6 (错误通道、但 ADC 读数似乎正常)

    字节3 = 0x00 (所有看起来都正常)

    所有 CLK 变化上的振铃与第一张图片一致。

    图4

    消息5 =  0xFF0通道0 (天哪)

    字节1 = 0xff (天哪)

    ADC 是否在其状态机中完全丢失了? 不确定这里发生了什么。 这是先前错误导致的吗? ADC 是否可以响应先前的消息4命令0x081103、但将其误解为0x101103或0x102206或其他一些命令(缺少 MOSI 命令开头的第一个位、以便全部向左移动一位)? 如果它认为正在执行0x10读取而不是0x08写入、那么 ADC 返回寄存器值是合理的、但是它是哪个寄存器? 返回值为0xFF、此值对 CHANNEL_SEL (0x11)或 EVENT_COUNT_CH0 (0x22)无效

    所有 CLK 变化上的振铃与第一张图片一致。

    图5

    消息5 =  0xFF0通道0 (天哪)

    字节2 = 0x00 (天哪)

    再说一次、在这里不确定。 参见图4注释。

    所有 CLK 变化上的振铃与第一张图片一致。

    图6

    消息5 =  0xFF0通道0 (天哪)

    字节3 = 0x00 (正常)

    我们是否再次同步? 下一条消息6 (在每张图片的顶行中)再次显示了合理的 ADC 值、但通道6错误。

    所有 CLK 变化上的振铃与第一张图片一致。

    我会在我的设置下再写一篇文章,因为增加更多的 JPG 似乎会把事情弄乱一点。

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

    完成此测试后、我尝试简化设置中的电线和接地数量。 我移除了3个示波器探头、只留下 MISO 并设置触发器来捕获微型尖峰(高电平持续时间小于120ns -记住一个位是1us)。

    在这里的设置图片中、我没有看到任何问题、但如果我将 CLK (直接在 NXP 和 TI 电路板之间)更改为其中一个白色条带中的2根线、那么我的代码又变得很有趣(在 ADC 软件复位写入、CFG、0x01后等待 BOR 设置为1)。 这就是我所说的进一步接地和计时调查的含义。 虽然这可能表明电气设置不佳、但我们也在我们的生产卡上看到了问题。 正在进行进一步调查。

    直到我完成我们的其他调查为止。

    所有这些中是否有任何东西表明 ADC 存在问题或纯粹是接地/时钟布线?

    谢谢

    Darren

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

    一个轻微的更新,图片将在明天.

    已经清理了布线。

    在8 MHz 下运行时、我仍然看到迷你尖峰变为1的问题。 有时 ADC 正在尝试设置1 (为下一个位做好准备?) 而 CLK 为高电平。 通常、它在 CLK 的下降沿之后准备下一位值。 我们可以看到它在 CLK 高电平周期即将结束之前执行此操作的图片。 这一定是错误的、

    有趣的是、在4 MHz 处运行时、问题似乎已解决、但4 MHz 在我们可接受的 SPI 总线速度限制范围内。

    我打算隔夜运行4 MHz、但我预计它仍会在早上运行。 在8 MHz、它在几秒钟内出现这些伪波小尖峰故障。

    更多的细节要跟随明天,与图片.

    Darren

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

    Darren、您好!

    感谢您抢先回答我本会提出的接下来的问题和问题。  

    由于有些问题是通过修改测试设置来解决的、因此这将表明这是主要问题。 长跳线和试验电路板连接也可能导致我们所看到的总体问题、因为它们会导致更高的电阻和寄生电容。

    因此、我要采取的第一步是优化此测试设置。 这意味着要缩短导体的长度、避免进行外部连接(例如试验电路板电源轨)、使用不会给电路加载负载的探头、以及对示波器探头使用较短的接地连接器。

    虽然我仍然不确定确切的问题是什么、但尝试在图2的第三个下降沿驱动1的器件似乎也表明 器件可能存在问题、但根据您的描述、这似乎确实发生在多个器件之间、对吗? 相同问题不太可能在多个器件上发生。 在同一个地方、我还注意到 MOSI 线也下降了很多。 您是否还了解导致这种状况的原因?  

    您能再多讲一讲您在制作卡中看到的问题吗? 在这种情况下、控制器与 ADC 之间有什么连接?

    此致、
    Joel

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

    对不起,但这里来了另一篇很长的文章!

    我刚刚发现另一个项目表示它们看到了错误的 ADC 值0。

    我的问题开始是因为我想使 ADS7038 ADC 样本与 NXP 芯片中的内部 ADC 同步。 我想说"Go SPI、Go internal ADC"、但内部 ADC 将立即开始采样、而 ADS7038采样只会在接收到2命令 SPI 消息的一部分时发生。 我的消息始终是"write、channel_SEL、0x03"、后跟"write、different_register_each_message、 Refresh_the_register_value"。 第2条命令定期刷新所有 ADS7038寄存器、并返回第1条命令中的 ADC 读数。

    我不确定需要输入通道的确切时间点、因为我发现在这方面难以阅读数据表。 从图1"转换周期时序"中、我的理解(猜测)是当 CS 变为低电平(以开始接收第1条命令)时、它"获取"通道3样本。 请注意、在我的设置中、第一位是在 CS 变为低电平250ns 后发送的。 可对采集时间进行编程、我使用 OSC_SEL=0、CLK_DIV=0、每1us 提供一次采样("仲裁"和"转换")。 由于 tCYCLE = tacq + tCONV 且 tCONV 固定为600ns、因此 tAQC = 400ns。 由于我在8MHz 上运行 SPI、因此发送单个命令需要3us。 因此、ADC 早在第1条命令结束之前就"采集"了样本。 然后、该图表示它在 CS 上升高电平时进行转换、即在第1条命令结束时进行转换。 发送第1条命令的最后一位后、我等待125ns、然后再将 CS 提升为高电平。 然后、我在发送第2条命令之前等待250ns。 这意味着 ADC 通道会在250ns 等待周期开始时"转换"。 由于"转换"需要600ns、因此在采样准备就绪之前还有350ns。 然而、在250ns 等待周期(CS 处于高电平)后、我会将其驱动为低电平、以便开始第二条命令。 这应该启动一个新的"水沟",但我们仍在做一个"转化"。 这显然毫无意义。 到底发生了什么? 如果您能准确地判断采集和采样在我的方案中发生的时间/方式、那会很好。

    总之、我们将通过 PDB (可编程延迟块)驱动 NXP 芯片、该器件具有一个"延迟计时器"、可将其设置为在"xxxns"时间内启动内部 ADC 采样。 我正在尝试找到此延迟计时器的正确值来同步两个样本。

    为了实现这一点、我们的硬件团队(我是一名软件工程师)添加了一个 BNC 连接器、并且直接连接到 ADC 输入通道以馈入我的递增锯齿输入。 它们还断开了为 ADC 馈送真实信号的电路。 主要思路是将"延迟计时器"设置为100、获取内部 ADC 和 ADS7038的读数、查看哪个值最高、可指示这是后来的读数。 相应地调整计时器(如果是较晚的内部 ADC、则较低;如果是较晚的 ADS7038、则较高)。 重复测试并再次调整。 重复操作、直到两个读数大致相同(我意识到噪声意味着它们绝不相同、但足够接近)。

    在此测试期间、我的锯齿形读数达到了200至2800范围内的预期 ADC 读数。 调试时,我看到读数接近0 ,其他接近4095和其他约3000 ,所有这些都是意外的,超出范围,即错误。 自然,我确认,与另一个范围, 200..2800是什么是真正被送入我的卡. 这时、我得出了与 ADC 的问题。 自从继续这项调查,以及在这个论坛帖子,我显然没有考虑潜在的问题,测试线路添加到我们的卡。 我现在正在更新我们的生产卡代码、以记录"太低"和"太高"ADC 值、并馈入已知的静态值(真正读取的性质使实际复制锯齿非常困难)。 我将在没有修改过的接线的卡上运行此新代码、并查看我是否获得任何"太低"或"太高"值。 这应该能够确定原始测试布线是否是问题的罪魁祸首、这一直是红色错误(尽管我在此过程中学到了更多有关该 ADC 的知识)。

    我仍在等我们使用更短的电线和更好的连接器清理开发板设置的图片。 我们在现场确实有一些活动探头、我们可以在以后使用替换原有的示波器探头(它们目前正在由其他人使用)。

    我下面附上了4个示波器跟踪、这些跟踪显示了我们清理后的开发板上的一些有趣内容。 我们同样有迷你尖峰1、尝试由 MISO 上的 ADC 驱动。 但是、这一次发生在时钟的后沿之前。 缩放的屏幕截图清晰(?) 表明 MISO 首先被驱动、其他3个信号作为对 MISO 的响应振铃、但我是一个软件专家、而不是硬件工程师。

    谢谢

    Darren

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

    Darren、您好!

    无论何种用途、 t_CONV 只要 CS 处于高电平就持续、t_ACQ 只要 CS 处于低电平就持续。 为了实现1MSPS 的最大吞吐量(周期时间为1us)以及600ns 的最大 t_CONV、为 t_acq 留出400ns。 在这400ns 期间、器件编程命令必须发生24个时钟周期、因此每个时钟周期为16.666ns。 这相当于60MHz 的额定最大 SCLK 频率。  

    t_CONV 最大规格实际上说明了 CS 必须为高电平以便不会中断转换过程的最短时间:600ns。  

    [报价 userid="118486" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1400970/ads7038-erroneous-adc-values-being-returned/5371028 #5371028"]采集时间可编程、我使用 OSC_SEL=0、CLK_DIV=0每1us 提供一个样本("aquire"和"convert")。 由于 tCYCLE = tacq + tCONV 且 tCONV 固定为600ns、因此 tAQC = 400ns。 由于我在8MHz 上运行 SPI、因此发送单个命令需要3us。 因此、ADC 在第1条命令结束之前很久才"采集"样本。[/QUOT]

    我需要帮助理解上面的这一部分。 我认为这将有助于 阐明 OSC_SEL 和 CLK_DIV 字段实际上仅用于内部均值滤波器。 虽然不使用内部平均滤波器、一切都将由您在控制器提供的 SCLK 控制。 这里数据表中的措辞肯定会更清晰、我会确保在下一次数据表修订版中加以说明。

    本质上、我要说的是、您获得的采样率实际上并不依赖于 OSC_SEL 和 CLK_DIV 字段、而是依赖于提供的 SCLK 频率以及 CS 的上升和下降。 然后、实数 t_cycle 将与 CS 保持为高电平的时间(t_CONV)加上提供24个 SCLK 周期(t_ACQ)所需的时间之和。 还应注意的是、t_CONV 将固定为最大600ns (尽管只要 CS 为高电平、器件就不会进入采集状态)、但 t_acq 将根据 CS 保持低电平的时间而变化。  

    因此、我相信 问题是政务司司长的时间不够长。 确保它至少保持高电平600ns。 感谢您向我明确指出这一点、因为我在对屏幕像素进行一些粗略计算时错过了它。 短于600ns 的任何时间都可能中断转换阶段的完成、我认为这一过程正在发生。

    此致、
    Joel

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

    感谢您对采集和转换过程的澄清。 我在以下方面是否正确...

    • 在发送命令"写、寄存器、值"时、CS 为低电平、因此采集当前所选通道。 只要命令被传送、该采集就需要一段时间。 因此、在本例中、在8MHz、采集需要(3us +从 CS 低电平到发送第一个位的延迟+从发送最后一位到 CS 高电平的延迟)。
    • 在命令结束时、CS 设置为高电平、必须保持高电平至少600ns。
    • 在下一条命令中、ADC 输出在传输"写入、寄存器、值"时获取的读数。

    总而言之

    • 要使用单个通道(已由 WRITE、CHANNEL_SEL、CHANNEL 定义)、序列将是
      • 1) 1)写入寄存器值
      • 2) 2)写入寄存器2值2
      • 第二条消息的返回值将是从先前定义的单个通道的第一条消息的开头开始获取的 ADC 值
      • REGISTER 和 REGISTER-2可以是具有单个通道的 CHANNEL_SEL、但两条命令都不需要成为该寄存器
    • 要使用序列所需的多个通道
      • 1) 1)写入、CHANNEL_SEL 和 NEW_CHANNEL
      • 2) 2)写入寄存器值
      • 3) 3)写入寄存器2、值2
      • 第3条消息的返回值将是从新通道的第2条消息的开头开始获取的 ADC 值

    我将 DBT (传输间的延迟、即 CS 处于高电平的最小时间)的单个设置从250ns 更改为600ns、而读数不再出现故障。 我重置回250ns 且读数失败。 这可能是我的主要问题。 我从其他人那里继承了初始化代码 。 我似乎无意中将其锁存到 OSC_SEL 和 CLK_DIV 上、但我知道我们正在尝试尽快驱动读数。 继承的代码将 OPMODE_CFG 寄存器设置为0、没有注释来描述每个位的原因、例如注释"OSC_SEL =无关(未使用均值计算模式)"可能很有用。 我试着说为什么每个位都按原样设置、尤其是在"无关"值上。

    读取失败是指超出我的锯齿输入预期范围的 ADC 值。

    然后作为快速测试、我将 DBT 设置为75ns、因为、如果250ns 太快(需要600ns)、则75ns 会更快(语法不佳、但你明白了)。

    奇怪的是、这个价值还不错! 我发现许多其他小 DBT 设置都起作用。 有8个连续的 DBT 值失败(17..24)我的继承值 DBT = 18是其中之一! 这些值等于"( + 2)* 12.5ns [SPI 输入时钟= 80 MHz、即1个时钟周期= 12.5ns]"、因此 CS 在任意位置为237.5ns..325ns 的高电平。 这两个方面的值似乎都起作用(无失败的读数)。

    然后、我将锯齿形电压更改为电平电压。 有趣的是、所有3个设置(75ns、250ns、600ns)都可行。

    我想说为什么有时候我们得到的答案是无效的、因为 ADC 正在执行中途检查、即 (输入< AVDD / 2)并相应地设置第11位、然后检查(输入 < AVDD / 4)并相应地设置 第10位(输入< AVDD / 8)、并设置第9位、依此类推。 这是用于检查是否转换0V 输入、其他值会下降不同的电阻梯序列。  我认为我的措辞不正确、但我想您理解我在这里的意思。 无论如何、对于250ns 延迟(转换时间)、我想 ADC 已经正确地计算了第一个的值 但是、由于 CS 现在为低电平、它必须通过 SPI 返回一个值、以便它返回 新读数的剩余位和旧读数的剩余位、一个半新值、半旧值。 这就是为什么我认为电平电压输入(而不是锯齿波)在所有情况下都有效的原因、因为半旧位与前一个样本相同、但在锯齿波中快速变化的位时、这种二分之一的问题会显现出来。 这是为什么? 最后、我们需要坚持到600ns 才能中断这个转换过程、但我很好奇地想找出250ns 起作用的原因 最多 导通时间越来越短。 我们是否在错误的时间中断它、并且其他(仍然太早)时间没问题?

    我想我们可能就要结束这个问题了。

    现在、我已经从继承的代码更改了以下内容

    • SPI 输入时钟从40MHz 更改为80MHz 以满足45:55占空比要求(40MHz 提供3:2的占空比[3高、2低@ 25ns]、80MHz 提供1:1的占空比[5高、5低@ 12.5ns])。
    • 将 DBT 从250ns 更改为了600ns
    • 打开报告通道编号(append_status = 01b)、因为我可以、我始终可以确认我们是否在读取通道3

    我会将类似的范围检查代码添加到我们的生产卡、并进行浸泡测试、看看这些是否可以解决我的问题。 我还将告知其他项目(看到随机0值)占空比和600ns 要求。

    我下星期要休假约一个月、所以我可能不会回应进一步的意见、但我有一些同事会留意这条线。

    希望我能够将它标记为已解决。

    Darren

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

    Darren、您好!

    我想您已经清楚地了解了这款器件!  

    需要注意的是、当对器件进行编程以切换到不同的通道时、该通道的数据将在之后的2个转换周期内输出。 参见下图。 因此、从技术上讲、2个周期之前选择的通道目前是在 SDO 上输出的。 您已经理解了这一点、但我只想向您提供描述这一点的直观视图。  

    有趣的是、75ns 的 CS 仍然可以正常工作。 有必要调查此接口是否包含不得中断的关键时序部分、以及缩短转换短路的特定程度的误差。 我认为你的理由似乎是有道理的。 如果转换过程在临界区之前暂停、逐次逼近寄存器可能会维持之前的转换、或改变其中的某些部分。 但如果在关键段期间停止、则在丢弃前一次转换后、可能会产生完全错误的结果。 我还想确定 MISO 尖峰的原因是什么。

    以上问题的答案可能来自我的专业知识领域,但我也对这种解释非常感兴趣。 或许设计团队的某个人可以对此提供一些说明。 我希望这个建议能够解决这个问题!  

    此致、
    Joel

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

    器件型号:ADS7038

    工具与软件:

    这是 https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1400970/ads7038-erroneous-adc-values-being-returned 主题的附录

    我在度假时、另一位工程师拿到了我的代码、结果表明、一旦我们将 ADC 配置更改为使用、我们就不会再出现问题

    • 时钟上的50:50占空比(我们最初有40:60)–尽管我怀疑这是导致我们问题的真正原因
    • 传输之间的延迟设置为600ns (一条24字节消息结束到下一条[开始到开始]开始)。 您的数据表显示两者之间只需要600ns 延迟 启动 一条24字节消息的开头和另一条[开始至开始]的开头、但我们的 SPI 寄存器设置使用[结束至开始]、因此我们将此设置保持简单。 使用这种端到端的方法只是浪费了一点时间、但在我们的案例中这并不重要、它很容易表明我们满足了600ns 的最短时间要求。

    虽然数据表中提到了所有的时序、但我想说的是、我发现数据表很难理解、当然可以整理一下。

    这意味着螺纹可以标记为已求解

    Darren