在学习HAL库ADC遇到的问题

文章讨论了STM32的HAL库中ADC模块在单次和连续转化模式下的使用,强调了在连续模式下清除标志位EOC的重要性,以确保数据的正确更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_ADC_Start(&hadc2);//配置成不连续转化情况下在这个函数里就已经把转化成功的标位清掉了,所以if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)里的无法执行

	HAL_ADC_PollForConversion(&hadc2,100);//等待常规组转化完成
		if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)//改成连续转化可以正常运行
		{
		    ADC_Value_temp=HAL_ADC_GetValue(&hadc2);
			  printf("%d\r\n",ADC_Value_temp);
			  ADC_Value=(3.3/4096)*ADC_Value_temp;
			  printf("%lf\r\n",ADC_Value);
//			  ADC2->ISR&=0XfffD;//如果不清除标志位那就不会更新数据
//			__HAL_ADC_CLEAR_FLAG(&hadc2, 0xfffd);//ADC_FLAG_EOC标志位出错了
		}
		HAL_Delay(500);
   }

 以上代码是基于单次转化模式下(ADC启动后只转化一次数据所以HAL_ADC_Start()和HAL_ADC_PollForConversion()函数要写在while(1)中,否则转化一次后不会在转化新的数据)的,不需要对标志位进行清零,因为在HAL_ADC_Start()函数中会对标志位清零

    HAL_ADC_Start(&hadc2);
	HAL_ADC_PollForConversion(&hadc2,100);
  while (1)
  {

		if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)//改成连续转化可以正常运行
		{
		    ADC_Value_temp=HAL_ADC_GetValue(&hadc2);
			  printf("%d\r\n",ADC_Value_temp);
			  ADC_Value=(3.3/4096)*ADC_Value_temp;
			  printf("%lf\r\n",ADC_Value);
			  ADC2->ISR&=0XfffD;//如果不清除标志位那就不会更新数据
		}
		HAL_Delay(500);
  }

以上代码是配置成连续转化模式下(只要ADC一开始转化就会不断的转化下去除非有中断或者停止ADC转化)的,可以将HAL_ADC_Start()和HAL_ADC_PollForConversion()函数放在while(1)外已启动转化。此模式下必须清除转化标志EOC位,否则ADC数据不会更新

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值