You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:23:11