STM32_ADC单通道单次采集

推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang

 

我的网站:https://www.strongerhuang.com

我的知乎:https://www.zhihu.com/people/strongerHuang.com

 

今天提供并讲解的软件工程,基于软件工程“A0.0.0(STM32F10x_TIM延时)”修改而来。若不知道如何而来,请关注微信公众号“strongerHuang”获取更多信息。

本着免费分享的原则,将讲解的工程源代码分享给大家,还望看到的朋友关注一下微信公众号,增加一下人气。

每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。

 

今天的软件工程下载地址(360云盘):

https://yunpan.cn/cPGrE6DLHX24R  访问密码 de4f

 

STM32F10x的资料可以在我360云盘下载:

https://yunpan.cn/crBUdUGdYKam2   访问密码 ca90

 

关于“STM32F103 ADC单通道单次采集” 我把重要的几点在下面分别讲述,若不明白,请关注微信公众号“strongerHuang”查阅或留言。

 

一、RCC时钟配置

 

该函数位于在bsp.c文件下面;

使能RCC时钟:RCC_APB2Periph_ADC1

 

二、引脚配置

 

 

该函数位于在adc.c文件下面;

对AD通道2所使用的引脚进行配置。

问题:

细心的人可能会发现数据手册中PA2引脚的复用功能是“ADC123_IN2”,我们明明使用的ADC1,为什么不是ADC1_IN2或者ADC2_IN2?

大家先想一下为什么是ADC123_IN2,最后我会揭晓答案。

 

三、ADC配置

 

该函数位于在adc.c文件下面;

对AD进行配置。

配置的每一条语句都有注释,请看源代码,重点讲一下“ADC_Channel_2”,这里必须和上面引脚配置对应起来,也就是通道的引脚配置一致才行。

 

四、电压检测

 

 

该函数位于在adc.c文件下面;

调用这个接口就可以采集电压值。

函数使用单通道单次,软件触发采样电压值,这里采样8次(更加自己情况可以选择多次),算平均,最后得出电压值(1000倍值)。

 

五、主函数应用

 

该函数位于在main.c文件下面;

主要就是采集电压,通过串口打印出来(1000倍值)。

 

六、揭晓ADC123_IN2

上面的问题有自己想明白了的吗?

其实很简单的,ADC123_IN2顾名思义,它就是包含了ADC1、ADC2、ADC3的IN2的意思。也就是说,你们使用ADC2的通道2也是这个“ADC123_IN2”通道。

方便大家学习,我把两个工程都上传至360云盘,不行的朋友可以亲自下载代码试试。

对比的软件工程下载地址:

https://yunpan.cn/cPGRAYZrdvdPf 访问密码 2ce1

 

 

我的软件工程排版格式都是严格按照一定的规范排版的,请参见:"软件编辑排版要求及说明.doc "

下载地址(360云盘):https://yunpan.cn/cPGHPUC6SETyG  访问密码6ca7

 

 

我的网站:https://www.strongerhuang.com

我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。

 

微信公众号

 

### 使用 STM32F103 进行 ADC 单通道 DMA 数据采集STM32F103 中,ADC 配置为通过 DMA 实现单通道数据采集是一种常见的需求。以下是配置过程中的关键点以及完整的代码示例。 #### 1. 初始化时钟 为了使能 ADC 和 DMA 功能模块,需要先开启对应的外设时钟。对于 STM32F103 来说,通常会启用 `RCC_APB2Periph_ADC1` 和 `RCC_AHBPeriph_DMA1` 的时钟[^2]。 ```c // 启用 ADC 和 DMA 外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); ``` #### 2. 配置 GPIO 引脚 假设我们使用 PA0 (ADC_IN0) 作为输入通道,则需将其设置为模拟模式。 ```c GPIO_InitTypeDef GPIO_InitStruct; // 配置 PA0 为模拟输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 3. 配置 ADC 参数 初始化 ADC 并选择所需的参数,例如采样时间、分辨率等。这里我们将 ADC 设置为连续转换模式并仅扫描单一通道。 ```c ADC_InitTypeDef ADC_InitStruct; // 配置 ADC 初始化结构体 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 独立模式 ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 关闭扫描模式(因为我们只关注一个通道) ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 开启连续转换模式 ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 不使用外部触发 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_InitStruct.ADC_NbrOfChannel = 1; // 只有一个通道 ADC_Init(ADC1, &ADC_InitStruct); // 配置具体要使用的通道 (此处为 Channel 0) ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); ``` #### 4. 配置 DMA 控制器 DMA 被用来自动传输 ADC 结果到内存缓冲区中。下面是如何配置 DMA 的例子: ```c DMA_InitTypeDef DMA_InitStruct; // 配置 DMA 初始状态 DMA_DeInit(DMA1_Channel1); // 清除之前的配置 DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR); // 设定外设地址为 ADC DR 寄存器 DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)adc_buffer; // 缓冲数组首地址 DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; // 方向是从外设读取至存储器写入 DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE; // 定义缓冲大小 DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设不增量 DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; // 存储器增量 DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 半字节宽度匹配 ADC 输出 DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 半字节宽度匹配目标缓存 DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // 循环模式 DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 高优先级 DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; // 禁止存储器到存储器转移 DMA_Init(DMA1_Channel1, &DMA_InitStruct); // 启动 DMA 请求 DMA_Cmd(DMA1_Channel1, ENABLE); ``` #### 5. 将 ADC 绑定到 DMA 上 最后一步是将 ADC 的 DMA 请求绑定到指定的 DMA 信道上,并启动 ADC。 ```c // 配置 ADC 使用 DMA ADC_DMACmd(ADC1, ENABLE); // 启动 ADC 转换 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); // 校准重置 while (ADC_GetResetCalibrationStatus(ADC1)); // 等待校准完成 ADC_StartConversion(ADC1); ``` 以上步骤完成后,每当 ADC 执行一次新的测量时,其结果会被自动复制到预定义好的缓冲区内。 --- ### 注意事项 - 如果希望实现更复杂的操作比如多通道轮询或者中断处理机制,则可能还需要进一步调整上述基础框架下的细节设定。 - 对于某些特定应用场合下可能会遇到噪声干扰等问题影响最终精度表现,在这种情况下可以考虑增加滤波电路或是采用平均算法来提高稳定性[^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strongerHuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值