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.

[参考译文] ADS1115:使用#39;alert/rdy 和#39在单次模式下工作时出现问题;引脚和输入接地或未连接。

Guru**** 2553450 points
Other Parts Discussed in Thread: ADS1115

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/750780/ads1115-problem-when-working-in-single-shot-mode-using-alert-rdy-pin-and-input-is-connected-to-ground-or-not-connected

器件型号:ADS1115

你(们)好

我正在开发自己的使用 ADS1115的器件。 我使用的是连接 、如下图所示。 我按如下方式配置 ADS1115:

adcInitConf.compQue = COMP_QUE_ONE;
adcInitConf.compLat = COMP_LAT_ENABLE;
adcInitConf.compPol = COMP_POL_HIGH;
adcInitConf.compMode = COMP_MODE_带 迟滞;
adcInitConf.dr = DR_128_SPS;
adcInitConf.mode = mode_single_shot;
adcInitConf.PGA = PGA_6_1;
adcInitConf.mux = MUX_0_G;
adcInitConf.osWrite = OS_WRITE_BEGIN;

我正在等待'alert/rdy '引脚为高电平并从 ADC 读取值。 它工作正常、但如果 ADS1115输入未连接或未连接到接地 ADC、则不会设置'alert/rdy '引脚。  在本例中、我希望得到零值。

有什么想法吗?  是否需要任何其他信息?

非常感谢、

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


    出于好奇、您将 HI_THRESH 寄存器和 Lo_THRESH 寄存器设置为什么? 通过将 HI_THRESH 寄存器 MSB 设置为1、将 LO_THRESH 寄存器 MSB 设置为0 (MS 位)、ALERT/RDY 引脚的转换准备就绪功能被启用。 这与比较器模式类似、不同之处在于在这种情况下、每次转换都会触发警报。 此外、应将 COMP_QUE 设置为00以在一次转换后生效(现在您已将其列为 COMP_QUE_ONE、这可能是正确的)。

    如果这种情况不会出现、那么您从未连接输入的 ADC 获得了哪些输出数据、而您只是进行正常读取? 对于 R1、R3、R6和 R7、您应该将输入拉至接地、并且您应该只读出0000h。


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

    我是否需要设置为 HI_THRESH 寄存器:1111 1111 1111、和 Lo_THRESH 寄存器:0000 0000 0000 0000?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Artem、


    没错。 这会将 HI_THRESH 寄存器设置为-1、将 Lo_THRESH 寄存器设置为0。 这基本上会强制 ALERT/RDY 标志在每次转换时跳闸。 测试这个、让我知道它是有效的。


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

    遗憾的是、它不起作用。 警报/干燥始终处于低电平状态。 如果我忽略它并继续读取、则转换寄存器读数为 true、但 ALERT / RDY 引脚未设置。

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

    例如。

    我执行 ADS1115初始化:

    bool ADS1115_Init (struct __I2C_HandleTypeDef *pIntfc){
    struct ADS1115_Config adcInitConf;
    adcInitConf.compQue = ADS1115_COMP_QUE_ONE;
    adcInitConf.compLat = ADS1115_COMP_LAT_ENABLE;
    adcInitConf.compPol = ADS1115_COMP_POL_LOW;
    adcInitConf.compMode = ADS1115_COMP_MODE_ENE_CORTEDS1115;
    adcInitConf.dr = ADS1115_DR_128_SPS;
    adcInitConf.mode = ADS1115_mode_single_shot;
    adcInitConf.PGA = ADS1115_PGA_4_1;
    adcInitConf.mux = ADS1115_MUX_0_G;
    adcInitConf.os_write_= ADS1115_begin;
    
    uint8_t adcRegData[3];
    ADS1115_MakeConfigData (&adcInitConf、adcRegData);
    
    //将配置数据写入 ADS1115
    if (HAL_I2C_Master_transmit (pIntfc、ADS1115_ADR << 1、adcRegData、3、ADS1115_TimeOut_transmit)!= 0x1115 Reg_2_Adt
    
    
    
    2 (
    
    
    
    CC1115)、ADR2_ADR = 0x000_u_0_ADDR_0_ADR = 0x000_ADDR_0_ADDR_1;(ADDR_0_ADDR_0_ADDR_0_ADDR_0_ADDR_ADR = 0x000_0_ADDR_0_ADDR_ADDR_ADDR_1);(ADDR_ADDR_0_ADDR_0_ADDR_ADDR_0_ADDR_ADDR_0_ADDR_0_ 3、ADS1115_TIMEOUT_Transmit)!= HAL_OK){
    返回 false;
    }
    
    //将0xFFFF 写入 Hi 寄存器 ADS1115
    adcRegData[0]= ADS1115_REG_ADDR_HI_THR;// 3
    adcRegData[1]=(uint8_t)(0xFF);
    adcRegData[2]=(uint8_Adr_t
    );(uint8_adt (uint8_adt) 3、ADS1115_TIMEOUT_Transmit)!= HAL_OK){
    返回 false;
    }
    
    返回 true;
    } 



    然后、我读取值、例如同一函数:

    bool ADS1115_ReadInput (struct __I2C_HandleTypeDef *pIntfc,const uint8_t *pConfigRegister,uint16_t *inputValue){
    //假设进行测量
    if (HAL_I2C_Master_transmit (pIntfc,ADSHAL_ADR << 1,pConfigRegister,3,ADSHAL_transmit)= tick_timeout)
    
    ;}
    
    
    //等待 ADC 完成测量
    while (HAL_GPIO_ReadPin (ADC_Alert_GPIO_Port、ADC_Alert_Pin)!= GPIO_PIN_RESET){
    if (HAL_GetTick ()- tickstart)> ADS1115_TIMEOUT_Transmit){
    return false;
    
    }
    
    
    
    
    //从 ADC uint8_t RECONV_ADR_1 (HAL_Intradt)读取数据;<ADS1115_ADDR_1、ADDR_1、ADDR_1、ADDR_1、ADDR_CONTRAMENT1、ADR2< ADS1115 ADS1115_TIMEOUT_Transmit)!= HAL_OK){
    返回 false;
    }
    if (HAL_I2C_Master_Receive (pIntfc、ADS1115_ADR << 1、reciveData、2、 ADS1115_TIMEOUT_Transmit)!= HAL_OK){
    返回 false;
    }
    
    //将数据放入 inputValue
    *inputValue =(reciveData[0]<<8);
    *inputValue |=(reciveData[1]);
    
    返回 true;
    } 

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


    我在代码中没有看到任何错误、但我想尝试两件事。

    首先将 HI_THRESH 寄存器设置为8000h、将 Lo_THRESH 寄存器设置为7FFF。 这将使高阈值和低阈值寄存器完全反相。

    其次、我将得到一个示波器图或逻辑分析仪、并在配置寄存器、高阈值寄存器和 LOW_THRESH 寄存器中放置用于编程的 I2C 事务图。 然后获取读回相同3个寄存器的图。 我还会查看 SDA、SCL 和 ALERT/RDY 引脚。 我只想验证通信时序和值是否正确。

    有一件事我以前不理解。 您说、当您插入输入并测量某项时、就绪引脚工作、但当输入悬空或接地时、它不工作。 在您的设置中、当输入端具有100欧姆电阻器时、您实际上没有浮动情况。 输入大小有多大、您是否尝试过测量、在测量中输入越来越小? 器件、微处理器或输入信号的接地端是否有任何不同?


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


    在第一种情况下、我已将 HI_THRESH reg 设置为0x01、将 Lo Thresh reg 设置为0x00。 当我使用电位器时、它运行良好、但当我将输入连接到 GND 或未连接时、它不起作用。 注意:我想在传感器和接地之间进行测量。



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

    吴约瑟

    我将 HI_THRESH 寄存器设置为8000h、将 Lo_THRESH 寄存器设置为7FFF、但它不起作用。

    在第一个屏幕上:我从 ADS1115读取寄存器的值。

    在第二个屏幕上:我显示 ALERT/RDY 引脚始终处于低电平。 我认为应该是这样的:第一点:设置= 50000;复位= 0; 第二点: 设置= 3100 (8ms)、复位= 496900;  第三点: 设置= 500000;复位= 0;

    谢谢

    Artem

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


    很抱歉、我之前没有回到这个线程。 您是否能够调试此问题? 在查看您的帖子时、我认为这仍然是对阈值进行编程的错误。 如果您让它与传感器一起工作、但当输入短路或悬空时它停止工作、则似乎唯一的差异是 ADC 输出值。

    在我的上一篇文章中、我要求提供通信的范围截图。 我仍然认为这很重要。 我想查看中编程的阈值。 我仍将使用设置为8000h 的 HI_THRESH 寄存器、并将 Lo_THRESH 寄存器设置为7FFF。

    除此之外、我将首先使 RDY 引脚正常工作、并开始进行更小的更改来调试此问题。 将器件设置为连续转换模式以查看 RDY 指示、或将器件设置为非锁存以查看 RDY 是否自行返回。


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

    吴约瑟

    在我的上一个帖子中、我读取了寄存器 Config、 LO_THRESH 和 HI_THRESH。  如您所见、我按照您的建议使用这些参数。  

    HI_THRESH (Data[2])= 0x8000;

    LO_THRESH (Data[1])=0x7fff;

    Config (Data[0])=0x4384;

    在本例中  、在配置寄存器(0x4384)中、我具有:

    参数

    当前值(二进制)

    含义

    兼容

    00

    在一次转换后置为有效

    Comp_LAT

    1

    非锁存比较器

    COMP_POL

    0

    低电平有效

    COMP_MODE

    0

    具有迟滞功能的传统比较器

    博士

    100

    128SPS

    模式

    1

    断电单冲模式

    PGA

    001

    FS =±4.096V

    多路复用

    100

    AIN P = AIN0、AIN N = GND

    操作系统

    0

    器件当前正在执行转换

    谢谢

    Artem

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


    Comp_LAT=1实际上是锁存比较器(而不是表中提到的非锁存比较器)。 正如我在前面的一篇文章中提到的、我本来会使用非锁存的、所以配置应该是4380h。

    如果仍然存在问题、检查范围快照的原因是查看数据是否已将器件正确编程到正确的寄存器中。 我仍然认为这很重要。

    同样、我发现输入悬空或接地时出现问题是可疑的。 这仍然会导致错误地编程阈值。 我仍将使用 HI_THRESH = 8000和 Lo_THRESH = 7FFF。 只需通过验证寄存器指针值和寄存器编程值、确保寄存器被正确编程。

    此外、要尝试调试该问题、我仍然会使 RDY 像以前一样工作、检查它是否在连续转换模式下工作、然后检查不同输入值是否存在问题。


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

    吴约瑟

    现在、我有这样的情况:指出 ALERT/RDY 引脚始终为低电平、当我发送命令以"开始测量"时、ALERT/RDY 引脚会在8ms 上将状态更改为高电平、然后即使 在读取 测量值后也会更改为低电平。 我认为在读取 测量值后、ALERT/RDY 引脚必须将状态(复位)更改为高电平。 为什么它不起作用?

    非常感谢、Artem

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


    ALERT/RDY 状态不会随着器件读取而变化、ALERT/RDY 仅在转换完成时变为低电平。


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


    您对 ADS1115还有任何疑问吗? 我现在要关闭此主题、但如果您有其他问题、您应该可以返回并向此主题添加更多帖子。


    吴约瑟