你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何减少STM32F103 ADC采集时间

[复制链接]
ldptest 提问时间:2020-11-27 10:34 /
环境:
STM32CubeMX 5.6.1(库为:STM32F11.8.0
IAR for ARM 8.40.2
STM32F103C8T6 BluePill

问题:
使用PA1~PA4进行4ADC采集,采用时间为7.5周期,测试出来每通道采样时间居然为10ms,当采用时间为239.5周期时,采样时间高达134ms。换了另一块板也一样。
时间间隔.png

设置:
时钟设置
时钟.png
ADC设置
设置.png

原代码:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_RTC_Init();
uint16_t ADC_Value[4];
TestPin_Toggle;                                                  //翻转Pin脚电平,测试时间用
ADC1_Conversion(ADC_Value);        //获取ADC
while (1)
  {  }
}

void ADC1_Conversion(uint16_t *p)
{
uint8_t j;
for(j=0;j<4;j++)
  {
   HAL_ADC_Start(&hadc1);
   HAL_ADC_PollForConversion(&hadc1,0xFFFF);    //等待转换完成
   *p++ = HAL_ADC_GetValue(&hadc1);
   TestPin_Toggle;                                                     //翻转Pin脚电平,测试时间用
  }
HAL_ADC_Stop(&hadc1);
}

其中 HAL_ADC_PollForConversion(&hadc1,0xFFFF); 就耗费了10ms

/* ADC1 init function */
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};

  /**Common config
  */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = ENABLE;
hadc1.Init.NbrOfDiscConversion = 1;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 4;
  if(HAL_ADC_Init(&hadc1) != HAL_OK)
  {
   Error_Handler();
  }
  /**Configure Regular Channel
  */
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
   Error_Handler();
  }
  /**Configure Regular Channel
  */
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_2;
  if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
   Error_Handler();
  }
  /**Configure Regular Channel
  */
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_3;
  if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
   Error_Handler();
  }
  /**Configure Regular Channel
  */
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_4;
  if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
   Error_Handler();
  }
}

收藏 评论3 发布时间:2020-11-27 10:34

举报

3个回答
小歆-2051663 回答时间:2020-11-27 14:20:12
可以尝试使用DMA
ldptest 回答时间:2020-11-29 14:53:59
尝试使用DMA,时间是少了些,但远没达到要求。
启动DMA用了94.4us
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)(ADCSample),2);
转换完成,再用了1.09ms

而我希望每隔20us对4个通道进行一次ADC,并记录。
grayloach 回答时间:2020-11-29 16:43:47
这么长时间,是不是测试有问题哦。试试寄存器操作呗,用ADC的独立时钟,最快一个微秒不到就可以采集一个AD。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版