STM32-F410RB内部温度传感器读数仅复位后更新问题求助
解决方案
1. 读取前等待ADC转换完成
当前代码直接调用HAL_ADC_GetValue时,没有确保读取的是最新转换结果,导致一直获取第一次转换的寄存器值。修改循环内代码,添加转换完成等待:
while (1) { uint16_t readValue; float tCelsius; // 等待ADC完成转换,超时时间100ms足够覆盖采样周期 if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) { readValue = HAL_ADC_GetValue(&hadc1); tCelsius = ((float)readValue) * 3300.0 / 4095.0; // 转换为mV tCelsius = (tCelsius - 500.0) / 10.0; // 转换为摄氏度 UART_SEND_TXT(&huart2, "Temperature = ", 0); UART_SEND_FLT(&huart2, tCelsius, 1); } HAL_Delay(1000); }
2. 优化ADC配置
- 单通道采集温度传感器时,可将CubeMX中ADC的Scan Conversion Mode设为
Disabled,扫描模式对单通道无意义,可能干扰连续转换逻辑。 - 确认Continuous Conversion Mode已设为
Enabled,确保ADC完成一次转换后自动启动下一次。
3. 可选:用中断回调读取数据(更高效)
如果不想用轮询,可通过ADC中断回调获取最新值:
步骤1:CubeMX配置
在ADC1页面的NVIC Settings中勾选ADC global interrupt,启用中断。
步骤2:代码修改
float g_tCelsius = 0.0f; // 全局变量存储温度值 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); MX_ADC1_Init(); HAL_ADC_Start_IT(&hadc1); // 启动ADC并开启中断 while (1) { UART_SEND_TXT(&huart2, "Temperature = ", 0); UART_SEND_FLT(&huart2, g_tCelsius, 1); HAL_Delay(1000); } } // ADC转换完成回调函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { if (hadc->Instance == ADC1) { uint16_t readValue = HAL_ADC_GetValue(&hadc1); g_tCelsius = ((float)readValue) * 3300.0 / 4095.0; g_tCelsius = (g_tCelsius - 500.0) / 10.0; // 连续转换模式下,ADC会自动启动下一次转换,无需手动重启 } }
4. 验证参考电压
确认代码中使用的3300.0mV与开发板实际VDD电压匹配,同时CubeMX中需确保VREFINT已启用(部分STM32型号需要手动开启该内部参考源)。
内容的提问来源于stack exchange,提问作者Naveen PS
相关产品推荐
相关产品推荐

