【ADC 转换】读取电位器电压
下载例程代码: 下载代码
注意
请一定按照 例程使用方法 🔗 导入例程,否则下载的可能不是例程而是其他工程。
通过 ADC 读取电位器的电压值
如何使用例程
下载程序,并连接 USB 虚拟串口线,即可看到效果
硬件连接
- 使用配套 TYPE-C 数据线,将学习板连接到计算机

程序效果
- 打开 小智精灵 串口助手 在线串口调试助手,点击“选择串口”,选择 USB Single Serial,即可收到 ADC 转换结果,如图所示

-
程序会连续读取 PA5 的输入电压值,而 PA5 的电压值是由电位器 VOL 决定的,使用螺丝刀调节学习板上的电位器,即可观察到对应的数据变化。
数据变化范围 0-4095,对应着 PA5 的电压值 0-3.3V

例程讲解
下面介绍了如何自己实现该例程的功能
1、工程配置
-
打开 ADC1:在 Pinout&Configuration 页面,将 PA5 设置为 ADC1_IN5
-
配置 ADC:在 Pinout&Configuration -> Analog -> ADC1 -> Configuration 中
- ADC_Settings -> Continuous Conversion Mode 设为 Enable,使 ADC 转换持续进行,不需要每次获取之前手动触发转换
- ADC_Regular_ConversionMode -> Rank -> Sampling Time 设为 239.5 Cycles,最长采样时间,可以获得更稳定的转换结果
-
打开串口 2 外设:Pinout&Configuration -> Connectivity -> USART2,将 Mode 选择为 Asynchronous
-
启用 float 打印:在 cubeIDE 菜单栏中,Project Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU Settings,勾选 Use float with printf ... -nano
默认情况下,sprintf 函数不能打印小数。因此我们需要配置一下编译器,使其能够打印小数
2、代码
(1) 初始化过程
- 引用头文件:需要使用 sprintf 打印输出,以及数学函数,在 main.c 引用头文件:
#include "stdio.h"
#include "string.h"
#include "math.h"
- 启动连续 ADC 转换
// 启动连续ADC转换
HAL_ADC_Start(&hadc1);
// 等待ADC稳定
HAL_Delay(500);
(2) 读取 ADC 结果
// 获取ADC值
result = HAL_ADC_GetValue(&hadc1);
// 计算电压值:电压 = ADC结果 × 3.3V ÷ 4095
voltage = result * 3.3f / 4095;
// 将变量打印为字符串
sprintf(send_buf, "原始值: %d,电压值: %.3f V\r\n", result, voltage);
// 通过串口2发送
HAL_UART_Transmit(&huart2, (uint8_t*) send_buf, strlen(send_buf), 20);