ST意法半导体
直播中

岳臻俊

8年用户 1086经验值
私信 关注
[问答]

STM32G431 MCU ADC如何控制采样率?

我在双模式下使用 STM32G431 MCU ADC。我试图控制采样率并发现了一个令人沮丧的问题。我不需要扫描多个频道。虽然获得最大采样率或通过预分频器控制采样率的唯一方法是启用扫描模式。这将是一个可以接受的变通办法,但扫描模式会将它自己不需要的伪影引入样本中。在扫描模式下,虽然我可以获得我想要的速率,但我从扫描的通道中获得了我不需要的额外数据。
如果我不使用扫描模式,采样率固定在 300ksps 左右,这不够快。除此之外,在这种情况下,通过预分频器显然不可能降低采样率。
有什么想法可以在没有扫描模式的情况下进行这些转换,同时完全控制 adc 时钟吗?
  • void
  • MX_ADC1_Init
  • (
  • void
  • )
  • {
  •   ADC_MultiModeTypeDef multimode = {0};
  •   ADC_ChannelConfTypeDef sConfig = {0};
  •   hadc1.Instance = ADC1;
  •   hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
  •   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  •   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  •   hadc1.Init.GainCompensation = 0;
  •   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  •   hadc1.Init.EOCSelection =ADC_EOC_SINGLE_CONV;
  •   hadc1.Init.LowPowerAutoWait = DISABLE;
  •   hadc1.Init.ContinuousConvMode = DISABLE;
  •   hadc1.Init.NbrOfConversion = 5;//ADC_BUFFER_LEN;
  •   hadc1.Init.DiscontinuousConvMode = DISABLE;
  •   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  •   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  •   hadc1.Init.DMAContinuousRequests = DISABLE;
  •   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  •   hadc1.Init.OversamplingMode = DISABLE;
  • /*  oversmp.Ratio=ADC_OVERSAMPLING_RATIO_16;
  •   oversmp.RightBitShift =0;
  •   oversmp.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
  •   oversmp.OversamplingStopReset = ADC_REGOVERSAMPLING_RESUMED_MODE;
  •   hadc1.Init.Oversampling =oversmp;*/
  •   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  •   {
  •   }
  •   // Configure the ADC multi-mode
  •   multimode.Mode = ADC_DUALMODE_REGSIMULT;
  •     multimode.DMAAccessMode = ADC_DMAACCESSMODE_12_10_BITS;
  •     multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
  •   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  •   {
  •   }
  • // Configure Regular Channel
  •   sConfig.Channel = ADC_CHANNEL_15;
  •   sConfig.Rank = ADC_REGULAR_RANK_1;
  •   sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5;
  •   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  •   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  •   sConfig.Offset = 0;
  •   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  •   {
  •     //Error_Handler();
  •   }
  •   HAL_ADC_Start(&hadc2);
  • }
  • //=============================================================================
  • /**
  • @return
  • - none
  • Initializes adc2
  • */
  • void
  • MX_ADC2_Init
  • (
  • void
  • )
  • {
  •   /* USER CODE BEGIN ADC1_Init 0 */
  •   /* USER CODE END ADC1_Init 0 */
  •   ADC_MultiModeTypeDef multimode = {0};
  •   ADC_ChannelConfTypeDef sConfig = {0};
  •   /* USER CODE BEGIN ADC1_Init 1 */
  •   /* USER CODE END ADC1_Init 1 */
  •   /** Common config
  •   */
  •   hadc2.Instance = ADC2;
  •   hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
  •   hadc2.Init.Resolution = ADC_RESOLUTION_12B;
  •   hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  •   hadc2.Init.GainCompensation = 0;
  •   hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
  •   hadc2.Init.EOCSelection =ADC_EOC_SINGLE_CONV;
  •   hadc2.Init.LowPowerAutoWait = DISABLE;
  •   hadc2.Init.ContinuousConvMode = ENABLE;
  •   hadc2.Init.NbrOfConversion = 1;//ADC_BUFFER_LEN;
  •   hadc2.Init.DiscontinuousConvMode = DISABLE;
  •   hadc2.Init.DMAContinuousRequests = DISABLE;
  •   hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  •   hadc2.Init.OversamplingMode = DISABLE;
  •   /*hadc2.Init.Oversampling =oversmp;*/
  •   if (HAL_ADC_Init(&hadc2) != HAL_OK)
  •   {
  •    // Error_Handler();
  •   }
  •   sConfig.Channel = ADC_CHANNEL_17;
  •   sConfig.Rank = ADC_REGULAR_RANK_1;
  •   sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5;
  •   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  •   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  •   sConfig.Offset = 0;
  •   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  •   {
  •     //Error_Handler();
  •   }
  •   /* USER CODE END ADC1_Init 2 */
  •   HAL_ADC_Start(&hadc2);
  • }





回帖(1)

陈丽霞

2023-2-3 15:07:23
采样率固定在 300ksps 左右
您尝试使用可能较慢的 Cube/HAL 函数轮询 ADC 时可能会给出此限制。
也许您想使用连续模式和 DMA。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分