电子元器件论坛
直播中

李欢

8年用户 1144经验值
私信 关注

AD7734读取数据错误的原因?

我使用AD7734与STM32F1通过SPI通信,模式选择的是连续转化,16位、+-10V、单通道读取AD值,我通过串口打印出来对应的AD值很奇怪。
实际电压 : 串口打印值
0v        : 65407
3.285v : 65449
5.096v : 65473
悬空    : 65439  (悬空时电压表测得电压为2.464v)
为什么会这样奇怪的?我不知道是电路问题、还是芯片问题、还是代码问题,但是在读其它寄存器的值的时候是能返回正确的值的。
有老哥知道吗?或者有对应的STM32代码吗?
致谢

回帖(1)

王璐

2025-4-22 18:13:04

针对AD7734读取数据异常的问题,以下是可能原因及解决方案的逐步分析:




1. 数据位数配置错误



  • 问题:AD7734为24位ADC,但用户提到“16位”配置。若错误配置为16位模式或未完整读取24位数据,会导致数据高位丢失。

  • 解决

    • 检查模式寄存器(Mode Register)的"WL"位设置,确认配置为24位模式。

    • 读取数据时连续读取3字节(24位),而非2字节。示例代码:
      uint8_t data[3];
      HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // 拉低片选
      HAL_SPI_Receive(&hspi1, data, 3, 100); // 读取3字节
      HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);  // 释放片选
      int32_t adc_value = (data[0] << 16) | (data[1] << 8) | data[2]; // 组合24位数据





2. 参考电压(VREF)问题



  • 问题:悬空时测得2.464V,可能与参考电压相关。AD7734的转换结果依赖外部参考电压(如±10V量程需VREF=5V)。

  • 解决

    • 检查硬件上REF+REF-引脚电压是否符合±10V量程要求(通常VREF=5V)。

    • 确认配置寄存器中的量程设置(Range Bit)是否正确设为±10V。





3. SPI时序与模式不匹配



  • 问题:SPI的CPOL/CPHA配置错误导致数据采样错误。

  • 解决

    • 查阅AD7734数据手册,确认其SPI模式(通常为CPOL=0, CPHA=1)。

    • 在STM32中配置SPI模式为Mode 1Mode 3,示例如下:
      hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;    // CPOL=0
      hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;        // CPHA=1(Mode 1)





4. 未正确处理DRDY信号



  • 问题:连续转换模式下需等待DRDY引脚变低(数据就绪)后再读取数据,否则会读到无效值。


  • 解决



    • 通过轮询DRDY引脚或状态寄存器的RDY位判断数据是否就绪:

      // 轮询DRDY引脚(需硬件连接)
      while (HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin) == GPIO_PIN_SET);


    // 或读取状态寄存器检查RDY位
    uint8_t status;
    HAL_SPI_Receive(&hspi1, &status, 1, 100);
    if ((status & 0x80) == 0) { // RDY位为0时数据就绪
    // 读取数据寄存器
    }







5. 输入通道配置错误



  • 问题:未正确配置通道寄存器(Channel Register)导致读取错误通道或信号类型不匹配。

  • 解决

    • 确保通道寄存器设置为目标单端通道(如CH0到COM)。

    • 验证输入信号类型(单端/差分)是否与寄存器配置一致。





6. 硬件连接问题



  • 问题:悬空引脚电压异常或信号路径故障。

  • 解决

    • 检查模拟输入引脚是否接触良好。

    • 悬空时建议将输入端接地或通过电阻拉至共模电压,避免浮空噪声。





7. 校准与偏移问题



  • 问题:未执行校准导致偏移/增益误差。

  • 解决

    • 执行AD7734的内部校准(写校准寄存器启动),参考数据手册校准流程。





代码示例(关键部分)


// SPI及GPIO初始化略...

uint32_t Read_AD7734_Data() {
    uint8_t data[3];
    // 等待DRDY就绪
    while (HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin) == GPIO_PIN_SET);

    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
    HAL_SPI_Receive(&hspi1, data, 3, 100);
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);

    // 组合24位有符号数据
    int32_t adc_value = (data[0] << 16) | (data[1] << 8) | data[2];
    if (adc_value & 0x00800000) { // 处理负数
        adc_value |= 0xFF000000;
    }
    return adc_value;
}



调试建议



  1. 验证参考电压:用万用表测量REF+和REF-的电压。

  2. 读取寄存器值:确认模式/通道/滤波器寄存器的配置值是否正确。

  3. 逻辑分析仪抓包:检查SPI的CLK、MOSI、MISO信号时序是否符合预期。


通过逐步排查以上关键点,应能定位并解决数据异常问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分