stm32同步adc读取

stm32同步adc读取,c,embedded,stm32,adc,simultaneous,C,Embedded,Stm32,Adc,Simultaneous,我一直在使用STM32 IDE,它包含了CUBE MX 使用HAL代码,我可以在三个管脚上读取,每个管脚使用单独的ADC 别针。 我已经同时启动了所有ADC,然后我投票决定是否完成。 我认为这些ADC读数实际上应该是同步的(即。 他们都是在一个非常相似的时间读书的 下面是代码片段。 使用核子-STM32 F446RE btw MX_ADC1_Init(); MX_ADC2_Init(); MX_ADC3_Init(); MX_USART1_UART_Init(); /* US

我一直在使用STM32 IDE,它包含了CUBE MX

使用HAL代码,我可以在三个管脚上读取,每个管脚使用单独的ADC 别针。 我已经同时启动了所有ADC,然后我投票决定是否完成。 我认为这些ADC读数实际上应该是同步的(即。 他们都是在一个非常相似的时间读书的

下面是代码片段。 使用核子-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 */
    }
我找到了一种简单易行的方法。我设置了一个计时器,用来更新触发事件。ADC随后触发该事件(TIM8_TRGO)。 使用此触发器,我可以同时读取两个或三个ADC。
双同时模式似乎支持ADC同时读取

您的代码不会同时读取,因为您不会在sime时刻启动ADC


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

是的,ADC在与人类感知非常相似的时间进行采样。不,它们不是同时发生的。考虑一下对于应用程序需求来说,几乎是同时满足的。通过使用触发信号一起触发ADC,您可能会更接近同步。或者,您可以通过使用一个ADC快速连续地对所有三个通道进行采样来获得更确定的增量采样时间。HAL在计算时间方面不是非常有效(因为它考虑了所有可能的用例)。因此,在调用
HAL\u ADC\u Start
之间可能会有几十个CPU周期。因此,如果您的CPU没有以最高频率运行,比如说几兆赫以节省电源,那么延迟很可能是几毫秒,这在某些应用程序中是不可忽略的。@kkrambo请添加您的评论作为回答现在CubeMX中有一个“tripple”同时模式。@Lundin恐怕您是100%错了。该微型机有3个独立的ADC。每个ADC都有许多通道(最多20个通道,包括内部通道)。它们可以自动工作,或者ADC可以是一个主设备,一个同步另一个。您可以同时读取3个读数,也可以将2.4MSPS的采样率提高三倍至7.2mps(甚至可以进一步降低分辨率)。在CubeMX中,我将ADC1设置为“双正则同步”。ADC1设置为从TIM8_GO触发。索兹应该提到这一点。当ADC1处于该状态时,ADC2和ADC3在GUI中同时显示“双正则”(且不能更改)。我假设所有三个ADC在看到TIM8_GO标志时都会启动转换,这是由于定时器8溢出。我还设置了ADC中断。对于所有三个转换,似乎只有一个中断。这向我表明所有三个ADC都是链接的。我确实认为它们正在同时读取,但将使用sig gen执行测试以确认(假设)这一点。同意原始发布中的代码不会同时出现。将其配置为DMA。请参阅关于ADC DMA[链接]