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

[复制链接]
2464|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. 创建工程选择主控

44333637da66737e81.png
 楼主| SHOPQQ 发表于 2022-11-23 12:51 | 显示全部楼层
系统配置

配置时钟源
92756637da6c7ea02e.png
 楼主| SHOPQQ 发表于 2022-11-23 12:51 | 显示全部楼层
配置debug模式(如果需要ST-Link下载及调试可以勾选)
93547637da6e1ea7dd.png
 楼主| SHOPQQ 发表于 2022-11-23 12:52 | 显示全部楼层
配置时钟树(可以直接在HCLK那里输入72,然后敲回车会自动配置。
4155637da6fe14067.png
 楼主| SHOPQQ 发表于 2022-11-23 12:52 | 显示全部楼层
注意最后的ADC时钟,时钟频率最大14MHZ,因此这里设置6分频,刚好小于14。
 楼主| SHOPQQ 发表于 2022-11-23 12:59 | 显示全部楼层
配置工程目录 23543637da8403f354.png
 楼主| SHOPQQ 发表于 2022-11-23 13:01 | 显示全部楼层
 楼主| SHOPQQ 发表于 2022-11-23 13:02 | 显示全部楼层
配置用到的外设

串口1配置(用于输出结果)
46327637da952428c5.png
 楼主| SHOPQQ 发表于 2022-11-23 13:04 | 显示全部楼层
 楼主| SHOPQQ 发表于 2022-11-23 13:05 | 显示全部楼层
ADC配置(四选一)

有如下情况:

单通道轮询
单通道中断
多通道轮询
DMA模式(单通道、多通道都能用)
 楼主| 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 开启间断模式。
 楼主| SHOPQQ 发表于 2022-11-23 13:08 | 显示全部楼层
ADC_Regular_ConversionMode:
Enable Regular Conversions 是否使能规则转换。
Number Of Conversion ADC转换通道数目,有几个写几个就行。
External Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。
 楼主| SHOPQQ 发表于 2022-11-23 13:09 | 显示全部楼层
Rank:
Channel ADC 转换通道
Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。
 楼主| SHOPQQ 发表于 2022-11-23 13:10 | 显示全部楼层
WatchDog:Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
 楼主| SHOPQQ 发表于 2022-11-23 13:12 | 显示全部楼层
单通道轮询

第一步:配置ADC
36426637dab3a6e4b2.png
 楼主| SHOPQQ 发表于 2022-11-23 13:15 | 显示全部楼层
第二步:点击生成代码
 楼主| SHOPQQ 发表于 2022-11-23 13:42 | 显示全部楼层
第三步:串口重定向,在usart.c中添加如下代码。具体的参考上一篇文章串口使用
  1. // 需要调用stdio.h文件
  2. #include <stdio.h>
  3. //取消ARM的半主机工作模式
  4. #pragma import(__use_no_semihosting)//标准库需要的支持函数                 
  5. struct __FILE
  6. {
  7.         int handle;
  8. };
  9. FILE __stdout;      
  10. void _sys_exit(int x) //定义_sys_exit()以避免使用半主机模式
  11. {
  12.         x = x;
  13. }

  14. int fputc(int ch, FILE *f)
  15. {  
  16.         HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  17.         return ch;
  18. }
 楼主| SHOPQQ 发表于 2022-11-23 13:45 | 显示全部楼层
第四步:编写 main.c 代码 其他的什么都不用改
  1.   while (1)
  2.   {
  3.                 // 开启ADC
  4.                 HAL_ADC_Start(&hadc1);
  5.                 // 开始轮询转换
  6.                 HAL_ADC_PollForConversion(&hadc1,100);
  7.                 // 存储转换的值
  8.                 float value = 0;
  9.                 // 查询ADC状态
  10.                 uint32_t state = HAL_ADC_GetState(&hadc1);
  11.                 if (( state & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
  12.                 {
  13.                         // 获取ADC转换结果
  14.                         value = HAL_ADC_GetValue(&hadc1);
  15.                         printf("adc value:%f \r\n",value/4096.0*3.3);
  16.                 }
  17.                 else
  18.                 {
  19.                         printf("adc state %d \r\n",state);
  20.                 }
  21.                 // 关闭ADC
  22.                 HAL_ADC_Stop(&hadc1);
  23.                 HAL_Delay(1000);
  24.     /* USER CODE END WHILE */

  25.     /* USER CODE BEGIN 3 */
  26.   }
 楼主| SHOPQQ 发表于 2022-11-23 13:45 | 显示全部楼层
效果验证
64530637db39139534.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

183

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部