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读取8个通道问题

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

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/920656/ads1256-reading-8-channels-problem

器件型号:ADS1256

你好!

我设法在 ADS1256的一个通道(AINCOm=GND)上读取0-5V 电压。

现在、我想循环浏览所有8个通道。 我有一个问题、就是在用新通道更新 MUX 寄存器后、从 ADS1256读取的第一个值总是错误的。

即使在启动第一个 AIN0通道时也会发生这种情况。 当我仅在一个通道上测量时、这并不重要。 我只想忽略。 但现在这使我感到麻烦。

我需要每通道应用程序100sps、因此我将 DRATE 寄存器值设置为0xA1 (每通道1000sps/8通道=125sps)。

因此、如果我在每个通道上循环两次(因为我必须忽略第一次读数)、我将降低采样速度。

在数据表中、第一个值应该是 OK。 但在我看来,这不是…

从 ADS1256读取数据的过程:(这不是确切的代码)。

对于环路(对0到7的通道进行计数){

--------------------------------------

正在等待数据就绪干针变低

--------------------------------------

我要读取多路复用器寄存器的通道

SPI.transfer (0x51);// MUX 寄存器
SPI.transfer (0x00);  //第二个命令字节、只写入一个寄存器
spi.transfer (data);  //将数据字节写入寄存器
delayMicroseconds (10);

----------------------------------------

正在发送 SYNC 命令

 SPI.transfer (0xFC);
 delayMicroseconds (10);

----------------------------------------

Senging 唤醒命令

 SPI.transfer (0x00);
 delayMicroseconds (10);

--------------------------------------

从 ADS1256读取数据

 SPI.transfer (0x01);//读取数据0000 0001 (01h)
 delayMicroseconds (10);
 ADC_val = SPI.transfer (0);
 ADC_val <= 8;//向左移位
 adc_val |= spi.transfer (0);
 ADC_val <<= 8;
 adc_val |= spi.transfer (0);
 delayMicroseconds (10);

 spi.endTransaction();

}... 结束

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

    您好、Frank、

    您要为您的系统使用什么主 CLK 频率?

    在通道间循环时、您是否对每个输入施加5V 电压

    布莱恩

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

    大家好、Bryan!

    我使用的是7.86MHz 晶体。

    此时、我只有 AIN0连接到我的校准后的5V 信号。 所有其他7个输入都是"空中"输入。

    以下是我在开始读取模拟输入之前对 ADS 的初始化(可能有助于此信息):

    //重置为加电值(FEH)
     SPI.transfer (0xFE);  
     delayMicroseconds (10);

    ----------------------

     SPI.transfer (0x50);//第一个命令字节0101 0000 = 0x00h 状态寄存器
     SPI.transfer (0x00);  //第二个命令字节、只写入一个寄存器
     spi.transfer (0x00);  //将数据字节000000000写入寄存器、禁用缓冲区
     delayMicroseconds (10);

    --------------------------
     SPI.transfer (0x52);//第一个命令字节0101 0010 = 0x02h ADCON
     SPI.transfer (0x00);  //第二个命令字节、只写入一个寄存器
     SPI.transfer (0x20);  // 0 01 00 000 =>时钟输出频率= fCLKIN、传感器检测关闭、增益1
     delayMicroseconds (10);

    ------------------------------

     SPI.transfer (0x53);//第一个命令字节0101 0011 = 0x03h DRATE 寄存器
     SPI.transfer (0x00);//第二个命令字节、0000 0000写入一个字节
     spi.transfer (drate_data);  //写入"Samling speed"变量
     delayMicroseconds (10);

    ------------------------------

     SPI.transfer (0xF0);//自校准
     延迟(2000);在2.5SPS 时为//1227ms 最小值

    我希望我已经写下了您需要的所有信息。

    谢谢你。

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

    您好、Frank、

    如果其他7x 通道是浮动的、您如何知道它们应该稳定在什么值? 或者、换句话说、您如何知道第一个样本"错误"? 理论上、未连接的输入可以在电源之间具有任何值。

    您能否发送一个显示通信线路的逻辑分析仪快照、以便我们可以查看您发出的命令、DRDY 的输出、您接收到的数据、并确保时序正确? 如果不能看到您正在做什么、就很难知道正在发生什么。 在您的代码中没有任何错误会跳出来、至少在您发布的内容中可以看到。

    布莱恩

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

    大家好、Bryan!

    现在我连接了 AIN1-AIN7 TI GND。

    AIN0至校准后的5V 信号。

    我将循环所有8个模拟输入。

    实际上、现在我无法从 AIN0读取/获取数据。

    我稍微更改 了 acode、代码部分循环两次(等待 RDY、写入 AIN 我要读取、同步和唤醒的多路复用器)

    它会发生变化。 但令人遗憾的是、我仍然无法获得完整的采样速度、但会降低一点(我可以忍受这种情况、但无论如何、如果拥有此功能、我希望清除问题)。

    我循环两次的代码:

    对于(字节 k = 0;k <= 1;k++){//必须执行两次!!!
       while (digitalRead (rdy)){
       //Serial.println(".");
       };
     SPI.transfer (0x51);// MUX 寄存器
     SPI.transfer (0x00);  //第二个命令字节、只写入一个寄存器
     spi.transfer (data);  //将数据字节写入寄存器
     delayMicroseconds (10);

     //sync 命令1111 1100 (FCh)
     SPI.transfer (0xFC);
     delayMicroseconds (10);
     
     
     //WAKEUP 0000 0000 (00h)
     SPI.transfer (0x00);
     delayMicroseconds (10);
     }//循环结束

    遗憾的是、我没有逻辑分析仪。 嗯...

    编辑:

    以下是我读取 AIN0 (连接的5V 校准信号)时得到的结果。 值为十六进制(我认为是十六进制值...) 如果我没有对代码进行两次粘附:

    7F6F13.
    14 BB
    14C0
    14B7.
    14C2
    14 BB
    14B2
    14B3
    14BC
    14B0
    14B1
    14B2
    14B0
    14 AF
    14BA
    14 AB
    14交流
    14B3

    如果我循环执行代码两次、我将得到以下结果:

    7F8578
    7F855B
    7F853E
    7F8699
    7F86C3
    7F8616
    7F86C0
    7F8672
    7F8776
    7F871C
    7F85DB
    7F8620
    7F8587
    7F85AB
    7F84F7
    7F8591
    7F8544
    7F84E7

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

    您好、Frank、

    您的 SCLK 速度是多少?

    从您之前的帖子中可以看到情况有所改善、但您仍然没有获得全速-这是正确的吗? 您是否通过 DRDY 脉冲之间的时序来确定器件的速度?

    布莱恩

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

    大家好、Bryan。

    我希望我理解正确、您要求我的 SPI 速度设置:1.25Mhz。

    如何确定器件的速度:我在计算在时间间隔内得到的结果数:

    在数据速率0x82 (每通道100SPS/8=12.5SPS)时、我将在10秒内获得62个样本=6.2SPS/通道、而不是12.5SPS

    如果我删除两次代码循环、我将在10秒内获得125个样本= 12.5SPS。 因此存在差异。 但不幸的是、我无法使用这些数据

    无论我将信号从0更改为5V、我们都能在一个值上保持不变...

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

    谢谢 Frank

    在您之前发送的数据中、您只是反复读取单个差分通道(AIN0和 AINCOM)、对吧? 您能否发送用于仅进行一次测量的实际代码序列?

    您是否使用 DRDY 来确定何时有新数据可用? 您应该能够通过 DRDY 变为低电平到下一个 DRDY 变为低电平之间的时间来确定数据速率。 您可以使用示波器通过探测 DRDY 来实现此目的。

    我真的认为您需要回顾与示波器的通信、因为听起来设备未正确读取您的命令。 这可能是由于多种原因造成的、如果不能查看通信过程、则很难进行诊断。

    布莱恩

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

    大家好、Bryan!

    不、不是 Exactelly。

    我正在循环浏览全部8个输入通道、但我仅打印 AIN0值。

    如果我将代码设置为仅读取 AIN0 (0x08)、那么我没有问题。 第一个情人节值得一去,但后来一切都好

    采样速度正常... 第一个值除外。

    但是对于我的应用、我需要尽快读取8个输入通道...

    您可以看到上面的代码。 其中包括:

    "等待数据就绪干针变低"

    此时、我正在等待正确的 DRDY。

    好的。 我将测量 DRDY 时间间隔

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

    我测量了 DRDY 时间间隔。

    它显示 ME 97.75Hz=0.01023s。

    它在极短的时间内从5V 变为0V、并在0.01023秒的时间间隔内上升到5V。 然后保持5V 直至下一个间隔。

    数据速率设置为100SPS。

    然后、我将数据速率更改为500SPS、并显示 ME 448Hz=0.00223s。

    但我仍然没有得到正确的模拟值。 它保持在大约1658 (十六进制)、但我输入的是5V……

    第一个值为7F6FB9 (十六进制)、但之后的所有值均为 app 1658 (十六进制)。

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

    您好、Frank、

    您所描述的时序与表14中显示的多路复用器在100SPS (98Hz)下趋稳的时序相匹配。 但您的问题是、您没有在该时间间隔内获得正确的数据?

    您是将输出数据发送到控制器中的缓冲区、还是仍在使用 printf 语句获取数据?

    布莱恩

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

    大家好、Bryan。

    采样速度正常、但我无法获得正确的数据、正如您从上面的数据中看到的... 仅当我在同一输入通道上循环两次时、第二次读取正常。 但是、我会降低采样速度...

    首先、我将循环遍历所有8个输入通道、并将值写入8个不同变量。 在我循环所有8个通道后、我打印值。

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

    您好、Frank、

    我建议用示波器花些时间来验证 DIN 和 DOUT 上的值是否与您从 ADC 读取和写入的值相匹配。 您的波形和时序应与图19所示相匹配。 这是逻辑分析仪肯定会让事情变得更轻松的地方、但它可以通过示波器来实现。

    如果您可以同时探测 DOUT 和 DRDY、这将是一个有用的图像。 尝试使用和不使用环路、以查看是否存在任何差异。 如果您能在此处分享这些图片、我会不胜感激。

    布莱恩

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

    你好!

    我有两个通道示波器。 我想我可以管理这一点。

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

    你好!

    我在这里附加图片。 我没有看到任何区别…

    红色图表示 DRY 引脚、蓝色表示 DOUT 引脚。

    值正常时的屏幕(两次循环-每个通道的读数):

    屏幕在不正常时显示(仅从频道读取一次):

    数据速率设置为5SPS。

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

    您好、Frank、

    说实话、这两张图片看起来完全相同、因为其中一张只是另一张图片的副本。 您是否有机会发布相同的图像两次?

    如果不是、则两个波形之间显然没有差异、并且环路似乎没有执行任何操作。 我想这是个好消息、因为它排除了这一点。

    我建议一起查看 DIN 和 DOUT、以确保满足所有时序规格。 我还想知道 DOUT 线为什么会在该示波器镜头中下降。 SPI 线路上是否有电阻/电容?

    布莱恩

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

    你好!

    我将制作新的屏幕快照 100%确定。 请给我几分钟。 我会回来的。

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

    测量值正常时的屏幕截图。

    测量值不正常时的屏幕截图。

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

    你好!

    红线是 Din、蓝线是 dout:

    测量数据正常时的屏幕(每个通道两次循环):

    测量数据 不正常时的屏幕(每个通道无循环):

    嗯、我认为 Din 数据应该在 dout 之前、而不是在同一时间。 如果我对每个周期重复两次、那么第二次尝试将是合理的。

    但我不知道为什么会发生这种情况… 我将尝试增加(MUX、SYNC、WAKEUP 语句组)和 READ 语句之间的暂停...

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

    您好、Frank、

    在最后一组图像中、您的 DIN 线在 DOUT 线为3V 时使用5V 逻辑电平(因为它们在示波器上都处于相同的2V 刻度上)。 是这样吗? 这肯定会导致问题、因为器件期望逻辑电平为3V、并且可能无法正确解释5V 逻辑。

    不过、无论在哪种情况下、数据都是相同的、可能接近满量程读数。 这似乎与您从系统获取和存储数据的方式有关。

    布莱恩

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

    嗯。 它可能是这样。 我正在使用具有5V 逻辑的微控制器...

    编辑:

    我已查看 ADS1256的用户手册。 其中说明 ADS1256可耐受5V ISP

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

    您好、Frank、

    是的、ADS1256可耐受5V 电压、但您为 DVDD 提供3.3V 电压。 当逻辑电平不同时、这肯定会导致问题。

    您可以对 ADS1256上的 DVDD 施加5V 电压、或使用电平转换器确保 MCU 和 ADC 的 IO 逻辑电平相同。

    我还同意、如果您遵循图19所示的命令模式、则不应同时看到 DOUT 和 DIN 上的数据。 当您运行循环两次时、这可能是合理的、但当您只运行循环一次时、情况不应如此。

    布莱恩

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

    大家好、Bryan。

    在我制作电压转换器之前、我制作了一个读取全部8个通道的屏幕截图。

    AIN0连接到5V 所有其他通道连接到 GND。

    可以看出、在第一次迭代中、ADS1256为 AIN0和 AIN1通道发送5V 电压值。

    在下一个迭代中、尽管 AIN1物理连接到 GND、但仍会以各种方式显示。

    剂量这与您在上面提到的相同、或者您可以看到其他东西吗?

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

    您好、Frank、

    您确定不是仅在初始读取 AIN0两次? 因此、如果8356xxx 值都是 AIN0、这是有道理的、因为这接近于满量程、其余7个值都是 AIN1-AIN7、它们都接近 GND。

    这里的挑战是了解 ADC 解码了哪些命令以及何时解码了这些命令。 仅仅查看输出数据并不能告诉您太多信息、因为您无法确定每个数据点对应的通道。 但是、假设满量程值与 AIN0相对应、在输入条件下、数据看起来对我有效。

    您能否对其他通道施加测试电压、以查看满量程读数是否随通道变化而变化? 或者向 AIN0施加5V 电压、向 AIN1施加2.5V 电压、看看会发生什么情况?

    布莱恩

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

    首先、我要将 DVDD 连接到+5V。 您确定我无法刻录什么内容吗?

    在用户手册中、它被写入数字电源1.8至3.6V。

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

    您好、Frank、

    抱歉、我一次做了太多事情。 是的、请保持3V 电源、因为现在您可以按原样使用电路(MCU 上的5V 逻辑、ADC 上的3V 逻辑)。

    但是、请尝试我建议的其他输入测试。

    布莱恩

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

    我将5V 信号分别施加到全部8个通道上。 结果始终向左移动一个位置。

    如果我向 AIN0施加5V 电压、我会在第2位而不是第1位看到结果。 如果我向 AIN1施加5V 电压、我会在第三位而不是第二位...看到结果

    如果 我施加2.5V 电压、我会看到"Values"应用。 4174880。

    最后、我可以忍受这种情况、我只需将结果向右移动一个位置、就可以了。 不会降低采样速度(每个通道无需第二次循环)。

    我有另一个问题、但我不知道我应该打开一个新话题、还是留在这个话题上。

    它是关于精度的。

    如您所见、我正在应用5V 校准信号。 我使用的是具有2.5V +/- 1mV 的高精度2.5V 电压基准 ADR431B。

    我希望值更接近8388607。 测量值与理论值之间的差值是应用值。 37897。您对此有何看法?

    如果您还记得(查看上面的代码)、我会在开始读取之前执行自校准。

    当我将输入端口连接到 GND 时、偶数值对于我来说似乎太高(app 6000)。

    您对此有何看法?

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

    您好、Frank、

    您是否仍然为该数据运行循环两次? 或者、您是否移除了循环、以便这些命令现在只运行一次?

    布莱恩

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

    我移除环路。 因此、我现在只读取通道一次。

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

    谢谢 Frank、那么这个问题似乎已经解决了、对吧?

    如果是、您能否在单独的主题中提出精度问题? 这样、如果其他人有相同的问题、他们将能够导航到正确的主题。

    布莱恩

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

    我将这样做。 对我来说、这是可以的。

    好的。 我将打开一个新线程。