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 时钟周期数增加到最大值并尝试,您应该从上次测量中获得一个值。
| 归档时间: |
|
| 查看次数: |
9219 次 |
| 最近记录: |