硬汉嵌入式论坛

 找回密码
 立即注册
查看: 363|回复: 3
收起左侧

[ADC] STM32H750 ADC DMA TIM双缓冲模式采集频率不一致问题

[复制链接]

6

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2025-6-25 10:01:16 | 显示全部楼层 |阅读模式

定时器用的是2Mhz,ADC采集数据长度是200,但是半缓冲完成中断内IO翻转频率只有5K,与理论差太多是怎么回事,代码如下

/* ADC1 init function */void MX_ADC1_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 */
/* 采用AHB同步时钟,4分频,即200MHz/4 = 50MHz */
  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_CC4;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc1.Init.OversamplingMode = DISABLE;
  hadc1.Init.Oversampling.Ratio = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure the ADC multi-mode
  */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_3;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  sConfig.OffsetSignedSaturation = DISABLE;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */
  /* ADC时钟超过20MHz的话,使能boost */
//  ADC_ConfigureBoostMode(&hadc1);
        HAL_Delay(100);
        if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
        {
                        Error_Handler();
        }
///TCONV=0.043US
//         if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
//        {
//      Error_Handler();
//        }
          HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc1_buf, ADC_BUF_LEN);

  /* USER CODE END ADC1_Init 2 */

}
/* TIM3 init function */
void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM3_Init 1 */
//Prescaler = 3;    // 分频 4 ? 200 MHz / 4 = 50 MHz
//Period = 199;     // ? 输出 = 50 MHz / 200 = 250 kHz
  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 99;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC4REF;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 50;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */
  /* 启动OC1 */
        if(HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_4) != HAL_OK)
        {
                Error_Handler();
        }

  /* USER CODE END TIM3_Init 2 */

}
/* 回调函数:半缓冲完成 */
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
    if (hadc->Instance == ADC1)
    {
        adc1_Cplt = 1;
                                labelTogglePin;
//       tx_event_flags_set(&event_flags, 0x1, TX_OR);
    }
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-25 15:18:42 | 显示全部楼层
感觉你这个符合二分频。

你测试下200KHz触发,是不是翻转频率就是500Hz了
回复

使用道具 举报

6

主题

9

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2025-6-25 16:26:08 | 显示全部楼层
eric2013 发表于 2025-6-25 15:18
感觉你这个符合二分频。

你测试下200KHz触发,是不是翻转频率就是500Hz了

测试了250KHz触发,翻转频率是625Hz,算起来是二分频,但我配置的ADC频率是72/2=36MHZ
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-26 09:49:58 | 显示全部楼层
meng3983 发表于 2025-6-25 16:26
测试了250KHz触发,翻转频率是625Hz,算起来是二分频,但我配置的ADC频率是72/2=36MHZ

看反转频率的时候,测出的反转方波频率值乘以2了吧。

V版硬件芯片,虽然ADC主频上强制二分频了,但是不会影响250KHz的触发速度。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:53 , Processed in 0.055304 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表