硬汉嵌入式论坛

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

[ADC] 为什么STM32H7的ADC总是采集一段时间后才能稳定?

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-4-28 18:20:46 | 显示全部楼层 |阅读模式
本帖最后由 Freedom109079 于 2024-4-29 09:21 编辑



STM32H7的ADC每次启动采集数据 总是要采集一段时间后才能稳定。  




--------------------------------------------配置

/* 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 */

  /* 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_SEQ_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc1.Init.OversamplingMode = DISABLE;
  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_1CYCLE_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 */

  /* USER CODE END ADC1_Init 2 */

}





//ADC1初始化
void MIC_ADC1_Init(void)
{
        HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);        
}

//启动MIC信号采集
void MIC_ADC1_Start(void)
{
        HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&MIC_ADC_Data, MIC_ADC_BUFFER_SIZE);
}

//停止MIC信号采集
void MIC_ADC1_Stop(void)
{
        HAL_ADC_Stop_DMA(&hadc1);
}



screenshot-1714353540224.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2024-4-29 08:14:09 | 显示全部楼层
这个考虑检测下板子上面ADC外置稳压基准的峰峰值,看看是不是上电这段时间不稳定。
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-4-29 09:29:00 | 显示全部楼层
eric2013 发表于 2024-4-29 08:14
这个考虑检测下板子上面ADC外置稳压基准的峰峰值,看看是不是上电这段时间不稳定。

我启动ADC不是在上电初始化过程的,是接收串口指令后也等一段时间才使能ADC,采集完就停止。 下次开始采集也一样的问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2024-4-29 12:28:11 | 显示全部楼层
Freedom109079 发表于 2024-4-29 09:29
我启动ADC不是在上电初始化过程的,是接收串口指令后也等一段时间才使能ADC,采集完就停止。 下次开始采 ...

建议测试下稳压基准的峰峰值,是不是启动后这段时间抖动有点大。
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-4-30 10:54:29 | 显示全部楼层
eric2013 发表于 2024-4-29 12:28
建议测试下稳压基准的峰峰值,是不是启动后这段时间抖动有点大。

谢谢, 示波器上看是有微弱的波动
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 07:43 , Processed in 0.418326 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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