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”。 配置ADC1
将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 */
1
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 */
1
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 */
1
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 */
1
2
3
4
5
6
7
8
9
10
11

# 11.4.4 ADC采样项目下载验证

# 现象与步骤

ST-LINK下载器连接嵌入式学习板的烧录接口和电脑端,点击STM32CubeIDE软件开发界面中的“Run”按钮,一键完成代码程序的编译下载。通过OLED显示屏观察到电位器电压动态刷新。 配置ADC1