这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取逻辑分析仪】STM32G4从入门到大师之四:ADC查询方式单路采集电压

共7条 1/1 1 跳转至

【换取逻辑分析仪】STM32G4从入门到大师之四:ADC查询方式单路采集电压

高工
2025-05-15 17:46:50   被打赏 14 分(兑奖)     打赏

  

STM32G4 ADC(模数转换器)是STM32G4系列微控制器中用于将模拟信号转换为数字信号的重要外设,具有以下特性:

1.高分辨率与高性能

STM32G4 ADC提供12位分辨率,并支持硬件过采样以实现更高精度(如16位精度)。最高转换速率可达4 Msps(每秒百万次采样),满足高速数据采集需求。

灵活的通道配置

2.每个ADC模块支持多达19个多路通道,包括外部通道和内部通道(如温度传感器、VREFINT等)。通道选择灵活,可通过软件配置为单端或差分输入模式。

多种转换模式

3. 支持规则转换和注入转换两种模式。规则转换按预设顺序执行,注入转换可临时插入,适用于紧急信号处理。转换模式包括单次转换、连续转换、扫描转换等,满足不同应用场景需求。

时钟配置与同步

4. ADC时钟可来自系统时钟(同步时钟)或锁相环输出(异步时钟),提供灵活的时钟源选择。异步时钟允许独立于系统时钟调整ADC频率,优化转换速度与精度。

低功耗与校准功能

5. 采用低功耗设计,适合电池供电设备。内置自校准功能,可减少偏置误差,提高转换精度。

高级功能支持

6.支持模拟看门狗功能,实时监测输入电压是否超出阈值。提供DMA请求和中断请求,简化数据处理流程。支持通道式可编程采样时间,适应不同信号源特性。

多ADC模块与双模式运行

7.STM32G4系列通常包含多个ADC模块(如ADC1、ADC2等),部分模块可双模式运行,提高系统并行处理能力。ADC1和ADC2紧密耦合,支持双ADC同步采样,适用于高精度测量或电机控制等应用。

  本次测评基于PC0采集电压,CubeMX配置:

  #include "main.h"
#include <stdio.h>

ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
  HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);  // 启动ADC校准
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_ADC_Start(&hadc1);  // 启动ADC1转换
    HAL_ADC_PollForConversion(&hadc1, 10);  // 等待转换完成,超时时间为10ms
    if (HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
      ADC_Value = HAL_ADC_GetValue(&hadc1); // 读取转换的AD值
    ADC_Vol = ADC_Value * 3.3 / 4096; // 转换为电压

    printf("ADC_Vol: %2.4f\r\n", ADC_Vol); // 通过串口发送

    HAL_Delay(1000);
    HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

void SystemClock_Config(void)
{
  // 系统时钟配置代码
}

static void MX_GPIO_Init(void)
{
  // GPIO初始化代码
}

static void MX_ADC1_Init(void)
{
  // ADC1初始化代码
}

static void MX_USART1_UART_Init(void)
{
  // USART1初始化代码
}

代码说明

初始化函数调用:

MX_GPIO_Init();:初始化GPIO引脚。

MX_ADC1_Init();:初始化ADC1模块。

MX_USART1_UART_Init();:初始化USART1用于串口通信。

ADC校准:

HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);:对ADC1进行校准,确保转换精度。

ADC转换流程:

HAL_ADC_Start(&hadc1);:启动ADC1转换。

HAL_ADC_PollForConversion(&hadc1, 10);:等待转换完成,超时时间为10ms。

HAL_ADC_GetValue(&hadc1);:读取转换结果。

电压转换与输出:

ADC_Vol = ADC_Value * 3.3 / 4096;:将ADC值转换为电压值(假设参考电压为3.3V,12位分辨率)。

printf("ADC_Vol: %2.4f\r\n", ADC_Vol);:通过串口输出电压值。

延时:

HAL_Delay(1000);:延时1秒,控制采样频

巡行结果:

4.png



工程师
2025-05-17 14:58:50     打赏
2楼


image.png

都是空代码,请问楼主,那ADC是从哪里采集来的?


专家
2025-05-19 11:02:12     打赏
3楼

有配置工具,极大方便编程了啊。谢谢分享配置过程。


专家
2025-05-19 17:32:06     打赏
4楼

原来是介绍构架,明白了


工程师
2025-05-21 10:41:29     打赏
5楼

排版建议优化一下,代码不是很完整


高工
2025-05-21 13:35:30     打赏
6楼

有工具生成配置  效率提升不少


高工
2025-05-22 15:26:31     打赏
7楼

程序好像是延时2S内。


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]