本文将介绍如何使用STM32F407的HAL库实现单通道ADC采集,并通过串口将采集到的电压值打印出来。具体地,我们将使用ADC1读取通道5(对应引脚PA5),并将转换后的电压值用串口1发送到串口助手上进行显示。
一、开发环境
硬件:正点原子探索者 V3 STM32F407开发板
单片机:STM32F407ZGT6
Keil版本:5.32
STM32CubeMX版本:6.9.2
STM32Cube MCU Packges版本:STM32F4 V1.27.1
二、配置STM32CubeMX
- 启动STM32CubeMX,新建STM32CubeMX项目:
- 选择MCU:在软件中选择你的STM32型号-STM32F407ZGT6。
-
选择时钟源:
- 配置时钟:
- 使能Debug功能:Serial Wire
- HAL库时基选择:SysTick
- USART1配置:选择异步模式。
-
开启外部时钟:配置系统时钟,确保ADC和串口的外部时钟已开启。
-
配置ADC:
1)选择ADC1作为采集模块。
2)设置ADC1的通道5(对应引脚PA5)为采集通道。
3)配置采样时间和分辨率。通常,采样时间越长,ADC的转换精度越高,但也会增加转换时间。
4)启用连续转换模式,以便ADC能够持续采集数据。
5)禁用扫描模式,因为我们只采集一个通道。
10.配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。 11.生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。
三、代码实现与部署
-
main.c增加代码:main.c的第1行添加printf的头文件#include<stdio.h>,在 while(1)里增加数行代码。ADC电压换算时用到公式:待测电压=(ADC的返回值/4096)∗3.3V.
/* USER CODE BEGIN Header */ #include<stdio.h> /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc1); // 启动ADC采集 // 轮询ADC转换状态 if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) { adc_value = HAL_ADC_GetValue(&hadc1); // 获取转换后的数字值 // 将数字值转换为电压值并格式化为字符串 sprintf(buffer, "Voltage: %.3fV\r\n", (adc_value / 4096.0) * 3.3); // 发送电压值到串口 printf("%s",buffer); } HAL_Delay(500); // 添加延时 } /* USER CODE END 3 */
- usart.c增加代码:usart.c的第1行添加头文件#include <stdio.h>
#include <string.h>,在末尾用户代码区增加如下代码。printf调用“fputc()”,fgetc(),该函数会使用HAL_UART_Transmit发送数据。/* * 添加如下代码,可不在工程设置中勾选Use MicroLIB */ #pragma import(__use_no_semihosting) struct __FILE { int a; }; FILE __stdout; FILE __stdin; void _sys_exit(int x) { } /***************************************************** *function: 写字符文件函数 *param1: 输出的字符 *param2: 文件指针 *return: 输出字符的ASCII码 ******************************************************/ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10); return ch; } /***************************************************** *function: 读字符文件函数 *param1: 文件指针 *return: 读取字符的ASCII码 ******************************************************/ int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1, 10); return (int)ch; }
- 连接USART1:用USB转TTL工具连接当前硬件USART1的PA9、PA10,GND。
- 打开串口助手:
- 编译代码:Keil编译生成的代码。
-
烧录程序:将编译好的程序用ST-LINK烧录到STM32微控制器中。
四、运行结果
观察结果:一旦程序烧录完成并运行,串口助手打印出PA5的电压,当接地的时候得出的电压值是0,当输入正弦波得到如下结果。
voltage 0.956
Voltage 0.16
Voltage 0.175
Voltage 0.997
Voltage 2.22
Voltage 3.19
Voltage 3.299
Voltage 2.829
Voltage 1.695
Voltage 0.582
Voltage 0.076
Voltage 0.419
Voltage 1.482
Voltage 2.681
Voltage 3.299
Voltage 3.273
Voltage 2.402
Voltage 1.191
Voltage 0.272
Voltage 0.118
Voltage 0.827
Voltage 2.017
Voltage 3.082
Voltage 3.299
Voltage 2.989
Voltage 1.88
Voltage 0.702
Voltage 0.085
Voltage 0.325
Voltage 1.304
Voltage 2.516
Voltage 3.299
Voltage 3.299
Voltage 2.52
Voltage 1.304
Voltage 0.338
Voltage 0.083
Voltage 0.706
Voltage 1.859
Voltage 2.977
Voltage 3.299
Voltage 3.057
Voltage 1.994
Voltage 0.808
Voltage 0.109
Voltage 0.265
Voltage 1.196
导入excel看波形
五、注意事项
1.确保你的开发环境和工具已经正确安装和配置。
2.如果没有打印电压值,按一下复位键,检查连接和电源是否正确,注意根据你所用的硬件来接线,不要接错线了。