HAL_ADC_PollForConversion - 它到底是做什么用的?

Daw*_*d W 1 stm32 adc nucleo stm32cubeide

我已经对 STM32 (F103RB) 进行了几周的修修补补,但我不明白的一件事是

HAL_ADC_PollForConversion
Run Code Online (Sandbox Code Playgroud)

功能目的。我的意思是,我没有看到此功能对 ADC 读数有任何影响。这是我的代码示例:

   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);
    
        }
Run Code Online (Sandbox Code Playgroud)

就我的观察而言,是否使用 PollForConversion 并不重要 - UART 监视器上的读数看起来是相同的(尽管我不能 100% 确定它们实际上相同的)。连续模式被禁用。我在这里缺少什么?

小智 5

使用 启动 ADC 后HAL_ADC_Start(),硬件开始 ADC 转换。这个转换需要一些时间。确切的时间取决于 Cube 中的 ADC 配置,ADC 预分频器和周期数的值越大,所需的时间越长。

转换完成后,ADC 硬件中的 EOC 标志被置位,测量值被放入寄存器中。您可以使用HAL_ADC_GetValue()函数读取该值。但如果您在转换结束之前读取它,您可能会得到损坏的数据或先前测量的旧值。

这就是为什么您应该始终等到 EOC 标志被设置 - 这正是HAL_ADC_PollForConversion所做的事情。

在您的示例中,如果没有轮询,您可能会在当前测量结束之前读取上一次测量的值。或者,当 EOC 标志设置时,与硬件交互的 HAL 函数可能足够慢,无法实际读取数据。您可以将 Cube 中的 ADC 时钟周期数增加到最大值并尝试,您应该从上次测量中获得一个值。