野火STM32_HAL库版课程笔记-ADC多通道采集热敏、光敏、反射传感器(轮询)

前置介绍

多通道读取

在前面单通道的应用中, 就是采集一个通道的 ADC 值, 也就是只采集一个电位器.

而想要采集多个传感器 的情况下, 就要用到多通道.

多通道相较于单通道

只不过是把扫描一个通道的值, 变成转换多个通道, 并且依次转换.

项目配置

ADC1 勾选 IN4, 5, 6.

到 ADC1 - Configuration - Parameter Settings

这里要转换多个通道的 ADC 值, 所以需要将 Scan Conversion Mode 配置为使能 (Enable)

但是这里现在点击会发现使能被禁用了.

因为需要先将下面的 Number Of Conversion 的转换通道数设置为对应的 3 个通道.

当下面配置为对应 3 个通道后, 上面的 Scan Conversion Mode 就自动被配置为了使能 (需要注意配置后, 点击旁边或回车确认配置后即可看到被自动配置), 并且也不能配置为失能模式.

连续转换 (Continuous Conversion Mode) 保持失能, 使用单次软件转换.
Discontinuous Conversion Mode 间断转换模式, 使用多通道读取和轮询, 就需要开启它.
并且下面的通道数 (Number Of Discontinuous Conversions), 转换 1.

意思就是每次只转换一个通道, 然后暂停. (转换 PA4 -> 暂停 -> 手动调用代码 -> 转换 PA5 -> 暂停 -> 转换 PA6 -> 暂停 -> 手动调用代码 -> 转换 PA4 -> ... )

如果设置为 2, 那么就是每转换 2 个通道, 就会暂停. 等待外部触发信号

Rank 设置通道的转换顺序和采样时间

转换顺序依次设置, 采样时间保持默认 (1.5 Cycles)

给三个引脚设置用户标签 (光敏, 红外, 热敏)

代码部分

用到了 USART1 , 记得勾选 Use MicroLIB

复制代码
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include <stdio.h>  // 使用 printf 函数
#include <string.h> // 使用 strncmp

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t adc_val[3];  // 存储3个通道的ADC数值
float voltage[3];     // 存储3个通道的ADC电压值
/* USER CODE END PV */

  /* USER CODE BEGIN 2 */

  // 启动 ADC 校准
  HAL_ADCEx_Calibration_Start(&hadc1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    // 依次读取三个通道的数值. 
    for (int i = 0; i < 3; i++)
    {
      // 启动一次 ADC 转换
      HAL_ADC_Start(&hadc1);
      
      if (HAL_ADC_PollForConversion(&hadc1, 50) == HAL_OK)
      {
        // 读取ADC的值
        adc_val[i] = HAL_ADC_GetValue(&hadc1);
      
        // 计算电压值 (参考电压 3.3V, 分辨率 12位)
        voltage[i] = (float)adc_val[i] / 4095 * 3.3f;
      }
    }
    
    printf("光敏(IN4): %.3f V, 反射(IN5): %.3f V, 热敏(IN6): %.3f V \r\n", 
            voltage[0], voltage[1], voltage[2]);
    
    // 每 500 ms 采样一次
    HAL_Delay(500);

/* USER CODE BEGIN 4 */

/**
  * @brief  重定向 printf 的输出到串口
  * @param  ch: 要发送的字符
  * @param  f:  文件指针 (标准库要求的参数, 一般不使用)
  * @retval 返回发送的字符
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  return ch;
}

/* USER CODE END 4 */

实验现象

改变各个传感器的状态, 电压值发生变化.

热敏传感器, 温度较难改变, 电压变化幅度较小.

相关推荐
xian_wwq44 分钟前
【学习笔记】等保合规安全基线核查实战
笔记·学习
国科安芯2 小时前
断电也隔离、听得真:ASL3159S 单通道 SPDT 模拟开关的“断电保护 + 音频保真“账
单片机·嵌入式硬件·安全·商业航天·抗辐射
jianqiang.xue2 小时前
【CStackGUI 实战】深色主题终端:app.dark 默认深色 + 顶层命名样式表 + 运行时切换
单片机·嵌入式·cstackgui·c语言gui·可视化拖拽
M78佐菲2 小时前
ARM学习笔记(11)
linux·arm开发·笔记·嵌入式硬件·学习
M78佐菲2 小时前
ARM学习笔记(10)
linux·arm开发·笔记·嵌入式硬件·学习
小程序设计2 小时前
基于STM32的智慧厨房多参数安全监测与预警系统设计
stm32·嵌入式硬件·安全
新晨单片机设计2 小时前
S008C-基于STM32单片机无线抢答器【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·无线抢答器
李游Leo3 小时前
HarmonyOS 7 + ArkUI + RelationalStore 学习笔记:本地数据分层存储与状态持久化架构实践【鸿蒙心迹】
笔记·学习·架构·harmonyos
我命由我123453 小时前
经纪人的职业定义
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
Zw-awa3 小时前
Delay_us 与 Delay_ms:用 SysTick 做一把可靠的时间尺
stm32