12.4 DMA项目:多通道电压采样

# 12.4 DMA项目:多通道电压采样

本实验利用STM32的DMA功能实现三路信号(电位器电压、内部温度传感器、内部参考电压)的高效采集,结合OLED实时显示,减少CPU资源占用。
核心功能

  • DMA传输:自动搬运ADC数据至内存,解放CPU。
  • 多通道采集:同步采样外部电压、温度、参考电压。
  • 实时显示:OLED动态刷新三路信号数值。

# 12.4.1 STM32CubeMX配置

# 1. 工程基础配置

  • 芯片型号:STM32F103C8T6
  • 主频:72MHz
  • 调试接口:SWD

# 2. ADC通道配置

  1. 启用ADC1的以下通道:
    • IN6(PA6,电位器)
    • Temperature Sensor Channel(内部温度传感器)
    • Vrefint Channel(内部参考电压)
ADC通道配置

# 3. DMA配置

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

# 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. 主循环逻辑(代码清单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

# 12.4.3 下载验证

# 现象与步骤

  1. 硬件连接
    • 电位器接PA6,OLED通过I²C连接。
  2. 烧录程序
    • 代码烧录后,DMA自动启动三路信号采集。
  3. 功能验证
    • 旋转电位器,观察电压值变化。
    • OLED显示三路数据(示例):
      • V:3215 2.59V
      • T:1752 29.0C
      • R:1506 1.21V
硬件实现结果

关键说明

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