11.4 ADC项目:单通道电压采样
# 11.4 ADC项目:单通道电压采样
本实验通过STM32的ADC模块实现单通道电压采集,结合OLED实时显示电压值,覆盖独立模式与连续模式两种采样方式。
核心功能:
- 独立模式:手动触发单次采样,适用于低功耗或精准触发场景。
- 连续模式:自动循环采样,适合实时监测动态信号。
# 11.4.1 硬件电路设计
# 电位器连接与ADC通道
- 电位器电路:开发板集成滑动变阻器,动触点连接至ADC1通道6(PA6),输出0~3.3V模拟电压。
# 11.4.2 STM32CubeMX配置
# 1. 建立新工程
① 建立一个新的STM32工程;
② 选择芯片“STM32F103C8T6”;
③ 设置工程的名称为“11 ADC”;
④ 选择SWD调试方式;
⑤ 开启外部高速时钟源并修改主频为72MHz。
# 2. 配置ADC1
① 点击“Pinout&Configuration”标签页;
② 在左侧导航栏中点击“Analog";
③ 双击“ADC1”进行配置;
④ 勾选需要使用的ADC通道“IN6”。
将ADC的工作参数设置如下:
- Scan Conversion Mode:Disabled
- Continuous Conversion Mode:Disabled
- Sampling Time:239.5 Cycles
# 3. 配置I2C1
参考第9章,使能I²C。
# 4. 生成代码
勾选生成单独外设文件,保存生成工程代码。
# 11.4.3 软件设计
# 1. 引用相应头文件
在“/* USER CODE BEGIN Includes /”与“/ USER CODE END Includes */”注释之间的代码块引用相应头文件,用于调用OLED驱动函数及输入输出库。
/* USER CODE BEGIN Includes */
#include "oled.h" // 引入OLED显示屏驱动相关的头文件
#include <string.h> // 引入C标准字符串处理头文件
#include <stdio.h> // 引入C标准输入输出头文件
/* USER CODE END Includes */
2
3
4
5
# 2. 初始化变量
在“/* USER CODE BEGIN 2 /”与“/ USER CODE END 2 */”注释之间的代码块添加全局变量声明,用于显示字符串和编码值。
/* USER CODE BEGIN 2 */
int value = 0;
float voltage = 0.0;
char Message[20] = "";
HAL_Delay(50);
OLED_Init();
HAL_ADCEx_Calibration_Start(&hadc1);
/* USER CODE END 2 */
2
3
4
5
6
7
8
# 3. 采样和显示代码
在main( )函数的while循环中实现周期性采样:调用HAL_ADC_Start( )启动转换,使用HAL_ADC_PollForConversion( )轮询等待转换完成,通过HAL_ADC_GetValue( )读取原始数值,将原始值转换为实际电压,使用sprintf( )格式化字符串并通过OLED显示。在main( )函数的while(1)主循环中。在“/* USER CODE BEGIN WHILE /”与“/ USER CODE END WHILE */”注释块中插入代码,用于读取ADC值并将其转换为电压值,然后显示在OLED屏幕上。
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
value = HAL_ADC_GetValue(&hadc1);
voltage = (value / 4095.0) * 3.3;
sprintf(Message,"ADC: %d %0.2fV",value,voltage);
OLED_NewFrame();
OLED_PrintString(0, 0, Message, &font16x16, OLED_COLOR_NORMAL);
OLED_ShowFrame();
HAL_Delay(500);
/* USER CODE END WHILE */
2
3
4
5
6
7
8
9
10
11
12
13
14
# 4.连续单通道电压采集
连续转换模式下,ADC会持续不断地进行转换,不用等待当前转换完成,所以可以去掉转换完成函数。即在“/* USER CODE BEGIN WHILE /”与“/ USER CODE END WHILE */”注释块中插入以下代码。
/* USER CODE BEGIN WHILE */
while (1)
{
value = HAL_ADC_GetValue(&hadc1);
voltage = (value / 4095.0) * 3.3;
sprintf(Message,"ADC: %d %0.2fV",value,voltage);
OLED_NewFrame();
OLED_PrintString(0, 0, Message, &font16x16, OLED_COLOR_NORMAL);
OLED_ShowFrame();
HAL_Delay(500);
/* USER CODE END WHILE */
2
3
4
5
6
7
8
9
10
11
# 11.4.4 ADC采样项目下载验证
# 现象与步骤
ST-LINK下载器连接嵌入式学习板的烧录接口和电脑端,点击STM32CubeIDE软件开发界面中的“Run”按钮,一键完成代码程序的编译下载。通过OLED显示屏观察到电位器电压动态刷新。