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秒,控制采样频
巡行结果: