stm32f103c8t6adc采集电压hal库
时间: 2025-04-26 10:13:52 浏览: 34
### 使用 HAL 库在 STM32F103C8T6 上实现 ADC 电压采集
为了使用 HAL 库在 STM32F103C8T6 上进行 ADC 电压采集,需初始化 ADC 并配置相应的通道。STM32 的 ADC 是一种逐次逼近型模数转换器,能够提供高达 12 位分辨率的结果[^1]。
#### 初始化 ADC 配置
首先,在 `main.c` 文件中包含必要的头文件并定义全局变量:
```c
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc1;
```
接着,创建一个函数用于初始化 ADC 模块设置参数结构体成员为默认值,并调用 `HAL_ADC_Init()` 函数完成硬件资源分配以及寄存器初始状态设定:
```c
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE; // 单一模式
hadc1.Init.ContinuousConvMode = ENABLE; // 连续转换模式开启
hadc1.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换模式
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发启动
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 1; // 设置要转换的通道数量
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */
sConfig.Channel = ADC_CHANNEL_0; // 选择通道
sConfig.Rank = 1; // 排序等级
sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5; // 采样时间
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
```
上述代码片段展示了如何通过 HAL 库来配置 ADC1 实例化对象及其常规通道的相关属性[^2]。
#### 启动 ADC 和读取数据
当一切准备就绪之后,可以利用如下方式获取单次测量结果或者进入循环扫描模式下不断更新最新一次的有效数值:
对于一次性读取操作而言,可采用下面的方法来进行:
```c
uint32_t adc_value;
if(HAL_ADC_Start(&hadc1) == HAL_OK){
if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK){
adc_value = HAL_ADC_GetValue(&hadc1);
/* Process ADC value here */
}else{
// Handle timeout or error condition
}
}else{
// Handle start failure
}
```
这段程序说明了怎样开始一次新的转换过程并且等待直到获得有效的数字量输出为止;随后便可以从设备内部缓冲区提取该值供后续处理逻辑所用[^3]。
如果希望持续监测输入信号的变化情况,则应该考虑启用 DMA 或者中断机制以便更高效地管理 I/O 流程而无需频繁轮询查询端口状态变化。
阅读全文
相关推荐


















