stm32cubeMX配置ADC多通道采集(非dma和中断方式)

本文详细介绍了如何使用STM32CubeMX配置ADC进行多通道非DMA非中断方式的数据采集。通过设置扫描模式、单次转换模式和间断转换模式,实现对指定通道的逐个转换,并通过HAL库函数控制每个通道的启动和停止,以获取ADC转换结果。在代码实现部分,展示了如何在主循环中调用HAL库函数进行ADC操作,确保每个通道都被正确转换并打印结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32cubeMX配置ADC多通道采集(非dma和中断方式)

stm32cubeMX配置ADC多通道采集(非dma和中断方式)

在百度搜索ADC多通道采集,大部分的都是基于采用dma模式才实现的。而我讲的使用非dma方法。首先有几个概念要搞清楚:

扫描模式(想采集多通道必须开启):是一次对所选中的通道进行转换,比如开了ch0,ch1,ch4,ch5。Ch0转换完以后就会自动转换通道0,1,4,5直到转换完。但是这种连续性并不是不能被打断。这就引入了间断模式,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道配置为一组。这样每一组转换之前都需要先触发一次。

Stm32 ADC的单次模式和连续模式。这两中模式的概念是相对应的。这里的单次模式并不是指一个通道。假如你同时开了ch0,ch1,ch4,ch5这四个通道。单次模式转换模式下会把这四个通道采集一边就停止了。而连续模式就是这四个通道转换完以后再循环过来再从ch0开始。

另外还有规则组和注入组的概念,因为我这个例程只用到了规则组,就不多介绍这两个概念,想要弄清楚请自行查阅手册。

下面进入正题,配置stm32cubeMX。
在这里插入图片描述先使能几个通道,我这里设置为0、1、4、5.

然后就要配置ADC的参数:
在这里插入图片描述目前经过我的测试,要想用非dma和中断模式只有这样配置可以正确进行多通道转换:扫描模式+单次转换模式+间断转换模式(每个间断组一个通道)。

分析配置成这样的模式,扫描模式是在配置为多个通道必须打开的,stm32cubeMX上也默认好了,只能enable。单次转换模式是我不需要不停的去采集每个通道值,而是把四个通道采集完以后就让它停止。这里间断配置是关键,间断模式可以让扫描的四个通道进行分成四个组,stm32cubeMX参数里面number of Discontinous Conversions是配置间断组每个组有几个通道的,这里必须配置为1(否则在获取ad值得时候只能读取到每个间断组最后一个通道)。

生成mdk工程代码。这时候还没有完成,只是实现了ADC的初始化,需要采集这四个通道值得函数还要自己写。下面这个是我main函数的while循环:

for(i=1;i<5;i++)

{

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1,0xffff);

adcBuf[i]=HAL_ADC_GetValue(&hadc1);

printf("------ch:%d--%d-------\r\n",i,adcBuf[i]);

}

HAL_ADC_Stop(&hadc1);

HAL_Delay(1000);

调用hal库接口函数也需要注意,HAL_ADC_Start一定要放在for里面,即每一个通道都要触发。四个通道都采集完了,再去调用HAL_ADC_Stop(&hadc1);结束本次ADC采集。

### 使用 STM32CubeMX 配置 ADC 进行多次采样并使用 DMA 传输 #### 准备工作 为了实现通过DMA进行ADC多次采样的配置,在STM32CubeMX软件中需完成如下设置: - 打开STM32CubeMX工具,创建新项目并选择合适的MCU型号。 - 在Pinout & Configuration界面找到并展开“Analog”选项卡下的ADC模块。 #### ADC参数设定 对于希望使用的ADC通道(例如`ADC1_IN1`),应将其状态设为启用,并调整相应的采样时间以满足精度需求[^3]。此外,还需特别注意以下几点来支持多通道DMA功能: - **Channel Selection**: 根据实际硬件连接情况挑选参与测量的模拟输入端口。 - **Sampling Time**: 合理规划各通道间的转换间隔,确保获得稳定可靠的读数。 - **Scan Conversion Mode**: 开启此模式允许连续遍历所有选定的通道执行A/D变换操作[^2]。 #### DMA控制器初始化 为了让DMA能够自动处理来自ADC的数据流,必须正确地配置DMA资源: - 寻找RCC时钟树中的DMA外设开关,开启对应实例的服务权限。 - 设置好目标存储区地址、每次传输单元数量以及方向等属性;这里建议采用循环缓冲机制以便于后续编程逻辑简化。 - 将DMA请求映射到特定事件上——比如每当一次完整的序列扫描结束之后触发一次DMA事务提交动作[^4]。 #### 中断服务程序编写 尽管主要依靠DMA搬运数据,但仍有必要定义ISR用于监控整个过程的状态变化或是响应异常状况的发生。可以考虑利用HAL库提供的API函数快速搭建框架结构,如下面这段伪代码所示: ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ /* 当前批次全部样本均已就绪 */ } ``` 以上即完成了基于STM32CubeMX平台下针对ADC-DMA联合工作的基本环境构建流程概述[^1]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值