STM32ADC双重ADC快速交叉模式采集一个通道数据,库函数
时间: 2024-04-30 20:20:05 浏览: 26
以下是使用STM32 HAL库函数采集一个通道数据的双重ADC快速交叉模式示例代码:
```c
#include "stm32f4xx_hal.h"
ADC_HandleTypeDef hadc1;
ADC_HandleTypeDef hadc2;
/* Configure ADCs and GPIOs */
void MX_ADC_Init(void)
{
ADC_MultiModeTypeDef multimode = {0};
ADC_ChannelConfTypeDef sConfig = {0};
/* Initialize ADC1 and ADC2 */
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
hadc2.Instance = ADC2;
hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc2.Init.Resolution = ADC_RESOLUTION_12B;
hadc2.Init.ScanConvMode = DISABLE;
hadc2.Init.ContinuousConvMode = ENABLE;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.NbrOfConversion = 1;
hadc2.Init.DMAContinuousRequests = DISABLE;
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
Error_Handler();
}
/* Configure ADC multi-mode */
multimode.Mode = ADC_DUALMODE_INTERL;
multimode.DMAAccessMode = ADC_DMAACCESSMODE_1;
multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
Error_Handler();
}
/* Configure ADC channel */
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
/* Start ADCs */
void MX_ADC_Start(void)
{
if (HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)&ADC1ConvertedValue, 1) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_Start_DMA(&hadc2, (uint32_t *)&ADC2ConvertedValue, 1) != HAL_OK)
{
Error_Handler();
}
}
/* ADCs conversion complete callback */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
/* ADC1 conversion complete */
if (hadc->Instance == ADC1)
{
/* Do something with ADC1ConvertedValue */
}
/* ADC2 conversion complete */
if (hadc->Instance == ADC2)
{
/* Do something with ADC2ConvertedValue */
}
}
int main(void)
{
/* Configure system clock */
SystemClock_Config();
/* Initialize ADCs and GPIOs */
MX_ADC_Init();
/* Start ADCs */
MX_ADC_Start();
/* Infinite loop */
while (1)
{
}
}
```
在上面的示例代码中,我们使用了双重ADC快速交叉模式,其中ADC1和ADC2都被配置为单通道模式,并采集同一个通道。我们还使用了DMA来传输ADC数据,并在ADC转换完成时调用HAL_ADC_ConvCpltCallback()回调函数。在该回调函数中,我们可以获取ADC1ConvertedValue和ADC2ConvertedValue,它们分别是ADC1和ADC2的转换结果。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)