HAL_ADC_PollForConversion - 它到底是做什么用的?
HAL_ADC_PollForConversion - what exactly is it for?
我已经研究 STM32 (F103RB) 几个星期了,有一件事我不明白
HAL_ADC_PollForConversion
功能用途。我的意思是,我没有看到此功能对 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);
}
就我的观察而言,我是否使用 PollForConversion 并不重要 - UART 监视器上的读数 看起来 相同(尽管我不是 100 % 确定他们实际上 相同)。连续模式被禁用。我在这里错过了什么?
用HAL_ADC_Start()
启动ADC后,硬件开始ADC转换。这种转换需要一些时间。具体时间取决于您在 Cube 中的 ADC 配置,ADC 预分频器和循环计数的值越大,所需时间越长。
转换完成后,ADC硬件中的EOC标志置位,测量值存入寄存器。您可以使用 HAL_ADC_GetValue()
函数读取该值。但是,如果您在转换结束之前读取它,您可能会得到损坏的数据或先前测量的旧值。
这就是为什么你应该一直等到 EOC 标志被设置 - 这正是 HAL_ADC_PollForConversion
所做的。
在您没有轮询的示例中,您可能会在当前测量结束之前读取上一次测量的值。或者,与硬件交互的 HAL 函数可能慢到足以在设置 EOC 标志时实际读取数据。您可以将 Cube 中的 ADC 时钟周期数增加到最大值然后尝试,您应该从上次测量中得到一个值。
我已经研究 STM32 (F103RB) 几个星期了,有一件事我不明白
HAL_ADC_PollForConversion
功能用途。我的意思是,我没有看到此功能对 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);
}
就我的观察而言,我是否使用 PollForConversion 并不重要 - UART 监视器上的读数 看起来 相同(尽管我不是 100 % 确定他们实际上 相同)。连续模式被禁用。我在这里错过了什么?
用HAL_ADC_Start()
启动ADC后,硬件开始ADC转换。这种转换需要一些时间。具体时间取决于您在 Cube 中的 ADC 配置,ADC 预分频器和循环计数的值越大,所需时间越长。
转换完成后,ADC硬件中的EOC标志置位,测量值存入寄存器。您可以使用 HAL_ADC_GetValue()
函数读取该值。但是,如果您在转换结束之前读取它,您可能会得到损坏的数据或先前测量的旧值。
这就是为什么你应该一直等到 EOC 标志被设置 - 这正是 HAL_ADC_PollForConversion
所做的。
在您没有轮询的示例中,您可能会在当前测量结束之前读取上一次测量的值。或者,与硬件交互的 HAL 函数可能慢到足以在设置 EOC 标志时实际读取数据。您可以将 Cube 中的 ADC 时钟周期数增加到最大值然后尝试,您应该从上次测量中得到一个值。