当前位置:   article > 正文

在学习HAL库ADC遇到的问题_hal库adc单通道采集导致while循环无法进行

hal库adc单通道采集导致while循环无法进行
  1. /* Infinite loop */
  2. /* USER CODE BEGIN WHILE */
  3. while (1)
  4. {
  5. HAL_ADC_Start(&hadc2);//配置成不连续转化情况下在这个函数里就已经把转化成功的标位清掉了,所以if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)里的无法执行
  6. HAL_ADC_PollForConversion(&hadc2,100);//等待常规组转化完成
  7. if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)//改成连续转化可以正常运行
  8. {
  9. ADC_Value_temp=HAL_ADC_GetValue(&hadc2);
  10. printf("%d\r\n",ADC_Value_temp);
  11. ADC_Value=(3.3/4096)*ADC_Value_temp;
  12. printf("%lf\r\n",ADC_Value);
  13. // ADC2->ISR&=0XfffD;//如果不清除标志位那就不会更新数据
  14. // __HAL_ADC_CLEAR_FLAG(&hadc2, 0xfffd);//ADC_FLAG_EOC标志位出错了
  15. }
  16. HAL_Delay(500);
  17. }

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

  1. HAL_ADC_Start(&hadc2);
  2. HAL_ADC_PollForConversion(&hadc2,100);
  3. while (1)
  4. {
  5. if(( HAL_ADC_GetState(&hadc2) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)//改成连续转化可以正常运行
  6. {
  7. ADC_Value_temp=HAL_ADC_GetValue(&hadc2);
  8. printf("%d\r\n",ADC_Value_temp);
  9. ADC_Value=(3.3/4096)*ADC_Value_temp;
  10. printf("%lf\r\n",ADC_Value);
  11. ADC2->ISR&=0XfffD;//如果不清除标志位那就不会更新数据
  12. }
  13. HAL_Delay(500);
  14. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/473741
推荐阅读
相关标签
  

闽ICP备14008679号