hal库adc多通道采集电压
时间: 2025-04-20 19:12:47 浏览: 64
### 使用STM32 HAL库实现ADC多通道电压采集
为了通过STM32 HAL库实现多个ADC通道的同时采样,配置过程涉及初始化ADC模块、设置所需的参数以及利用DMA传输数据。下面提供了一个完整的示例来展示如何执行这些操作。
#### 初始化ADC并启用DMA模式
在`MX_ADC1_Init()`函数内定义好ADC的相关属性之后,在主函数中进一步设定DMA请求映射到特定的中断事件,并指定要读取的数据缓冲区地址和长度:
```c
/* 定义全局变量用于存储ADC结果 */
#define BUFFER_SIZE 8 // 假设有两个通道,则需两倍空间保存每轮的结果
uint16_t AdcConvertedValues[BUFFER_SIZE];
// 配置ADC通道列表
static void MX_ADC1_Init(void){
...
hadc1.Init.ScanConvMode = ENABLE;
hadc1.ChannelConf[0].Channel = ADC_CHANNEL_4; // Channel 4
hadc1.ChannelConf[0].Rank = 1;
hadc1.ChannelConf[0].SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
hadc1.ChannelConf[1].Channel = ADC_CHANNEL_5; // Channel 5
hadc1.ChannelConf[1].Rank = 2;
hadc1.ChannelConf[1].SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
}
```
上述代码片段展示了如何为ADC配置扫描模式(允许连续处理多个输入),并将两个不同的模拟信号源连接至相应的硬件引脚上[^1]。
#### 启动ADC转换并与DMA关联
一旦完成了必要的初始化工作,就可以调用`HAL_ADC_Start_DMA()`方法开始实际的数据收集流程了。此命令会触发一次性的批量读数动作,并自动把获得的信息传送到预先分配好的内存区域里去:
```c
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AdcConvertedValues, BUFFER_SIZE / sizeof(uint16_t)) != HAL_OK) {
Error_Handler();
}
while (1) {
// 主循环体可放置其他任务逻辑...
}
```
这里需要注意的是,当采用DMA方式进行大批量快速传输时,必须确保所选定时器间隔足够长以便让整个序列顺利完成;否则可能导致未完成的任务堆积甚至系统崩溃等问题发生。
#### 处理接收到的数据
最后一步是在适当的地方加入回调机制,用来响应已完成的DMA事务。这可以通过覆盖默认行为或者注册自定义处理器的方式来达成目的。每当一批新的测量值被成功接收后,就会触发对应的事件句柄来进行后续分析或可视化呈现等工作:
```c
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc) {
// 当一半数量的样本已被传送完毕时调用该函数
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
// 所有预定数目内的样本均已经过DMA搬运过来以后才会到达此处
for(int i=0;i<BUFFER_SIZE/sizeof(uint16_t);i++){
float voltage = ((float)(AdcConvertedValues[i]) * 3.3f)/4096.0f;
printf("Channel %d Voltage Value:%.4fV\r\n", i+1,voltage);
}
}
```
以上就是基于STM32 HAL库构建一个多路同步采样的简单实例说明[^3]。
阅读全文
相关推荐


















