12.4 DMA项目:多通道电压采样
# 12.4 DMA项目:多通道电压采样
本实验利用STM32的DMA功能实现三路信号(电位器电压、内部温度传感器、内部参考电压)的高效采集,结合OLED实时显示,减少CPU资源占用。
核心功能:
- DMA传输:自动搬运ADC数据至内存,解放CPU。
- 多通道采集:同步采样外部电压、温度、参考电压。
- 实时显示:OLED动态刷新三路信号数值。
# 12.4.1 STM32CubeMX配置
# 1. 工程基础配置
- 芯片型号:STM32F103C8T6
- 主频:72MHz
- 调试接口:SWD
# 2. ADC通道配置
- 启用ADC1的以下通道:
- IN6(PA6,电位器)
- Temperature Sensor Channel(内部温度传感器)
- Vrefint Channel(内部参考电压)

# 3. DMA配置
- 添加DMA通道:
- Request:ADC1
- Direction:Peripheral To Memory
- Mode:Circular(循环模式)
- Data Width:Half Word(16位)
- Memory Increment:Enabled

# 4. I²C配置(OLED驱动)
- 模式:Speed Mode
- 引脚:PB6(SCL)/PB7(SDA)
# 12.4.2 软件设计
# 1. ADC初始化(代码清单12-2)
static void MX_ADC1_Init(void) {
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 12位分辨率
hadc1.Init.ScanConvMode = ENABLE; // 启用扫描模式
hadc1.Init.ContinuousConvMode = ENABLE; // 连续转换模式
hadc1.Init.NbrOfConversion = 3; // 3通道转换
hadc1.Init.DMAContinuousRequests = ENABLE; // 启用DMA连续请求
// ...其他参数保持默认
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2. 主循环逻辑(代码清单12-3)
/* USER CODE BEGIN WHILE */
while (1) {
// 启动DMA传输
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)value, 3);
// 计算物理量
physical[0] = (value[0] / 4095.0) * 3.3; // 电位器电压
vsense = (value[1] / 4095.0) * 3.3; // 温度传感器原始电压
physical[1] = ((V25 - vsense) / AVG_SLOPE) + 25.0f; // 温度计算
physical[2] = (value[2] / 4095.0) * 3.3; // 内部参考电压
// 格式化显示字符串
sprintf(message0, "V:%d %.2fV", value[0], physical[0]);
sprintf(message1, "T:%d %.1fC", value[1], physical[1]);
sprintf(message2, "R:%d %.2fV", value[2], physical[2]);
// 刷新OLED
OLED_NewFrame();
OLED_PrintString(0, 0, message0, &font16x16, OLED_COLOR_NORMAL);
OLED_PrintString(0, 20, message1, &font16x16, OLED_COLOR_NORMAL);
OLED_PrintString(0, 40, message2, &font16x16, OLED_COLOR_NORMAL);
OLED_ShowFrame();
HAL_Delay(500); // 刷新间隔500ms
}
/* USER CODE END WHILE */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 12.4.3 下载验证
# 现象与步骤
- 硬件连接:
- 电位器接PA6,OLED通过I²C连接。
- 烧录程序:
- 代码烧录后,DMA自动启动三路信号采集。
- 功能验证:
- 旋转电位器,观察电压值变化。
- OLED显示三路数据(示例):
V:3215 2.59V
T:1752 29.0C
R:1506 1.21V

关键说明:
- 温度计算参数:
V25
:25℃时传感器电压(典型值1.43V)。AVG_SLOPE
:温度-电压斜率(典型值4.3mV/℃)。
- 参考电压:用于校准ADC,提高测量精度。
- DMA模式:循环模式确保数据持续更新,避免数据覆盖。