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.

[参考译文] ADS1220:配置和原始数据读取不一致问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1429782/ads1220-issue-with-configuration-and-inconsistent-raw-data-readings

器件型号:ADS1220

工具与软件:

尊敬的 TI 社区:

我目前使用 ADS1220、在配置和数据读数方面面临一些挑战。 以下是我的设置的详细信息:

请务必验证原理图两线 RTD 并检查我的代码。

配置:

  • 寄存器0:  命令  0x66

    • AINp = AIN1、AINn = AIN0
    • 增益= 8
    • PGA =启用
  • 寄存器1:  命令  0x04

    • 数据速率= 20SPS
    • 0:正常模式
    • 连续转换模式
  • 寄存器2:命令0x55h

  •     外部基准配置(REFP0、REFN0)

    • 同步50Hz/60Hz 抑制
    • IDAC = 500 µA
  • 寄存器3:命令0x80

  • IDAC1连接到 AIN3/REFN1

步骤:

  1. 我首先发送命令0x06(复位命令)。
  2. 在读取数据之前、我发送命令0x08(开始转换)。

问题:

我将使用 PT100 RTD 进行温度测量、但 ADC 原始数据不会随温度变化而变化。 无论对 RTD 施加的温度如何、我都只会收到两个值:8388351和8387839。

问题:

  1. 此问题是否可能与硬件或软件配置有关?
  2. 是否有任何可以帮助提高读数一致性的特定设置或步骤可能丢失?

感谢您提供任何指导或建议。

  

谢谢!

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

    请检查我的代码   

    #ifndef INC_ADS1220_H_
    #define INC_ADS1220_H_

    #include "main.h"//项目的 main 中应该包含 HAL

    //命令
    #define ADS1220_RESET 0x06 //上电时复位好主意
    #define ADS1220_START 0x08 //单次和连续转换都必须通过0x08启动
    #define ADS1220_WREG 0x40
    #define ADS1220_RREG 0x20

    //寄存器
    #define ADS1220_CONFIG_REG0_ADDRESS 0x00
    #define ADS1220_CONFIG_REG1_ADDRESS 0x01
    #define ADS1220_CONFIG_REG2_ADDRESS 0x02
    #define ADS1220_CONFIG_REG3_ADDRESS 0x03

    //掩码
    #define ADS1220_REG_CONFIG1_DR_MASK 0xE0
    #define ADS1220_REG_CONFIG0_PGA_GAIN_MASK 0x0E
    #define ADS1220_REG_CONFIG0_MUX_MASK 0xF0

    //采样率
    #define ADS1220_DR_20SPS 0x00
    #define ADS1220_DR_45SPS 0x20
    #define ADS1220_DR_90SPS 0x40
    #define ADS1220_DR_175SPS 0x60
    #define ADS1220_DR_330SPS 0x80
    #define ADS1220_DR_600SPS 0xA0
    #define ADS1220_DR_1000SPS 0xC0

    //PGA 增益设置
    #define ADS1220_PGA_GAIN_1 0x00
    #define ADS1220_PGA_GAIN_2 0x02
    #define ADS1220_PGA_GAIN_4 0x04
    #define ADS1220_PGA_GAIN_8 0x06
    #define ADS1220_PGA_GAIN_16 0x08
    #define ADS1220_PGA_GAIN_32 0x0A
    #define ADS1220_PGA_GAIN_64 0x0C
    #define ADS1220_PGA_GAIN_128 0x0E

    //输入多路复用器
    #define ADS1220_MUX_AIN0_AIN1 0x00
    #define ADS1220_MUX_AIN0_AIN2 0x10
    #define ADS1220_MUX_AIN0_AIN3 0x20
    #define ADS1220_MUX_AIN1_AIN2 0x30
    #define ADS1220_MUX_AIN1_AIN3 0x40
    #define ADS1220_MUX_AIN2_AIN3 0x50
    #define ADS1220_MUX_AIN1_AIN0 0x60
    #define ADS1220_MUX_AIN3_AIN2 0x70
    #define ADS1220_MUX_AIN0_AVSS 0x80
    #define ADS1220_MUX_AIN1_AVSS 0x90
    #define ADS1220_MUX_AIN2_AVSS 0xA0
    #define ADS1220_MUX_AIN3_AVSS 0xB0

    #define Monitor_Bypass 0xC0
    #define AVDD_AVSS_D0 Bypas_Negative 0xD0
    #define AVDD_AVSS_E0 Bypass_Positive

    #define _BV (bit)(1<<(bit))
    uint8_t cmd1=0x08;
    结构 ADS1220_REGS_s

    uint8_t cfg_reg0;//= 0x00;//AINP=AIN0、AINN=AIN1、GAIN=1、 启用 PGA
    uint8_t cfg_reg1;//= 0x04;//20SPS、模式=正常、转换=连续、 温度模式被禁用、电流源被禁用
    uint8_t cfg_reg2;//= 0x10;//内部2.048V VREF、50/60Hz 滤波器、晶体管开路、 IDAC 关断
    uint8_t cfg_reg3;//= 0x00;//IDAC1&2被禁用、仅 DRDY 信号转换完成
    } ADS1220_DEFAULT_REGS =
    {0x66、0x04、0x55、0x80};

    typedef 结构 ADS1220_regs_s ADS1220_REGS;//默认初始化

    void ADS1220_writeRegister (SPI_HandleTypeDef * hspi、uint8_t 地址、uint8_t 值)

    uint8_t arr[2]=
    {ADS1220_WREG |(地址<< 2)、value};

    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、RESET);

    HAL_SPI_TRANSMIT (hspi、arr、2100);
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、SET);
    }

    uint8_t ADS1220_readRegister (SPI_HandleTypeDef * hspi、uint8_t 地址)

    uint8_t data[2]=
    { 0、0 };

    uint8_t TxD[2]=
    {(ADS1220_RREG |(地址<< 2))、0xFF};
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、RESET);

    HAL_SPI_TransmitReceive (hspi、TxD、DATA、21000); //执行双向操作时、发送虚拟字节(0xFF)、总共2、接收到的寄存器在[1]中
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、SET);
    返回数据[1];
    }

    空 ADS1220_reset (SPI_HandleTypeDef * hspi)

    const uint8_t cmd = ADS1220_RESET;
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、RESET);
    HAL_SPI_TRANSMIT (hspi、(uint8_t*)&cmd、1100);
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、SET);
    }

    uint8_t ADS1220_init (SPI_HandleTypeDef * hspi、ADS1220_REGS * r)

    ADS1220_reset (hspi);
    HAL_DELAY (100);

    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS、r->cfg_reg0);//0x40
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG1_ADDRESS、r->cfg_reg1);//0x04
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG2_ADDRESS、r->cfg_reg2);//0x10
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG3_ADDRESS、r->cfg_reg3);//0x00

    HAL_DELAY (10);

    uint8_t CR0 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS);
    uint8_t CR1 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG1_ADDRESS);
    uint8_t CR2 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG2_ADDRESS);
    uint8_t CR3 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG3_ADDRESS);

    return (CR0 == r->cfg_reg0 && CR1 == r->cfg_reg1 && CR2 == r->cfg_reg2 && CR3 == r->cfg_reg3);
    }

    空 ADS1220_start_conversion (SPI_HandleTypeDef * hspi)

    // const uint8_t cmd = ADS1220_start;
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、RESET);
    HAL_DELAY (5);
    HAL_SPI_TRANSMIT (hspi、&cmd1、1100);
    HAL_DELAY (5);
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、SET);
    }

    空 ADS1220_ENABLE_PGA (SPI_HandleTypeDef * hspi、ADS1220_REGS * r)

    ~>cfg_reg0并且= n ü l_BV (0);
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS、r->cfg_reg0);
    }

    void ADS1220_DISABLE_PGA (SPI_HandleTypeDef * hspi、ADS1220_REGS * r)

    r->cfg_reg0 |=_BV (0);
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS、r->cfg_reg0);
    }

    void ADS1220_set_conv_mode_continuous (SPI_HandleTypeDef * hspi、ADS1220_REGS * r)

    r->cfg_reg1 |=_BV(2);
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG1_ADDRESS、r->cfg_reg1);
    }

    void ADS1220_set_conv_mode_single_shot (SPI_HandleTypeDef * hspi、ADS1220_REGS * r)

    r->cfg_reg1 &=~ó n_BV (2);
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG1_ADDRESS、r->cfg_reg1);
    }

    空 ADS1220_SET_DATA_RATE (SPI_HandleTypeDef * hspi、int 数据速率、ADS1220_REGS * r)

    r->cfg_reg1并且=~ADS1220_REG_CONFIG1_DR_MASK;
    r->cfg_reg1 |=数据速率;
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG1_ADDRESS、r->cfg_reg1);
    }

    void ADS1220_select_mux_config (SPI_HandleTypeDef * hspi、int channels_conf、ADS1220_REGS * r)

    r->cfg_reg0并且=~ADS1220_REG_CONFIG0_MUX_MASK;
    r->cfg_reg0 |= channels_conf;
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS、r->cfg_reg0);
    }

    void ADS1220_SET_PGA_GAIN (SPI_HandleTypeDef * hspi、int pgagain、ADS1220_REGS * r)

    r->cfg_reg0并且=~ADS1220_REG_CONFIG0_PGA_GAIN_MASK;
    r->cfg_reg0 |= pgagain;
    ADS1220_writeRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS、r->cfg_reg0);
    }

    uint8_t* ADS1220_get_config (SPI_HandleTypeDef * hspi、ADS1220_REGS * r)

    静态 uint8_t cfgbuf[4];

    r->cfg_reg0 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG0_ADDRESS);
    r->cfg_reg1 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG1_ADDRESS);
    r->cfg_reg2 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG2_ADDRESS);
    r->cfg_reg3 = ADS1220_readRegister (hspi、ADS1220_CONFIG_REG3_ADDRESS);

    cfgbuf[0]= r->cfg_reg0;
    cfgbuf[1]= r->cfg_reg1;
    cfgbuf[2]= r->cfg_reg2;
    cfgbuf[3]= r->cfg_reg3;

    返回 cfgbuf;
    }

    int32_t ADS1220_READ_BLOCKING (SPI_HandleTypeDef * hspi、GPIO_typedef * DRDY_port、uint16_t DRDY_PIN、uint16_t TIMEOUT)//超时应该至少达到 sampletime+某些时钟周期的长度

    uint8_t SPIbuf[3];
    int32_t result32 = 0;
    long int 位24;

    uint8_t time = 0;

    while (HAL_GPIO_ReadPin (DRDY_PORT、DRDY_PIN)== GPIO_PIN_SET)

    HAL_DELAY (1);//这有点古怪
    时间++;
    if (time >= timeout)
    返回0;
    }

    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、RESET);
    HAL_DELAY (5);
    HAL_SPI_RECEIVE (hspi、SPIbuf、3100);
    HAL_DELAY (5);
    HAL_GPIO_WritePin (GPIOE、GPIO_PIN_12、SET);

    位24 = SPIbuf[0];
    bit24 =(bit24 << 8)| SPIbuf[1];
    bit24 =(bit24 << 8)| SPIbuf[2];//将3个字节转换为24位 int

    位24 =(位24 << 8);
    result32 =(位24 >> 8);//将24位二进制补码转换为32位二进制补码

    返回结果32;
    }

    int32_t ADS1220_read_singlesshot (SPI_HandleTypeDef * hspi、GPIO_typedef * DRDY_port、uint16_t DRDY_PIN、uint16_t TIMEOUT)

    ADS1220_start_conversion (hspi);
    HAL_DELAY (100);
    返回 ADS1220_READ_BLOCKING (hspi、DRDY_PORT、DRDY_PIN、TIMEOUT);
    HAL_DELAY (1000);
    }

    int32_t ADS1220_read_singleshot_channel (SPI_HandleTypeDef * hspi、uint8_t channel_num、ADS1220_REGS * r、GPIO_typedef * DRDY_port、uint16_t DRDY_PIN、 uint16_t 超时)

    int32_t ADC_Raw=0;
    // ADS1220_select_mux_config (hspi、channel_num、r);
    HAL_DELAY (100);
    ADS1220_start_conversion (hspi);
    HAL_DELAY (100);
    ADC_Raw = ADS1220_READ_BLOCKING (hspi、DRDY_PORT、DRDY_PIN、TIMEOUT);
    HAL_DELAY (1000);
    返回 ADC_Raw;

    }

    #endif /* INC_ADS1220_H_*/

    int main()

    ADS1220_REGS 寄存器= ADS1220_default_REGS;
    ADS1220_init (&hspi1、&regs);/

    while (1)

    {  CH1 = ADS1220_READ_SINGLESHOT_CHANNEL (&hspi1、ADS1220_MUX_AIN1_AIN0、&REGS、 GPIOA、GPIO_PIN_2100);

      HAL_DELAY (1000);

    }

    }

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

    尊敬的 Antesh:

    我会在星期一之前看一下并回复您。

    此致、

    天使

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

    感谢您的答复。

     此致、

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

    尊敬的 Antesh:

    您的原理图中的配置看起来符合说明中的配置。

    您能否提供 SPI 数字通信线路的捕获、以验证与器件的通信是否正常工作、以及您是否可以读回您设置的寄存器配置?

    此外、您需要获取多少个 ADC 读数、如何确定 ADC 转换何时准备就绪?

    在前两个转换读数之后、您是否获取了后续的 ADC 读数? 在进行第一次转换时、外部 VREF 可能仍然会稳定、因此最好验证这是否会一直发生、或者您最终是否开始看到有效的 ADC 转换。

    在读取数据时捕获逻辑分析仪的数据也会有帮助。

    此致、

    天使

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

    尊敬的

    感谢您的答复。

    我正在监视 DRDY 引脚以检查数据转换是否完成。 当 DRDY 引脚为低电平时、我会接收 ADC 原始数据。

    我已经连接了 SNAP 以检查寄存器是否已配置。 此外、还连接了使用逻辑分析仪获取的 SPI 通信线路快照。 请看一遍。

    因为我使用连续转换模式。

    我已使用 PT100并按如下方式检查电阻

    • 125 Ω : 8387839.
    • 231欧姆 : 8387839.
    • 89 Ω :8388351
    • 178欧姆 : 8387839.

    状态、我将获得相同的值。 在向 RTD 提供不同的温度值后、 我仍然获得2个值 i、e  8388351和  8387839.

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

    尊敬的 Antesh:

    您能否使用外部万用表测量基准电阻两端的电压、以确认 IDAC 是否根据您的寄存器设置工作?

    BR、

    天使

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

    尊敬的 

    感谢您的答复。

    我正在检查 IDAC 功能、以确认是否能够根据寄存器设置正常工作。

    测量电压:

    • AIN1:1.722V
    • AIN0:1.641V
    • Vref (电阻器):1.641V

    IAM 观察到、在改变电阻时、AIN1电压会变化、而 AIN0和 Vref 都保持不变、始终为1.641V

    此致。

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

    尊敬的 

    很抱歉之前提供了错误信息。 我观察到、在改变电阻时、AIN1电压会变化、而 AIN0和 Vref 也会显示变化的电压。

     

    此致。

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

    尊敬的 Antesh:

    如果您可以测量来自器件的 IDAC 电流、看起来您已正确设置器件。

    您的逻辑分析仪捕获结果表明您的 ADC 读数为满量程(0x 7F FF FF)、但您提供的十进制值对应于0x 7F FC FF:

    [报价 userid="628438" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1429782/ads1220-issue-with-configuration-and-inconsistent-raw-data-readings/5486945 #5486945"]
    • 125 Ω : 8387839.
    • 231欧姆 : 8387839.
    [报价]

    您是否能够提供序列的完整逻辑分析仪捕获、以读取 ADC 数据、而不仅仅是 ADC 结果捕获? 寄存器写入功能也会有所帮助。

    此致、

    天使

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

    尊敬的 

     

    我要对你的帮助和指导表示感谢。 我意识到了我的错误、并最终通过 ADS1220解决了该问题。 它现在运行得完美!

    我衷心感谢你在整个过程中的支持。

    此致、

    Antesh