stm32同时ADC读取

时间:2019-11-04 13:10:33

标签: c embedded stm32 adc simultaneous

我一直在使用结合了CUBE MX的STM32 IDE。

使用HAL代码,我可以使用一个单独的ADC在三个引脚上读取每个引脚 销。 我同时启动了所有ADC,然后轮询完成。 我认为这些ADC读取实际上应该是同时的(即 他们都在非常相似的时间阅读)?

下面的代码片段。 使用NUCLEO-STM32 F446RE btw。

  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_ADC3_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      static int flip,sysclk=0,old_sysclk=0,adc1,adc2,adc3;//adc3_0,adc3_1,adc3_2, adc_pstat0,
      int adc_pstat1, adc_pstat2, adc_pstat3;

      flip ^= 1;

          HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0/*|GPIO_PIN_2|GPIO_PIN_6*/, flip);


           HAL_ADC_Start(&hadc3);
           HAL_ADC_Start(&hadc2);
           HAL_ADC_Start(&hadc1);
           adc_pstat1 = HAL_ADC_PollForConversion(&hadc1, 10);
          adc_pstat3 = HAL_ADC_PollForConversion(&hadc3, 10); // should already be done!
          adc_pstat2 = HAL_ADC_PollForConversion(&hadc2, 10); // should already be done!
          adc3 = HAL_ADC_GetValue(&hadc3);
          adc2 = HAL_ADC_GetValue(&hadc2);
          adc1 = HAL_ADC_GetValue(&hadc1);

                  if (adc_pstat2 ||adc_pstat3)
                     asm("\t nop");
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          sysclk = HAL_GetTick();

          if ( (sysclk - 1000) > old_sysclk ){
              //printf("nucleo F446 0x%X adc3_0 0x%X adc3_1 0x%X adc3_2 0x%X\n",sysclk,adc3_0,adc3_1,adc3_2);
              printf("|->nucleo F446 sysclk=0x%X adc1=0x%X adc2=0x%X adc3=0x%X\n",sysclk,adc1,adc2,adc3);
              old_sysclk = sysclk;
          }
      }
      /* USER CODE END 3 */
    }

2 个答案:

答案 0 :(得分:1)

您的代码不会同时读取,因为您没有在准时启动ADC。

您需要对所有这些触发器使用相同的外部触发器,或者在双精度或三重模式下使用ADC。

答案 1 :(得分:0)

CubeMX ADC setup我找到了一种轻松实现此目的的方法。我设置了一个计时器,并用来更新触发事件。然后,ADC触发该事件(TIM8_TRGO)。 使用该触发器,我可以让两个或三个ADC同时读取。 双重同步模式似乎支持ADC同时读取