stm32学习(二)|ADC电压采集&DMA
利用ADC通道采集外部传感器数值,ADC通道选择依据实际查询芯片手册可得,相关配置利用Cubemx完成。
ADC参数配置
-
首先选择需要使用的ADC通道,并设置对应的引脚ADC_IN0X.
-
ADC参数设置(Paremeter setting)
- Mode : Independent mode,只使用一个ADC通道
- Clock Prescaler,Resolution采用默认,因为时钟在一开始已经配置好了。
- Date Alignment: 右对齐
- Sacan Conversion mode:如果是多通道,使能
- Continuous conversion mode:使能,自动连续转换
- DiscontinuousConvMode :与上面对应,二者选一个
- DMA:使能,转换的数据直接通过DMA传输到储存空间,常用搭配;
- End Of Conversion Selection :默认不用管
- Number Of Conversion :依据使用的通道数量选择;
- Rank: 不同通道的排序
-
使能中断(NVIC Settings)
- 使用ADC中断
-
-
add:添加DMA,其中数据方向需要注意,一般是外设到内存;
Stm32 F4具有两个DMA控制器,每个DMA控制器具有8个数据流,即对应8个外设请求。在实现DMA传输之前,DMA 控制器会通过配置寄存器选择对应的通道作为该数据流的目标外设。F4系列的DMA请求映射如图
因此这里选择DMA2。
-
Mode:circular,连续传输模式
-
Data Wdith:这里提供了Byte,Halfword 以及Word选项,其中一个字节8位,stm32是32位,所以一个word对应32位,所以Half Word对应16位,这里的选择主要根据传输数据的大小,因为利用ADC采集数据,其精度为12位,所以这里的Data Width采用Half Word即可。
-
代码修改
这里主要说一些几个关键的代码
-
由于DMA采用连续传输模式,因此ADC采集到的数据会不断传输至储存器中,这里设置一个数组:
uint32_t ADC_Value[100];
ADC采集到的数据不断的储存到ADC_Value中,这个过程有DMA控制,不需要cpu参与,读取数组中的值就可以得到采集的数据,ADC_Value[0]为Rank1通道采集到的数据,这个Rank可以在Cube里面设置。
-
关于DMA的优先级,Cube配置的时候可以设置为四级,优先级高的先传输,但是当所有的优先级一样时,按照rank编号来。
-
开启ADC_DMA转换
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef * hadc, uint32_t * pData, uint32_t Length)
Enables ADC, starts conversion of regular group and transfers result through DMA.
-
中断回调函数
HAL_ADC_ConvCpltCallback()
-
一般设计时默认ADC输入电压0~3.3V,ADC精度12位,ADC电压转换公式为:
参考资料
作者:PhoenixTree
出处:https://www.cnblogs.com/PhoenixTree/p/16642042.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具