STM32G4双重ADC交替采集
时间: 2024-12-31 12:34:55 浏览: 18
### STM32G4 双重 ADC 交替采集配置
在STM32G4系列微控制器中,双重ADC可以通过设置为交替触发模式来实现高效的数据采集。这种模式允许两个ADC在同一时间点分别对不同的通道进行采样,从而提高系统的整体性能。
#### 配置步骤概述
为了使能双ADC的交替触发功能,在初始化阶段需特别注意几个关键参数:
- **Clock Configuration**: 确保两个ADC共享相同的时钟源,这有助于保持同步。
- **Common Mode Settings**: 设置公共模式选项以支持多路ADC操作。
- **Trigger Selection**: 选择合适的外部或内部触发信号用于启动转换序列。
- **DMA Channel Assignment**: 如果使用DMA传输数据,则应分配独立的DMA流给每个ADC实例[^1]。
下面是一个具体的例子展示如何通过CubeMX工具链以及HAL库完成上述配置并编写相应的应用程序代码片段。
#### 初始化函数定义
```c
// 定义全局变量存储两次连续测量的结果
uint16_t adcResults[2];
void MX_ADC_Init(void)
{
/* USER CODE BEGIN ADC_Init 0 */
/* USER CODE END ADC_Init 0 */
/** Common config
* 这里省略了部分默认配置...
*/
hadc1.Instance = ADC1;
hadc2.Instance = ADC2;
// 启用双重ADC模式下的交替触发特性
Hadc1.Init.CommonMode = ADC_COMMONMODE_ALL_2;
if (HAL_ADC_Init(&hadc1) != HAL_OK){
Error_Handler();
}
if (HAL_ADC_Init(&hadc2) != HAL_OK){
Error_Handler();
}
// 配置定时器作为触发源(假设采用TIM6)
__HAL_RCC_TIM6_CLK_ENABLE();
TIM_HandleTypeDef htim6;
htim6.Instance = TIM6;
htim6.Init.Prescaler = 8399;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 999;
htim6.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK){
Error_Handler();
}
// 将定时器更新事件连接到ADC触发输入线上
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OcIdleState= TIM_OCIDLESTATE_RESET;
sConfigOC.OcNIdleState= TIM_OCNIDLESTATE_RESET;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OutputState = TIM_OUTPUTSTATE_DISABLE;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCNState = TIM_OCSTATE_DISABLE;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
if(HAL_TIM_OC_ConfigChannel(&htim6, &sConfigOC, TIM_CHANNEL_1)!= HAL_OK){
Error_Handler();
}
// 开启自动重装载预分频器计数器寄存器
__HAL_TIM_AUTORELOAD_PRESCALER(&htim6);
// 使用DMA接收来自ADC的数据
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc2.Instance = DMA2_Channel7;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK || HAL_DMA_Init(&hdma_adc2) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&hadc1,DMA_Handle,&hdma_adc1);
__HAL_LINKDMA(&hadc2,DMA_Handle,&hdma_adc2);
}
```
此段程序展示了如何利用硬件资源建立基本框架以便于后续处理逻辑开发。接下来的部分则专注于实际执行过程中的细节控制。
#### 数据采集流程管理
当一切准备就绪之后,就可以开始规划具体的应用场景下怎样去调度这些已经设定好的组件协同工作了。这里给出一段简单的循环体用来持续不断地从两个ADC获取最新数值,并将其保存至预先声明过的数组`adcResults[]`当中。
```c
while(1){
// Start conversion on both ADC units simultaneously.
HAL_ADCEx_MultiModeStart_IT(&hadc1);
// Wait until conversions are complete and data is available via interrupts or polling mechanism.
while (__HAL_ADC_GET_FLAG(&hadc1, ADC_FLAG_EOS)== RESET){}
// Retrieve the converted values from each ADC unit into our result buffer.
adcResults[0]= HAL_ADC_GetValue(&hadc1);
adcResults[1]= HAL_ADC_GetValue(&hadc2);
// Process acquired samples as needed by your application here...
// Insert delay between measurements to avoid overloading system resources.
HAL_Delay(1000); // Adjust timing according to requirements.
}
```
这段代码实现了周期性的读取两组传感器反馈的信息,并且可以根据实际情况调整延迟间隔来匹配特定应用场景的需求。
阅读全文