野火STM32_HAL库版课程笔记-TIM触发ADC采集

前置介绍

TRGO 信号 (Trigger Output 触发输出)

是微控制器(如 STM32)中定时器模块产生的一种内部硬件信号。

核心作用是,在不占用 CPU 资源的情况下,精确地触发和同步其他外设的工作

例如启动 ADC(模数转换器)进行采样、更新 DAC(数模转换器)的输出,或者同步其他定时器的启动。

TRGO 典型应用场景 - 定时器周期性触发 ADC 采样
  1. 定时器 被配置为以固定频率(例如每秒1000次)计数。
  2. 每当定时器计数到一个特定值(例如周期结束),它就会自动产生一个 TRGO 信号。
  3. ADC 模块 被配置为监听这个 TRGO 信号。
  4. 一旦 ADC 检测到 TRGO 信号,就立即启动一次数据转换。

通过这种方式,系统可以实现非常稳定、精确且周期性的数据采集,这对于电机控制、音频处理、电源管理等对时序要求极高的应用至关重要。

TIM 触发 ADC 采集内部温度

项目配置

USART1

配置 Mode 为 Asynchronous

TIM3
  1. 勾选 Internal Clock
  2. 设置 Prescaler 为 7200 - 1 , 最终每秒计数一万次
  3. 设置 Counter Period 为 5000 - 1, 即每半秒触发一次 TRGO 信号输出
  4. 设置 Trigger Event Selection 为 Update Event.
ADC1
  1. 勾选 Temperature Sensor Channel 温度传感器通道
  2. Extenal Trigger Conversion Source (外部触发转换源) 设置为 Timer 3 Trigger Out event. (定时器 3 触发外部事件)
  3. Sampling Time (采样时间), 设置为 55.5 Cycles (采样时间长, 数据更稳定准确)

代码部分

因为用到了串口, 记得勾选 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 = 0;     // 存储原始值
float voltage = 0.0f;     // 存储电压值
float temperature = 0.0f; // 存储温度

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  
  // 启动 ADC1 校准
  HAL_ADCEx_Calibration_Start(&hadc1);
  
  // 启动 ADC1 转换
  HAL_ADC_Start(&hadc1);
  
  // 启动 TIM3 基础定时
  HAL_TIM_Base_Start(&htim3);
  
  // 等待芯片传感器稳定
  HAL_Delay(3000);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) // 等待 ADC 转换完成
    {
      adc_val = HAL_ADC_GetValue(&hadc1);             // 读取原始值
      voltage = (float)adc_val / 4095 * 3.3f;         // 将原始值转换为电压值 (单位 V)
      temperature = (1.43f - voltage) / 0.0043f + 25; // 将电压转换为芯片内部温度 (单位 C)
      
      printf("当前芯片内部温度: %.3f C \r\n", temperature);
      
      // 这里不需要去写延迟, 因为这里是通过 HAL_ADC_PollForConversion 等待定时器每 500ms 触发一次转换, 
      // 如果没有触发完成, 是不会通过的. 
    }      
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

/* 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 */

程序现象

程序运行后, 会先有一段时间的空白期 (进行校准和等待温度传感器稳定)

空白期结束之后, TIM3 每隔 500ms 触发一次 TRGO 信号, 触发 ADC1 采集芯片温度

然后在主程序中等待 ADC1 转换完成后, 将 ADC 原始值转换为电压值, 再转换为温度, 然后通过串口进行输出.

可以将手指放在芯片上, 可以看到温度会有小的变动.

相关推荐
LinXunFeng18 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
✎ ﹏梦醒͜ღ҉繁华落℘5 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u152109648495 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
闪闪发亮的小星星5 天前
高斯光以及高斯光公式解释
笔记
zd8451015005 天前
RS485 总线详解
单片机·嵌入式硬件
cqbzcsq5 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
半条-咸鱼5 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
牛根生同志5 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
wohoo_wangzi5 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
阿米亚波5 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm