ST意法半导体
直播中

刘满贵

7年用户 1490经验值
私信 关注
[问答]

如何在STM32H745上获得最大ADC采样率?

我正在使用 STM32H745 并试图让 ADC 以 3.333 MSPS 运行。目前我正在 Nucleo-144 开发板上制作原型,上面有一个 LQFP144 封装 MCU。虽然根据数据表(第 185 页),我应该能够以 16 位分辨率以高达 3.6 或 3.35 MSPS 的速度运行 ADC,但我找到了一些信息(第 15 页)这表明除非我降低位分辨率,否则 ADC 无法运行得那么快。由于 ADC 跟不上,我尝试将它降低到 10 位,因为实际数据对于这个原型并不重要(我们将在我们的定制板上使用 TFBGA 芯片,虽然不是最好的,但更好)。但 ADC 的运行速度似乎仍然是我想要的速度的一半左右。我正在使用进入 ADC3 的直接通道以获得最佳采样率。我正在使用 DMA 将样本存入内存。我目前只使用M7核心。
我在 CubeMX 中设置了 ADC3:
时钟预分频器:异步时钟模式除以 1
分辨率:ADC 10 位分辨率
Left Bit Shift: 6 bits shift(仔细看,生成的代码可能实际上没有设置)
转换数据管理:DMA One Shot 模式
外部触发转换源:定时器 8 触发输出 2 事件
External Trigger Conversion Edge:上升沿触发检测
采样时间:1.5 个周期(仅使用 1 个通道)
时钟设置:
M7时钟480MHz,M4时钟240MHz
APB1 和 APB2 时钟(用于定时器)设置为 240MHz
ADC 时钟设置为 36MHz(我也按照数据表的建议尝试了 37MHz 和 2.5 个周期的采样时间)
定时器 8 设置:
预分频器:0
计数器周期:71 (240MHz / 72 = 3.333 MHz)
触发事件选择 TRGO2:输出比较 (OC1REF)
通道 1:PWM 生成 CH1
脉冲:35(用于 50% 占空比触发)
这里有点复杂,因为我使用定时器 4 来触发定时器 8,并使用定时器 4 输出来触发设置来自 ADC 的 DMA 传输,但这似乎按预期工作。我正在使用定时器 5 来计算从开始 DMA 传输到获得传输完成中断所需的时间。现在我能做的最好的是在大约 41us 内完成 64 个样本,包括 DMA 设置时间,这似乎是 1-2us 的数量级。所以这使我的每个样本大约为 0.6us,而不是 0.3us。
如果我将定时器 8 的预分频器更改为 1(速度减半),时序看起来相同,因此 ADC 似乎以更快的速率忽略来自定时器 8 的所有其他触发器。事实上,我可以进行一次更改并且一切都像我预期的那样工作,这似乎意味着 ADC 设置正确,它只是不能像我想要的那样运行得那么快。在 16、10 和 8 位之间调整位分辨率似乎不会对时序产生任何影响。
有什么我想念的吗?ADC 应该如何应对过于频繁的触发?特别是在指定速率内运行它的情况下,但对于给定的包来说可能太快了。
编辑:做了更多的挖掘,它没有正确地将 ADC 设置为 8 位模式。显然,不同的修订版对 8 位模式使用不同的值,但生成的代码使用的函数并不是检查该值的函数。出于某种原因,生成的代码也没有设置左移设置。现在我想知道在这结束之前我会发现生成的代码还有多少问题......(或者更糟的是,我找不到的问题)









回帖(1)

谢芳芳

2023-1-30 11:29:16
你读过这个吗?可能有关系。
https://community.st.com/s/question/0D53W00000FP7j8SAD/adc-only-half-of-the-programmed-sample-rate-specs-changed
> ADC 应该如何应对过于频繁的触发?特别是在指定速率内运行它的情况下,但对于给定的包来说可能太快了。
我想封装规格是由于硬件信号限制,而不是架构的变化。我只是希望 ADC 读数很差。
举报

更多回帖

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