打印
[STM32F4]

STM32CubeMX系列05——ADC(轮询、中断、DMA)

[复制链接]
1109|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SHOPQQ|  楼主 | 2022-11-23 12:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
所用硬件

正点原子Mini板,主控 STM32F103RCT6.

用到的外设:

  • 串口1(PA9、PA10)
  • 任意几个GPIO口(这里用PA1、PA2、PA3,对应ADC通道1、2、3)。

使用特权

评论回复
沙发
SHOPQQ|  楼主 | 2022-11-23 12:49 | 只看该作者
生成工程

2.1. 创建工程选择主控

使用特权

评论回复
板凳
SHOPQQ|  楼主 | 2022-11-23 12:51 | 只看该作者
系统配置

配置时钟源

使用特权

评论回复
地板
SHOPQQ|  楼主 | 2022-11-23 12:51 | 只看该作者
配置debug模式(如果需要ST-Link下载及调试可以勾选)

使用特权

评论回复
5
SHOPQQ|  楼主 | 2022-11-23 12:52 | 只看该作者
配置时钟树(可以直接在HCLK那里输入72,然后敲回车会自动配置。

使用特权

评论回复
6
SHOPQQ|  楼主 | 2022-11-23 12:52 | 只看该作者
注意最后的ADC时钟,时钟频率最大14MHZ,因此这里设置6分频,刚好小于14。

使用特权

评论回复
7
SHOPQQ|  楼主 | 2022-11-23 12:59 | 只看该作者
配置工程目录

使用特权

评论回复
8
SHOPQQ|  楼主 | 2022-11-23 13:01 | 只看该作者

使用特权

评论回复
9
SHOPQQ|  楼主 | 2022-11-23 13:02 | 只看该作者
配置用到的外设

串口1配置(用于输出结果)

使用特权

评论回复
10
SHOPQQ|  楼主 | 2022-11-23 13:04 | 只看该作者

使用特权

评论回复
11
SHOPQQ|  楼主 | 2022-11-23 13:05 | 只看该作者
ADC配置(四选一)

有如下情况:

单通道轮询
单通道中断
多通道轮询
DMA模式(单通道、多通道都能用)

使用特权

评论回复
12
SHOPQQ|  楼主 | 2022-11-23 13:06 | 只看该作者
设置说明:

ADC_Settings:
Data Alignment:
Right alignment :转换结果数据右对齐,一般我们选择右对齐模式。
Left alignment 转换结果数据左对齐。
Scan Conversion Mode:
Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
Continuous Conversion Mode:
Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
Enabled 自动连续转换。
DiscontinuousConvMode:
Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。
Enabled 开启间断模式。

使用特权

评论回复
13
SHOPQQ|  楼主 | 2022-11-23 13:08 | 只看该作者
ADC_Regular_ConversionMode:
Enable Regular Conversions 是否使能规则转换。
Number Of Conversion ADC转换通道数目,有几个写几个就行。
External Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。

使用特权

评论回复
14
SHOPQQ|  楼主 | 2022-11-23 13:09 | 只看该作者
Rank:
Channel ADC 转换通道
Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。

使用特权

评论回复
15
SHOPQQ|  楼主 | 2022-11-23 13:10 | 只看该作者
WatchDog:Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。

使用特权

评论回复
16
SHOPQQ|  楼主 | 2022-11-23 13:12 | 只看该作者
单通道轮询

第一步:配置ADC

使用特权

评论回复
17
SHOPQQ|  楼主 | 2022-11-23 13:15 | 只看该作者
第二步:点击生成代码

使用特权

评论回复
18
SHOPQQ|  楼主 | 2022-11-23 13:42 | 只看该作者
第三步:串口重定向,在usart.c中添加如下代码。具体的参考上一篇文章串口使用
// 需要调用stdio.h文件
#include <stdio.h>
//取消ARM的半主机工作模式
#pragma import(__use_no_semihosting)//标准库需要的支持函数                 
struct __FILE
{
        int handle;
};
FILE __stdout;      
void _sys_exit(int x) //定义_sys_exit()以避免使用半主机模式
{
        x = x;
}

int fputc(int ch, FILE *f)
{  
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
        return ch;
}

使用特权

评论回复
19
SHOPQQ|  楼主 | 2022-11-23 13:45 | 只看该作者
第四步:编写 main.c 代码 其他的什么都不用改
  while (1)
  {
                // 开启ADC
                HAL_ADC_Start(&hadc1);
                // 开始轮询转换
                HAL_ADC_PollForConversion(&hadc1,100);
                // 存储转换的值
                float value = 0;
                // 查询ADC状态
                uint32_t state = HAL_ADC_GetState(&hadc1);
                if (( state & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
                {
                        // 获取ADC转换结果
                        value = HAL_ADC_GetValue(&hadc1);
                        printf("adc value:%f \r\n",value/4096.0*3.3);
                }
                else
                {
                        printf("adc state %d \r\n",state);
                }
                // 关闭ADC
                HAL_ADC_Stop(&hadc1);
                HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

使用特权

评论回复
20
SHOPQQ|  楼主 | 2022-11-23 13:45 | 只看该作者
效果验证

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

183

帖子

0

粉丝