stm32 adc多通道采样 HAL 库
时间: 2025-01-16 11:33:57 浏览: 54
### STM32 HAL库 ADC多通道同时采样
对于STM32使用HAL库进行ADC多通道采样的实现,主要依赖于配置DMA以处理多个通道的数据传输。下面提供一段基于`stm32f103c8`系列芯片的示例代码,用于展示如何设置并执行多通道的同时采样。
#### 初始化硬件资源
首先,在初始化阶段需定义好要使用的ADC实例以及对应的GPIO引脚,并开启相应的外设时钟。这里假设选择了PC1、PA2和PA3作为输入端口连接到ADC123的第11、2、3号通道[^3]。
```c
// 定义全局变量存储ADC值数组
uint16_t adc_values[3 * 50]; // 每个通道采集50次
void MX_ADC_Init(void)
{
/* USER CODE BEGIN ADC_Init 0 */
/* USER CODE END ADC_Init 0 */
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ENABLE; // 启用扫描模式以便支持多通道
hadc1.Init.ContinuousConvMode = DISABLE; // 单次转换模式
hadc1.Init.DiscontinuousConvMode = DISABLE; // 不启用不连续模式
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;// 软件触发
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 3; // 设置每次序列中的转换数量为3
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_11; // PC1对应ADC Channel 11
sConfig.Rank = ADC_RANK_1;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_2; // PA2对应ADC Channel 2
sConfig.Rank = ADC_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_3; // PA3对应ADC Channel 3
sConfig.Rank = ADC_RANK_3;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
```
#### 配置DMA传输
接着配置DMA控制器来自动搬运来自ADC的结果至内存缓冲区中:
```c
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR; // 循环模式适合持续监控应用
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1);
}
/* Start ADC with DMA transfer */
if (HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_values, 150)!= HAL_OK){
Error_Handler(); // 如果启动失败则调用错误处理器
}
```
上述代码片段展示了如何通过DMA机制高效地收集三个不同传感器上的电压信号样本。每当完成一组完整的三通道读取操作后,这些数值会被保存进预先分配好的`adc_values[]`数组里供后续分析或显示之用[^1]。
阅读全文
相关推荐


















