波特律动
课程中心/STM32基础教程/【ADC转换】读取电位器电压

【ADC转换】读取电位器电压

下载例程代码: 

注意

CubeIDE:请按照 例程使用方法🔗 导入例程,否则下载的可能不是例程而是其他工程。

Keil:请使用 ArmCC V6 编译,否则可能会出现编译错误。点击此处查看切换编译器方法🔗

通过ADC读取电位器的电压值

如何使用例程

下载程序,并连接USB虚拟串口线,即可看到效果

硬件连接

  • 使用配套TYPE-C数据线,将学习板连接到计算机

程序效果

  • 程序会连续读取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 引用头文件:
C语言
1#include "stdio.h"
2#include "string.h"
3#include "math.h"
  • 启动连续ADC转换
C语言
1// 启动连续ADC转换
2HAL_ADC_Start(&hadc1);
3// 等待ADC稳定
4HAL_Delay(500);

(2) 读取ADC结果

C语言
1// 获取ADC值
2result = HAL_ADC_GetValue(&hadc1);
3// 计算电压值:电压 = ADC结果 × 3.3V ÷ 4095
4voltage = result * 3.3f / 4095;
5// 将变量打印为字符串
6sprintf(send_buf, "原始值: %d,电压值: %.3f V\r\n", result, voltage);
7// 通过串口2发送
8HAL_UART_Transmit(&huart2, (uint8_t*) send_buf, strlen(send_buf), 20);