蓝桥杯嵌入式adc双通道
时间: 2025-04-17 12:27:47 浏览: 37
### 关于蓝桥杯竞赛中嵌入式系统ADC双通道使用的方法
在蓝桥杯竞赛中的嵌入式项目里,对于ADC(模数转换器)的操作通常涉及到多个通道的数据采集。下面展示了一种实现双通道数据读取的方式。
#### 单次采样模式下的双通道配置
当采用单次采样的方式来获取两个不同传感器或其他信号源输入时,可以先启动一次完整的ADC扫描过程,在此期间依次对各个指定好的通道执行测量操作。完成之后再通过软件处理函数取出对应的数值并做进一步计算或分析。
```c
void ADC_dual_channel_single_conversion(uint16_t *channel_values){
uint8_t channel_count = 2;
/* Start the conversion of regular channels */
HAL_ADC_Start(&hadc2);
for (int i = 0; i < channel_count; ++i) {
while(HAL_IS_BIT_SET(hadc2.Instance->CR, ADC_CR_ADSTART)); // Wait until not busy
if (__HAL_ADC_GET_FLAG(&hadc2, ADC_FLAG_EOC)){// Check End Of Conversion flag
channel_values[i] = HAL_ADC_GetValue(&hadc2); // Get converted value from DR register.
__HAL_ADC_CLEAR_FLAG(&hadc2, ADC_FLAG_EOC);// Clear EOC Flag after reading data
// Small delay between conversions may be necessary depending on application requirements
HAL_Delay(1);
}
}
HAL_ADC_Stop(&hadc2); // Stop ADC operation when done with all channels
}
```
上述代码片段展示了如何在一个循环内连续地从两个不同的ADC通道获得样本值,并将其存储到数组`channel_values[]`中[^1]。需要注意的是这里假设已经完成了必要的初始化工作以及正确设置了相应的硬件参数以便支持多路输入的功能特性。
另外一种更高效的做法是在DMA的帮助下自动传输多组数据至内存缓冲区,从而减少CPU干预次数提高效率:
#### 利用DMA进行批量数据转移
为了简化编程逻辑并且加快速度,推荐利用直接存储访问(DMA)技术来进行大批量的数据搬移任务。这种方式允许处理器可以在后台继续运行其他程序的同时让外设自行管理好自己的I/O活动。
```c
uint16_t adc_buffer[NUMBER_OF_CHANNELS]; // Buffer to hold ADC results
/* Configure DMA handle structure and link it with ADC peripheral */
static void MX_DMA_Init(void){
hdma_adc2.Instance = DMA1_Channel2;
hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc2.Init.PeriphDataAlignment= DMA_PDATAALIGN_HALFWORD;
hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc2.Init.Mode = DMA_CIRCULAR;// Use circular mode so that buffer wraps around continuously
hdma_adc2.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_adc2) != HAL_OK){
Error_Handler();
}
}
/* Link DMA stream/channel to ADC request line */
__weak void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
...
__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc2);
...
}
/* Enable continuous auto-injection feature which will trigger a new conversion once previous one ends*/
if (HAL_ADCEx_InjectedStart_IT(&hadc2)!= HAL_OK ) {
Error_Handler();
}
while (true){
// Do other tasks here...
}
```
这段示例说明了怎样设置DMA控制器去配合ADC模块完成不间断的数据流捕捉作业。一旦开启了中断触发机制,则每当有新的有效结果就绪时就会立即被转移到预定义的目标地址处等待后续应用层调用[^2]。
阅读全文
相关推荐


















