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.

[参考译文] ADS1262:未保存INPMUX寄存器

Guru**** 664280 points
Other Parts Discussed in Thread: ADS1261, ADS1262, TIPD188, TPS7A94
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1095248/ads1262-inpmux-register-are-not-saved

部件号:ADS1262
主题中讨论的其他部件:ADS1261,, TIPD188TPS7A94

大家好,

由于芯片短缺,我无法获取任何ADS1261 (如果您有秘密库存,请告诉我,我正在寻找QTY10)。

所以我尝试使用ADS1262。 它非常相似,但我使用的库稍有不同。 我使用 的是TIPD188示例中的lib。

通信工作正常,当我尝试读取以注册接口(0x20+0x02)时,我收到0x05默认值:

现在我想配置pin和引用mux来测量我的loadcell,但我注意到当我写入INPMUX寄存器时,该值没有保存:

我用MUXP_AIN1(0x10)| MUXN_AIN2(0x02)写,然后读我的While循环中的寄存器:

如果我 只写一次,而不是读0x12,我将读取默认值0x01

现在,如果我写了两次,我读了正确的值0x12:

我真的不理解数据表第87页中的说法:Mode2和INPMUX寄存器已修改。 通常,寄存器更改在写入数据后立即生效。 但是,如果寄存器是组的一部分,则只有在写入块中的已分组寄存器的所有数据均已发送之后,才会写入数据。

这意味着我需要在所有Group1寄存器中写入数据才能保存它?

那么为什么要在寄存器中写两次?

谢谢你

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

    您好,Hal,

    只是为了澄清,寄存器“分组”只是将该组中的寄存器更新延迟到您在执行多寄存器写入时完成对该组中所有寄存器的写入之后。 原因是如果您要增加PGA增益并同时切换MUX通道,否则,如果Mode2寄存器在INPMUX寄存器之前更新,您可能会暂时超出PGA范围。 而是对这些寄存器进行分组,以便在您完成了对两个寄存器的数据计时后,按顺序(在多寄存器写入命令期间)写入这两个寄存器才会生效。 但是,如果一次只写入一个寄存器,则寄存器将在完成WREG命令后立即更新,这可能是您所期望的。

    因此,此问题与分组无关。

    在DIN和SCLK信号上有很多过冲,我可以说是在0.5V和1V之间。 您是否能够完全清除此信号? 我不确定您是否会在如此嘈杂的输入中获得非常好的结果。

    您可以尝试启用CRC,然后在启用CRC的情况下回读读取的值。 这可以帮助您根据发送到ADC的内容以及ADC返回的数据确定正在进行的操作。

    此外,这是否发生在任何其他寄存器上? 您说这似乎对接口寄存器起作用,尽管这只是读回默认值(读回INPMUX寄存器时就是这种情况)。 您是否可以在向其它寄存器写入数据之前和之后测试这些寄存器以查看发生了什么情况?

    -Bryan

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

    您好,Bryan,感谢您的支持。

    实际上,这是C2000上SPI的问题,而不是ADS1262。 由于某种原因,我第一次在SPI上写入/读取时没有发生任何事情。

    现在,我只需要在第一次执行虚拟写入/读取。 然后,我可以看到我写入和读取的所有消息都正常。

    现在,我使用ADS1262进行了更多的挖掘,并且在读取过程中遇到了一些峰值。

    我配置寄存器的方式与我将REF mux设置为 RMUXP_INTP和 RMUXP_INTN,然后使用 MUXN_AVSS读取MUXP_AVDD的示例基本相同:

    //setSTART(1);
        /*********DUMMY READ********/
        ADS126xSendResetCommand(); // dummy stuff to set the SPI
    
        //LoadInitRegSettings();
    
        //ADS126xReadRegister(POWER, 1, resultData);
        /**************************/
    
        //MODE0 (CHOP OFF)
        config[0] = (AdcRegData[MODE0] & DELAY_MASK);
        ADS126xWriteRegister(MODE0, 1, config);
    
        //MODE2 (BYPASS OFF, GAIN = 1 V/V, )
        config[0] = 0x04;//(AdcRegData[MODE2] & DR_MASK);
        ADS126xWriteRegister(MODE2, 1, config);
    
        //Reset OFCAL coefficients
        config[0] = 0x00;
        ADS126xWriteRegister(OFCAL2, 1, config);     //OFCAL2 = 0x00
        config[0] = 0x00;
        ADS126xWriteRegister(OFCAL1, 1, config);     //OFCAL1 = 0x00
        config[0] = 0x00;
        ADS126xWriteRegister(OFCAL0, 1, config);     //OFCAL0 = 0x00
    
        //Reset FSCAL coefficients
        config[0] = 0x40;
        ADS126xWriteRegister(FSCAL2, 1, config);     //FSCAL2 = 0x40
        config[0] = 0x00;
        ADS126xWriteRegister(FSCAL1, 1, config);     //FSCAL1 = 0x00
        config[0] = 0x00;
        ADS126xWriteRegister(FSCAL0, 1, config);     //FSCAL0 = 0x00
    
        //INPMUX (AINP = AIN0, AINN = AIN3)
        config[0] = MUXP_AVDD | MUXN_AVSS;
        ADS126xWriteRegister(INPMUX, 1, config);
    
        //REFMUX
        config[0] = RMUXP_INTP | RMUXN_INTN;
        ADS126xWriteRegister(REFMUX, 1, config);
    
        config[0] = STATUS|CRC_OFF; //0x04
        ADS126xWriteRegister(INTERFACE, 1, config);
    
        while(1){
    
            set_adc_START(1);
            DEVICE_DELAY_US(500);
    //        result = ADS126xReadData(5, 1);
            result = ADS126xReadData(5, 1);
            VoltageReading = (double) result * IntRefVolt / ((double) Gain * exp2(29)); //2^29 to account for 1/4 supply & 1/2 FSR
            SupplyRefVolt = VoltageReading;
            ReadingmV = (int)(SupplyRefVolt*1000);
    
            if ((SupplyRefVolt>6.0))
            {
                GPIO_togglePin(LED_31);  //LED OFF
            }
        }

    我用数字万用表读取AVDD并测量5.125V (+/- 1uV),相当稳定。

    现在,如果在调试模式下,我看一下SupplyRefVolt,结果是5.1258V,但我也有峰值。

    我也可以在SPI上看到这些峰值。

    第一个问题,在我的示例中,数据速率默认为20SPS,当我以1.6KHz读取寄存器时会发生什么情况? 在写入新值之前(每50毫秒),我应该会读取相同的值。

    第二个问题,当数据良好时,状态字节为0x41,我测量5.125V。 当我看到这些峰值时,状态字节是垃圾:

    状态字节I接收:0x86,0x46,0xA3,0x14,0xB1

    我觉得我收到了不应该接收的内容,但在配置过程 中,我确保禁用CRC并启用状态。

    我的配置有什么问题吗?

    谢谢你

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

    您好,Hal,

    您如何知道何时可以从ADC检索数据? 我看不到任何对监控DRDY的函数的调用。 您是否正在检索状态字节以了解新数据何时可用?

    如果使用直接读取数据模式,则发送附加SCLK将持续检索ADC输出移位寄存器中的任何数据。 此数据不应在转换期间之间更改,仅应在每个转换期间完成后更改。 因此,如果在同一转换期间多次读取数据,每次读取的结果应该完全相同。

    正如您在前面的示波器捕获中所指出的,您的数字信号上似乎有大量噪音。 我不确定这是否是您所看到的问题的原因,但这肯定是应该解决的问题。 我还建议使用逻辑分析器来查看数据输出,以便更好地了解ADC实际提供的内容。 您提到您之前的问题与C2000操作有关,因此这些新问题肯定也可能是处理器的结果。

    -Bryan

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

    您好,Bryan:

    我补充说

    while(GPIO_readPin(ADS_DRDY_74)); //wait fopr DRDY to go low

    在阅读数据寄存器之前,现在非常感谢

    我 现在很困惑 ,我如何能够使用2.5V内部电压参考读取AVDD (5V)的电压 通常 在增益=1且参考mux =内部2.5V的情况下,全刻度范围是+/-2.5V,但我能够读取我的5.12V电源:

            set_adc_START(0);
            DEVICE_DELAY_US(100);
            config[0] = MUXP_AVDD | MUXN_AVSS;
            ADS126xWriteRegister(INPMUX, 1, config);
            config[0] = RMUXP_INTP | RMUXN_INTN;
            ADS126xWriteRegister(REFMUX, 1, config);
            config[0] = 0x09;//(AdcRegData[MODE2] & DR_MASK);
            ADS126xWriteRegister(MODE2, 1, config);
            set_adc_START(1);
            result4 = ADS126xReadData(5, 1);

    除此之外,我按以下方式连接了测压元件:

    使用内部参考电压2.5V读取AIN1和AIN2,以获得更大的范围:

            set_adc_START(0);
            DEVICE_DELAY_US(100);
            config[0] = MUXP_AIN1 | MUXN_AIN2;
            ADS126xWriteRegister(INPMUX, 1, config);
            //config[0] = RMUXP_AIN0 | RMUXN_AIN3;
            config[0] = RMUXP_INTP | RMUXN_INTN;
            ADS126xWriteRegister(REFMUX, 1, config);
            config[0] = 0x59;//(AdcRegData[MODE2] & DR_MASK);
            ADS126xWriteRegister(MODE2, 1, config);
            set_adc_START(1);
            while(GPIO_readPin(ADS_DRDY_74)); //wait fopr DRDY to go low
            result = ADS126xReadData(5, 1);

    信号噪音很大,约 (450万-3500000)350万)= 100万计数:

    对于 负载单元的整个范围(压缩+张力),我有大约 1.6亿个计数。 这会产生 大约(450万-3500000)*100/160000000= <xmt-block0>350万 0.625 %1.6亿 0.625 % 噪声。

    将Vref从INTERNAL (内部参考)更改为AIN0 (AIN0)和AIN3 (AIN3)会产生几乎相同的结果:

    大约 (220万-1700000)170万)= 50万次噪声, 负载 传感器的全范围(压缩+张力)我有大约800万次计数,相同的比例信号/噪声。

    因此,根据我的理解,我应该继续使用内部Vref,至少我有更多的分辨率。 您是否对实现更好的阅读有任何想法? 我已尽最大努力完成了布局,并遵循了设计指南。

    在我的主板上,负载单元的激励来自为主板其余部分AVDD=DVDD供电的切换DC/DC 5V。 该信号具有噪声,并与SPI (约430mV Vp-p)结合使用,您认为具有低噪声LDO 5V会提高我可以获得的性能吗?

      

    我计划使用专用的超低噪声LDO (LT3045):

    之后,我想在 ADS1206上连接3个测压元件。 它们将具有相同的激励和 参考,您是否认为有任何问题?
    e2e.ti.com/.../ADS1262.pdf

    请注意,如果我想在将来实施交流激励,我将安装UCC2.7524万DR驱动程序。

    最后一个问题, 对时钟,内部振荡器,外部时钟 或外部晶体的选择有何影响。  我在数据表中找不到添加外部晶体的合理性。 什么是增益,更好的性能?

    谢谢你

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

    您好,Hal,

    以下是您的问题的答案:

    我406.4207万我如何能够使用2.5V内部电压读取AVDD (5V)的电压[/引用]

    电源回读电压除以4,因此始终应为~1.25V。 这就是您能够使用内部2.5V VREF读取电源电压的原因,也是增益必须为1的原因。

    您406.4207万您是否有任何想法来实现更好的阅读效果?

    请看我的下一个答案

    该406.4207万该信号噪声很大,加上SPI (大约4305V Vp-p),您认为降噪可以提高性能吗[]

    100 % 是,请添加低噪声LDO以清除开关电源输出。 同时确保开关电源不在敏感模拟或数字ADC迹线附近或交叉处/下方,因此它不会与这些线路耦合并降低性能。 这可能是导致SCLK和其他数字线路上出现噪音峰值的原因

    我406.4207万我正在计划使用专用的超低噪声LDO (LT3045)

    我还将向您指出TI的新型低噪声LDO系列:TPS7A94。 与LT相比,这些LDO可提供~Ω 50 % 的低噪声。

    之后406.4207万之后,我想在 ADS1206上连接3个负载单元。 它们将具有相同的激励和 引用,您是否认为有任何问题?[/QUOT]

    它们是否会并行连接,然后在此处使用单独的差分ADC模拟输入测量每个桥的差分输出? 我看不出来有任何问题。 有关测量多个测力元件的详细信息,请参阅我们的全面的桥接测量指南: https://www.ti.com/lit/pdf/sbaa532

    最后406.4207万最后一个问题, 对时钟,内部振荡器,外部时钟 或外部晶体的选择有何影响[/报价]。

    内部振荡器适用于大多数应用。 我肯定会推荐它用于桥接测量。 如果您想要将输出数据速率调整为标称值以外的值,或者希望拥有更高精度的时钟源,则可能需要外部时钟。 在您的情况下,这可能无关紧要,内部振荡器就足够了。 对于通常使用离散晶体的旧系统,晶体输入实际上是一种传统选项。 我认为这些产品已不再被广泛使用,而且我们的许多最新ADC都不提供这种选项。 例如,ADS1261不提供晶体输入。

    -Bryan

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

    非常感谢您帮助Bryan。

    它们是否会并行连接,然后在此处使用单独的差分ADC模拟输入测量每个桥的差分输出? 我看不出来有任何问题。

    是的,它们是:  

    我将查看 桥接测量指南和 TPS7A94,以便稍后实施,但现在似乎已经缺货了。

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

    您好,Hal,

    感谢您的澄清,这应该是好的。

    是的,很遗憾,很多东西都缺货了。 我想这就是这条线的开始! 因此,也许可以考虑将来的项目使用TPS7A94。

    -Bryan