QRSXC 2025-01-03 00:13 采纳率: 0%
浏览 23
已结题

关于AD7685的采样疑问

这是进入ADC采集芯片的信号:

img

这是异常的曲线,从adc读出的数据:

img

这是我修改了转换时间和采样间隔后,曲线变正常了:

img

异常的时候,没有采样间隔,只有拉高时间,为3us。
采样原理是同一时刻重复采样多次(循环)后将值相加(8次),即为采样值,所以曲线图上值才会大。
然而每次到曲线峰附近时就会出现如图2所示的拐点骤降,另一方面,如果我将输入信号降低,这种骤降在3us情况下采集也是正常的。

还有1个情况,就是在这次异常出现的前一版电路板,MCU和ADC芯片之间的SPI有5cm左右,而这次出问题的板子,这个SPI长度变为10~15cm,且还多挂了1个SPI设备。当然有上拉电阻。

请问这种问题是什么原因引起的?又应该如何解决?

  • 写回答

6条回答 默认 最新

  • CLLLLLLY 2025-01-03 00:13
    关注
    我长期活跃于技术社区,热衷于帮助他人解决各类技术难题。很高兴在 CSDN 上回答你的问题,让我们一起探讨,找到解决问题的最佳方案吧。
    以下是对该问题的分析与解决方案:

    问题原因分析

    1. SPI信号完整性问题
      • 当SPI线路长度从5cm增加到10 - 15cm,并且多挂了一个SPI设备时,信号的传输延迟、串扰以及信号衰减等问题可能会变得更加严重。这些因素可能导致在数据传输过程中出现错误,尤其是在信号变化较快的峰值附近,更容易受到干扰而出现数据异常。
      • 较长的SPI线路会增加信号的传输时间,可能导致采样时刻不准确,从而在信号峰值处出现骤降现象。
    2. 采样时间设置不合理
      • 在没有采样间隔,只有3us拉高时间的情况下,可能无法满足芯片对信号稳定采样的要求。特别是在信号快速变化的峰值区域,过短的采样时间可能导致采集到不稳定或错误的数据。
    3. 信号干扰问题
      • 由于多挂了一个SPI设备,可能引入额外的电磁干扰或电源波动等问题,影响ADC的正常采样。

    解决方案

    1. 优化SPI线路设计
      • 缩短SPI线路长度:尽量缩短MCU与ADC芯片以及其他SPI设备之间的SPI线路长度,以减少信号传输延迟和衰减。
      • 增加信号屏蔽:对SPI线路采用屏蔽线,减少外界电磁干扰对信号的影响。
      • 优化布线:遵循高速信号布线原则,避免信号之间的串扰,如尽量减少平行布线长度,增加信号线之间的间距等。
    2. 调整采样时间参数
      • 合理设置采样间隔:根据ADC芯片的性能和输入信号的特性,设置合适的采样间隔和采样时间,确保能够准确采集到信号的峰值等关键信息。例如,可以通过实验逐步调整采样间隔,观察采集到的信号曲线变化,找到最佳的采样时间参数。
      • 考虑信号稳定时间:在采样之前,需要确保信号已经稳定,所以可以适当增加信号建立时间等参数。
    3. 电源与电磁干扰处理
      • 增加电源滤波:在ADC芯片和MCU的电源引脚附近增加合适的滤波电容,以减少电源波动对芯片工作的影响。
      • 电磁屏蔽与隔离:对容易产生电磁干扰的设备或电路部分进行电磁屏蔽或隔离处理,减少相互之间的干扰。

    代码示例(以调整采样时间参数为例)

    以下是调整采样时间参数的代码示例,假设可以通过修改相关的宏定义或变量来调整采样间隔和拉高时间等参数:

    // 定义采样间隔和拉高时间等参数
    #define SAMPLE_INTERVAL_US 1 // 采样间隔,单位:us
    #define PULL_HIGH_TIME_US 2  // 拉高时间,单位:us
    
    void AD7685_GetSSP0Data(uint32_t *Data)
    {
        uint8_t i;
        *Data = 0;
        for (i = 0; i < SSP0_CYCLE_NUM; i++)
        {
            SSP0_SSEL = 1;
            Timer1_us(PULL_HIGH_TIME_US); // 使用新的拉高时间
            SSP0_SSEL = 0;
            Timer1_us(SAMPLE_INTERVAL_US); // 增加采样间隔
            *Data += AD7685_SendSSP0Data();
            Timer1_us(1);
        }
        // *Data >>= 1;
        *Data = (*Data > 0)? *Data : 1;
    }
    

    在上述代码中,通过定义SAMPLE_INTERVAL_USPULL_HIGH_TIME_US两个宏来分别设置采样间隔和拉高时间,然后在采样函数中使用这些新的参数进行采样操作。通过不断调整这些参数的值,并结合实际采集到的信号曲线情况,找到最佳的采样时间设置,以解决信号采集异常的问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月3日
  • 创建了问题 1月3日