我能以多快的速度读取二维数组的 ADC?

Posted

技术标签:

【中文标题】我能以多快的速度读取二维数组的 ADC?【英文标题】:How fast can I read an ADC of a 2-dimensional array? 【发布时间】:2021-04-09 23:02:16 【问题描述】:

我有一个应用程序,它必须控制阵列 32x32 元素的 ADC 读数。 对于每个元素,我必须选择点 - 读取 ADC - 关闭 ADC。目前我正在使用像 LED 扫描这样的扫描方法。每次扫描我读 1 分。然后将值存入数组并传输。

但是,我发现这非常慢。我想使用 DMA 自动读取,然后我需要做的就是传递它。 有没有办法做到这一点?

【问题讨论】:

借助 DMA,您可以自动将转换后的值从 ADC 传输到内存,仅此而已。我不明白你的申请。每次 ADC 转换之前是否必须设置一些 GPIO?如果每个模拟值都有一个 ADC 通道,则可以使用 DMA 数据传输创建自动 ADC 通道扫描。 我读取了二维数组中每个光电管的 ADC 值。目前,对于每个 ADC 读数,我必须使用 GPIO 来触发 MUX 并读取 DEMUX 上的信号。通过这种方式,CPU 必须大量工作。 您是否使用中断来表示 ADC 转换结束?您对一个完整的测量周期的预期时间是多少?目前是多长时间? 我需要传输 9Kb / s。我现在不使用中断,我还没有使用 DMA。我看到了 DMA 同时读取多个通道的应用。我正在以正常的方式阅读。选择列-选择行-读取-存储到缓冲区-当数组被读出时,它将被传输。所以我问了一个问题:我如何更快地读取 - 写入 - 传递我的数组。我达到了预期速度的一半 我认为 DMA 在这种情况下不会帮助您。尝试使用中断来结束 ADC 转换。这可以减少测量之间的时间。您可以更进一步,在“EOSMP”ISR 处触发 IO 开关。 【参考方案1】:

我不太明白你的问题。

假设您要从 ADC MCU 输入引脚上的外部信号读取数据。

我首先向您推荐两种 ADC 读取该数据的解决方案:

    将您的 ADC 配置为连续模式。 将您的 ADC 配置为单模式,并配置另一个外设(如定时器),以在每个事件时触发 ADC 启动转换。

其次,有两种不同的方式来管理转换后的数据:

    在 ADC 的每次转换结束中断后,您可以手动存储数据并执行您的操作。

    void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef AdcHandle) / 获取正则通道的转换值 */ uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);

    配置一个 DMA 处理程序,它将处理 ADC 转换的数据并将其自动存储在 RAM 中,而无需 CPU 干预。 #define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 32) /* 数组大小 aADCxConvertedData[] */

静态 uint16_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];

HAL_ADC_Start_DMA(&AdcHandle,uint32_t *)aADCxConvertedData,ADC_CONVERTED_DATA_BUFFER_SIZE

您会在参考手册中找到很多详细信息。

【讨论】:

DMA 在这里没有用,因为他想决定是否要读取每个电池的电压

以上是关于我能以多快的速度读取二维数组的 ADC?的主要内容,如果未能解决你的问题,请参考以下文章

检查一个数字是不是是一个完美的正方形

检查一个数字是不是是一个完美的正方形

Netperf测试技巧

Netperf测试技巧

为啥在 C# 中的二维数组中按列写入速度很慢

C++如何读取CSV文件并赋值到二维数组里