文章目录
一、准备工具
STM32F407VE核心板
STM32Cubemx 版本 6.0.1
Keil 版本 5.31
杜邦线
ST-Link
二、前置知识
1.ADC简介
12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。
ADC采集通道分为两组,规则转换和注入转换,每个组包含一个转换序列, 该序列可按任意顺序在任意通道上完成,可理解为注入转换的优先级比规则转换高。本节只使用一个ADC通道,使用规则通道。
2.DMA简介
直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结合在一起,优化了系统带宽。两个DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。
2.STM32Cubemx配置
1.新建工程
选择相应单片机型号
2.时钟源选择及时钟树配置
3.时基选择调试接口选择
4.配置ADC采集
1.选择要配置为ADC采集的引脚
2.开启DMA传输,循环模式
3.选择分辨率,使能ADC持续转换,DMA持续请求
当然分辨率越高,转换所需时间就越长
4.选择触发源
在此我选择了软件触发,也可以使用定时器的PWM信号来触发,可以使采集间隔时间固定,可用来分析信号波形,幅频特性等。
5.生成工程
生成并打开工程。
3.Keil编写代码
/* USER CODE BEGIN PV */
uint16_t ADC_Value[100]={0};
uint32_t Value=0; //存储平均值
float V=0; //存储电压值
/* USER CODE END PV */
为提高准确度,定义数组,取平均值做为测量值
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
/* USER CODE END 2 */
在初始化后开启DMA传输,ADC开始转换
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(int i=0;i<100;i++)
Value+=ADC_Value[i];//求和
Value/=100; //取平均值
V=Value*3300/4096; //ADC最大值为4096,代表3300mV
HAL_Delay(10);
}
/* USER CODE END 3 */
}
主循环内对采集数据求平均,并计算出实际电压。
4.烧录观察
烧录代码后,通过调试观察V变量,可以测量0-3.3V电压(单位mV),如果需要测量更大范围,需要加外围电路,将电压规整到0-3.3V内。
工程下载地址
链接:https://pan.baidu.com/s/1IU4tsS8mzrc5AzWH7XbfhA
提取码:csa1
今天的文章stm32cube adc dma_ADC原理[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/78592.html