stm32 读取多路SDADC

方法一:用SDADC的规则通道一个一个去读,配置SDADC如下

 

 读入代码比较简单,依次读取SDADC1通道6、通道8和SDADC3通道0,代码如下

/* USER CODE BEGIN Header_StartDefaultTask */
volatile uint32_t SDADC_Value[10];
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
      //read SDADC1 Channel6
    HAL_SDADC_ConfigChannel(&hsdadc1,SDADC_CHANNEL_6,SDADC_CONTINUOUS_CONV_OFF);// set channel
    HAL_SDADC_Start(&hsdadc1);//start sdadc
    if(HAL_SDADC_PollForConversion(&hsdadc1,HAL_MAX_DELAY)==HAL_OK)//waiting for convert complete
    {
        SDADC_Value[0] = HAL_SDADC_GetValue(&hsdadc1);// read the value of sdadc
        HAL_SDADC_Stop(&hsdadc1);
    }

      //read SDADC1 Channel8
    HAL_SDADC_ConfigChannel(&hsdadc1,SDADC_CHANNEL_8,SDADC_CONTINUOUS_CONV_OFF);
    HAL_SDADC_Start(&hsdadc1);
    if(HAL_SDADC_PollForConversion(&hsdadc1,HAL_MAX_DELAY)==HAL_OK)
    {
        SDADC_Value[1] = HAL_SDADC_GetValue(&hsdadc1);
        HAL_SDADC_Stop(&hsdadc1);
    }

      //read SDADC3 Channel0
    HAL_SDADC_ConfigChannel(&hsdadc3,SDADC_CHANNEL_0,SDADC_CONTINUOUS_CONV_OFF);
    HAL_SDADC_Start(&hsdadc3);
    if(HAL_SDADC_PollForConversion(&hsdadc3,HAL_MAX_DELAY)==HAL_OK)
    {
        SDADC_Value[2] = HAL_SDADC_GetValue(&hsdadc3);
        HAL_SDADC_Stop(&hsdadc3);
    }
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}
读取规则SDADC

 

方法二:用注入通道一次读取多个转换值

配置SDADC

 

 配置DMA

 

校准SDADC并启动转换

void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
    static uint32_t     SDADC1_DegitalValue[5];
    static uint32_t     SDADC3_DegitalValue[5];
    
    HAL_StatusTypeDef status;
    
    /* 配置SDADC1 */
    if(HAL_SDADC_CalibrationStart(&hsdadc1, SDADC_CALIBRATION_SEQ_1) != HAL_OK)/* 启动偏置校准 */
        Error_Handler();
  
    if(HAL_SDADC_PollForCalibEvent(&hsdadc1, 1000) != HAL_OK)/*等待校准完成 */
        Error_Handler();
      
    if(HAL_SDADC_InjectedStart_DMA(&hsdadc1,SDADC1_DegitalValue,5) != HAL_OK)/* 启动 SDADC1 注入式 DMA 转换 */
        Error_Handler();
      
    /* 配置SDADC3 */
    if(HAL_SDADC_CalibrationStart(&hsdadc3, SDADC_CALIBRATION_SEQ_3) != HAL_OK)/* 启动偏置校准 */
        Error_Handler();
  
    if(HAL_SDADC_PollForCalibEvent(&hsdadc3, 1000) != HAL_OK)/*等待校准完成 */
        Error_Handler();
      
    if(HAL_SDADC_InjectedStart_DMA(&hsdadc3,SDADC3_DegitalValue,5) != HAL_OK)/* 启动 SDADC3 注入式 DMA 转换 */
        Error_Handler();
    
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}
校准SDADC并启动转换

转换结果如下:

可以将SDADC1_DegitalValue[5]改为SDADC1_DegitalValue[50],SDADC每次转换完后DMA都会循环追加到数组,这样就拥有了每个通道的10次数据,然后取均值得到稳定的电压值。

 

posted @ 2020-10-22 14:53  阿坦  阅读(1861)  评论(0)    收藏  举报