最近在调试STM32F429和AD7606B通过FMC并口进行数据通讯,并将采集到的数据存储到循环队列中,当队列中数据达到512个点时开始进行FFT计算,计算幅值,频率及相位。现在将调试过程中遇到的问题总结如下。
1. FFT 计算中信号幅值偶尔为 0 的问题
问题描述:
在调试 8 通道交流采样及 FFT 计算时,偶尔会出现计算出的信号幅值为 0 的异常情况。
原因分析:
- 在 BUSY 下降沿中断 中读取 AD7606B 通道数据后,直接进行浮点数转换,导致中断处理时间过长。
- 中断处理时间延长会影响后续数据采样的及时性,进而导致 FFT 计算错误。
解决方案:
- 优化中断处理流程:
在 BUSY 下降沿中断中,仅进行数据读取和存储到队列的操作,不做浮点数转换。 - 数据处理调整:
将数据转换为浮点数的操作放到 主任务中,在进行 FFT 计算前完成。 - 效果:
解决了信号幅值偶尔为 0 的问题,FFT 计算结果稳定。
2. 多通道 FFT 队列溢出问题
问题描述:
在实现 4 通道实时采样的 FFT 时没有问题,但当扩展到 6 通道同时进行 FFT 时,出现 数据队列溢出的现象。
原因分析:
- 数据量增大导致 主任务处理速度跟不上数据采样速度。
- 队列长度不足,未及时处理的数据导致溢出。
解决方案:
- 优化队列处理机制:
增加队列长度,调整数据处理优先级,确保主任务能及时处理数据。 - 提高数据处理效率:
精简主任务中与数据处理无关的操作,减少数据处理延迟。 - 效果:
队列溢出问题明显改善,6 通道同时 FFT 运行稳定。
3. 定时器中断频繁导致系统性能下降
问题描述:
使用定时器中断控制 CONVST 引脚 触发 AD7606B 进行数据采样时,定时器中断过于频繁,导致主任务频繁被打断,影响系统性能。
原因分析:
- 定时器中断频率高,占用大量 CPU 时间,降低了系统的整体响应速度。
- 中断嵌套过多,影响数据处理的实时性。
解决方案:
- 改用 PWM 方式生成 CONVST 采样信号:
利用 定时器的 PWM 输出功能 控制 CONVST 引脚,代替频繁的中断触发方式。 - 优化中断使用:
仅在必要时使用中断,避免高频率的定时器中断干扰主任务。 - 效果:
显著降低了系统中断频率,提高了系统性能和实时数据处理能力。
总结
- 中断优化: 降低中断处理的复杂度,将数据处理任务尽量放到主任务中。
- 数据处理效率: 合理使用队列和缓冲区,确保数据流的实时性。
- 系统性能提升: 使用硬件 PWM 替代软件中断,减少系统负担。
以上是 AD7606B 调试过程中遇到的主要问题及解决方案总结。