Post Go back to editing

关于AD7768使用 宽带滤波器(FIR) 的问题

目前我在项目中使用AD7768作为ADC信号采集芯片,首先我使用了sinc5滤波器,正常的产生了数据波形。

然后我想把片内的滤波器换成宽带滤波器,但输出的数据一直提示:滤波器饱和(bit27 = 1)。

我的实验思路如下:

1) 网上找到在设置滤波器后,要对ad7768重新同步一下 -->  于是使用SPI命令在设置滤波器类型后 对 AD7768 进行同步,结果:滤波器饱和(bit27 = 1)。

2) 在网上查到clk_sel引脚可能导致 -->查看硬件,clk_sel 没问题

3) 怀疑是高频信号引起滤波器饱和 -->  通过前置电路,滤掉高频信号,结果:滤波器饱和(bit27 = 1)。

4) 怀疑是配置参数引起的 --> 将抽取率 从32、64、一直到1024 全部试了一遍,结果:滤波器饱和(bit27 = 1)。

请问:宽带滤波器应该如何使用呢?在使用过程中有什么注意事项呢?

Parents
  • 请问在您遇到filter问题时,您给AD7768的输入信号是什么样的波形和参数。

    1. 核心怀疑点:FIR 滤波器的“过冲(Overshoot / Ringing)”导致数字溢出

    这是 Sinc5 正常而 Wideband 饱和的最常见原因。

    • 原理:Sinc 滤波器在时域上没有过冲。但是宽带滤波器(FIR)为了保证频域上的砖墙特性(极陡的截止频率),在时域上对阶跃信号或接近满量程的信号会产生**“吉布斯现象(Gibbs Phenomenon)”,也就是信号边缘会有振铃(Ringing)或过冲**。
    • 现象:如果你的输入信号(哪怕是直流或低频)非常接近 ADC 的满量程(Full Scale),当宽带滤波器在内部进行卷积运算时,振铃产生的过冲会导致计算出来的数字值超过了 24-bit 能表示的最大值(比如超过了 0x7FFFFF),此时芯片内部的 DSP 就会立刻置位 bit27 = 1,报告数字滤波器饱和。
    • 验证方法
      1. 将 ADC 的模拟输入端短接,或者接至 VCM(共模电压),即输入 0V 差分信号。
      2. 或者,通过信号源输入一个幅度非常小的正弦波(比如满量程的 10%)。
      3. 在这个极小信号或 0 信号下,切换到宽带滤波器,看看 bit27 是否恢复正常(等于 0)。如果恢复正常,说明你之前的输入信号幅度太高,被 FIR 滤波器的过冲顶到了天花板。
      4. 注意:使用宽带滤波器时,建议将输入信号的最大幅度限制在满量程的 -1 dBFS 或 -2 dBFS 以内,留出运算裕量。

    2. 检查失调(Offset)和增益(Gain)校准寄存器

    • 原理:AD7768 内部的数据流向是:调制器 -> 数字滤波器 -> 失调校准相加 -> 增益校准相乘 -> 输出
    • 现象:如果你在代码初始化时,不小心向 Offset 寄存器写入了一个很大的值,或者 Gain 寄存器设置不当。在 Sinc5 模式下,也许数据只是单纯的达到最大值(0xFFFFFF);但在配置更为复杂的宽带滤波器运算流水线中,这种不合理的校准值可能直接引发内部数学溢出,导致 bit27 = 1
    • 验证方法:检查并确保你在切换滤波器时,没有写入错误的 Offset 和 Gain 寄存器。保持它们为出厂默认值(Offset = 0x000000, Gain = 0x555555,具体参考数据手册)

    3. 同步(SYNC)操作的时序与流水线延迟(Group Delay)

    你提到尝试了 SPI 同步,这步做得很对,但执行的时机很关键。

    • 原理:宽带滤波器的群延迟(Group Delay)比 Sinc5 长得多(通常需要几十个 ODR 周期才能吐出第一个有效数据)。如果你在 ADC 正在连续转换时,“热切换”滤波器类型,宽带滤波器的流水线里塞满了之前 Sinc5 的残余数据,会瞬间造成计算错乱并锁死在饱和状态。
    • 正确的切换与同步操作顺序
      1. 将 ADC 设置为 Standby 模式(或者停止读取数据)。
      2. 通过 SPI 写入寄存器,切换为宽带滤波器(设置对应的 FILTER 寄存器)。
      3. 执行同步:强烈建议不要只依赖内部 SPI 软同步。最稳妥的做法是:拉低硬件 SYNC_IN 引脚,保持至少一个 MCLK 周期,然后再拉高。这会彻底清空数字滤波器的流水线。
      4. 等待滤波器建立(Settling Time)。对于宽带滤波器,通常需要等待 ~34 / f_ODR 的时间(具体看手册的 Settling Time 章节)。
      5. 在此期间忽略任何输出数据,等待建立时间过后再去检查 bit27

    4. 检查电源模式(Power Mode)与 MCLK 的匹配

    • 宽带滤波器需要进行极其密集的乘加运算(MAC)。如果你的 MCLK 频率与设定的电源模式(Fast, Median, Eco)不匹配,DSP 算不过来,也可能抛出异常。
    • 确认:如果你在 Fast Mode,MCLK 是否是标准的 32.768 MHz 或 16.384 MHz?不要在低功耗模式(Eco Mode)下强行跑过高的时钟和极低的抽取率(比如 x32),DSP 的运算速度可能跟不上宽带滤波器的吞吐要求。

    总结与建议行动计划

    目前最有可能的嫌疑人是 第1点(输入信号幅度过高导致的FIR内部过冲运算溢出)  第3点(切换滤波器时未彻底复位数字流水线)请按照以下步骤做一组对照实验:

    1. 物理短接输入法:将模拟输入通道的正负端都接到 VCM 测量直流 0V。
    2. 规范初始化序列:单片机复位 AD7768 -> 配置寄存器为宽带滤波器 -> 硬件控制 SYNC_IN 引脚产生一个复位脉冲 -> 等待 10ms -> 开始读取 SPI 数据。
    3. 如果此时 bit27 变成 0,波形输出在 0 附近(带有正常的底噪),说明你的代码和配置完全正确。之前报错就是因为外部模拟信号幅度太大或者切换状态机的残留导致的。

    希望这个思路能帮你成功用上宽带滤波器!如果做完“输入短接0V”实验后依然报错,我们可以进一步检查 SPI 寄存器的具体读回值。

Reply
  • 请问在您遇到filter问题时,您给AD7768的输入信号是什么样的波形和参数。

    1. 核心怀疑点:FIR 滤波器的“过冲(Overshoot / Ringing)”导致数字溢出

    这是 Sinc5 正常而 Wideband 饱和的最常见原因。

    • 原理:Sinc 滤波器在时域上没有过冲。但是宽带滤波器(FIR)为了保证频域上的砖墙特性(极陡的截止频率),在时域上对阶跃信号或接近满量程的信号会产生**“吉布斯现象(Gibbs Phenomenon)”,也就是信号边缘会有振铃(Ringing)或过冲**。
    • 现象:如果你的输入信号(哪怕是直流或低频)非常接近 ADC 的满量程(Full Scale),当宽带滤波器在内部进行卷积运算时,振铃产生的过冲会导致计算出来的数字值超过了 24-bit 能表示的最大值(比如超过了 0x7FFFFF),此时芯片内部的 DSP 就会立刻置位 bit27 = 1,报告数字滤波器饱和。
    • 验证方法
      1. 将 ADC 的模拟输入端短接,或者接至 VCM(共模电压),即输入 0V 差分信号。
      2. 或者,通过信号源输入一个幅度非常小的正弦波(比如满量程的 10%)。
      3. 在这个极小信号或 0 信号下,切换到宽带滤波器,看看 bit27 是否恢复正常(等于 0)。如果恢复正常,说明你之前的输入信号幅度太高,被 FIR 滤波器的过冲顶到了天花板。
      4. 注意:使用宽带滤波器时,建议将输入信号的最大幅度限制在满量程的 -1 dBFS 或 -2 dBFS 以内,留出运算裕量。

    2. 检查失调(Offset)和增益(Gain)校准寄存器

    • 原理:AD7768 内部的数据流向是:调制器 -> 数字滤波器 -> 失调校准相加 -> 增益校准相乘 -> 输出
    • 现象:如果你在代码初始化时,不小心向 Offset 寄存器写入了一个很大的值,或者 Gain 寄存器设置不当。在 Sinc5 模式下,也许数据只是单纯的达到最大值(0xFFFFFF);但在配置更为复杂的宽带滤波器运算流水线中,这种不合理的校准值可能直接引发内部数学溢出,导致 bit27 = 1
    • 验证方法:检查并确保你在切换滤波器时,没有写入错误的 Offset 和 Gain 寄存器。保持它们为出厂默认值(Offset = 0x000000, Gain = 0x555555,具体参考数据手册)

    3. 同步(SYNC)操作的时序与流水线延迟(Group Delay)

    你提到尝试了 SPI 同步,这步做得很对,但执行的时机很关键。

    • 原理:宽带滤波器的群延迟(Group Delay)比 Sinc5 长得多(通常需要几十个 ODR 周期才能吐出第一个有效数据)。如果你在 ADC 正在连续转换时,“热切换”滤波器类型,宽带滤波器的流水线里塞满了之前 Sinc5 的残余数据,会瞬间造成计算错乱并锁死在饱和状态。
    • 正确的切换与同步操作顺序
      1. 将 ADC 设置为 Standby 模式(或者停止读取数据)。
      2. 通过 SPI 写入寄存器,切换为宽带滤波器(设置对应的 FILTER 寄存器)。
      3. 执行同步:强烈建议不要只依赖内部 SPI 软同步。最稳妥的做法是:拉低硬件 SYNC_IN 引脚,保持至少一个 MCLK 周期,然后再拉高。这会彻底清空数字滤波器的流水线。
      4. 等待滤波器建立(Settling Time)。对于宽带滤波器,通常需要等待 ~34 / f_ODR 的时间(具体看手册的 Settling Time 章节)。
      5. 在此期间忽略任何输出数据,等待建立时间过后再去检查 bit27

    4. 检查电源模式(Power Mode)与 MCLK 的匹配

    • 宽带滤波器需要进行极其密集的乘加运算(MAC)。如果你的 MCLK 频率与设定的电源模式(Fast, Median, Eco)不匹配,DSP 算不过来,也可能抛出异常。
    • 确认:如果你在 Fast Mode,MCLK 是否是标准的 32.768 MHz 或 16.384 MHz?不要在低功耗模式(Eco Mode)下强行跑过高的时钟和极低的抽取率(比如 x32),DSP 的运算速度可能跟不上宽带滤波器的吞吐要求。

    总结与建议行动计划

    目前最有可能的嫌疑人是 第1点(输入信号幅度过高导致的FIR内部过冲运算溢出)  第3点(切换滤波器时未彻底复位数字流水线)请按照以下步骤做一组对照实验:

    1. 物理短接输入法:将模拟输入通道的正负端都接到 VCM 测量直流 0V。
    2. 规范初始化序列:单片机复位 AD7768 -> 配置寄存器为宽带滤波器 -> 硬件控制 SYNC_IN 引脚产生一个复位脉冲 -> 等待 10ms -> 开始读取 SPI 数据。
    3. 如果此时 bit27 变成 0,波形输出在 0 附近(带有正常的底噪),说明你的代码和配置完全正确。之前报错就是因为外部模拟信号幅度太大或者切换状态机的残留导致的。

    希望这个思路能帮你成功用上宽带滤波器!如果做完“输入短接0V”实验后依然报错,我们可以进一步检查 SPI 寄存器的具体读回值。

Children
No Data