【发布时间】:2020-07-08 03:02:12
【问题描述】:
我将 ADC 与 DMA(STM32F4,ide STM32CubeIDE)一起使用,我认为我了解它的工作原理,但仍有一个难题。据我了解,只有在 DMA 传输完成时才会调用 MCU,基本上 MCU 会在 DMA ADC 完成时进入这个函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
对吗?
如果这是真的,我有下一个难题:例如 adc_clock 是 10MHz,采样时间是 480 adc_cycles,12 位 adc 分辨率。 adc_sample_period = 1/10Mhz * (480 + 12 + 3) = 49.5uS。这意味着 MCU 将每 49.5uS 进入 HAL_ADC_ConvCpltCallback() ???就我的观点而言,这是一项艰巨的任务,尤其是在更大的项目中。有谁知道如何解决这个“问题”?例如,我想每 1mS 读取一次 ADC 结果,但也想将 DMA 实现到 ADC 中。欢迎任何想法
【问题讨论】:
-
您需要从规范开始。你要如何处理 ADC 值,实际需要什么分辨率和实时截止日期等等。如果您不需要硬实时解码信号,那么以高时钟速度捕获每个 ADC 转换是没有意义的。
-
@Lundin 我知道我将如何处理 adc 值。它将在公式中用于计算电流。分辨率为 12bit (0-4095) ,我在上面的文字中强调了这一点。我同意这样的说法,即每次读取 adc 为 49.5uS 是在浪费 MCU 资源。我需要每 1mS 一次 adc 值,也许是为了触发 ADC DMA?
-
先调低 ADC 转换时钟?
-
最小 adc 时钟为 5Mhz。 (APB2 / add_prescaler) = (40Mhz / 8) = 5Mhz。所以 1/5Mhz*(480 + 12 + 3) = 99uS 这对我来说太难了。我会尝试将计时器,我会报告结果