首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HAL_ADC_PollForConversion -它到底是干什么用的?

HAL_ADC_PollForConversion -它到底是干什么用的?
EN

Stack Overflow用户
提问于 2022-04-27 09:58:15
回答 1查看 2.4K关注 0票数 0

我已经在STM32 (F103RB)做了几个星期的修补,但有一件事我不明白

代码语言:javascript
运行
复制
HAL_ADC_PollForConversion

功能目的。我是说,我看不出这个功能对ADC读数有什么影响。下面是我的代码示例:

代码语言:javascript
运行
复制
   Version 1 (with PollForConversion on)

     while (1)
    
    {
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
         
        uint32_t value = HAL_ADC_GetValue(&hadc1);
        float voltage = 3.3f * value / 4096.0f;
         
        printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART
        HAL_Delay(250);
    
        }

Version 2 (with PollForConvertion off)

     while (1)
    
    {
        HAL_ADC_Start(&hadc1);
        //HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
         
        uint32_t value = HAL_ADC_GetValue(&hadc1);
        float voltage = 3.3f * value / 4096.0f;
         
        printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART
        HAL_Delay(250);
    
        }

就我的观察而言,我是否使用PollForConversion并不重要-- UART监视器上的读数是一样的(我也不是100%肯定它们的实际上是相同的)。连续模式被禁用。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-27 10:26:44

使用HAL_ADC_Start()启动ADC后,硬件将启动ADC转换。这种转换需要一些时间。准确的时间取决于您的ADC配置在立方体,更大的值ADC预分频器和循环计数,它需要更长的时间。

转换完成后,在ADC硬件中设置EOC标志,并将测量值放置在寄存器中。您可以使用HAL_ADC_GetValue()函数读取该值。但是,如果您在转换结束之前阅读它,您可能会从以前的度量中获得已损坏的数据或旧值。

这就是为什么您应该一直等待直到EOC标志被设置--这正是HAL_ADC_PollForConversion所做的。

在您的示例中,在没有轮询的情况下,您可能会在当前度量结束之前从以前的度量中读取值。或者,当设置EOC标志时,与硬件交互的HAL函数可能会慢到实际读取数据的速度。您可以将立方体中的ADC时钟周期增加到最大,然后尝试它,您应该从上一次测量中得到一个值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72026798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档