liuqian 发表于 2023-12-4 15:45:10

STM32F030的内部温度传感器,测出来差20度

一共配置3个AD通道,【0】外部电压0,【1】外部电压1,【2】温度传感器,使用电源的3.3V作为参考电压

初始化部分:
void MX_ADC_Init(void)
{

/* USER CODE BEGIN ADC_Init 0 */

/* USER CODE END ADC_Init 0 */

ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC_Init 1 */

/* USER CODE END ADC_Init 1 */

/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = ENABLE;
hadc.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
    Error_Handler();
}

/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
    Error_Handler();
}

/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_9;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
    Error_Handler();
}

/** Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
    Error_Handler();
}

/* USER CODE BEGIN ADC_Init 2 */

/* USER CODE END ADC_Init 2 */

}


ADC使用DMA采样,得到的值存在pData
pData【0】581 =》468mv 和测量值匹配
pData【1】576 =》464mv 和测量值匹配
pData【2】1665 =》温度通道的值


温度转换部分
/*
*         TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP
* T('c) = ------------------------------------------- X (TEMPSENSOR_data - TEMPSENSOR_CAL1) + 30
*            TEMPSENSOR_CAL2 - TEMPSENSOR_CAL1
*
* TEMPSENSOR_CAL_VREFANALOG = 3300
* TEMPSENSOR_CAL2_TEMP = 110
* TEMPSENSOR_CAL1_TEMP = 30
* TEMPSENSOR_CAL2 = (*TEMPSENSOR_CAL2_ADDR) value when vref=3300
* TEMPSENSOR_CAL1 = (*TEMPSENSOR_CAL1_ADDR) value when vref=3300
*/
int8_t GetTcpu()
{
        int c1 = *TEMPSENSOR_CAL1_ADDR;
        int c2 = *TEMPSENSOR_CAL2_ADDR;
        int t = ((TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP) * (pData - c1)) / (c2 - c1) + 30;
        if (t < 0)
        {
                t = 0;
        }
        else if (t > 128)
        {
                t = 128;
        }
        return t;
}

这里
        int c1 = *TEMPSENSOR_CAL1_ADDR; =》1768
        int c2 = *TEMPSENSOR_CAL2_ADDR; =》1311
算出来 t=》46度

实际室温24度。这也差太远了。
另外一块板上用的STM32H723,算出来的温度是31度,算是正常。




leafstamen 发表于 2023-12-4 15:50:06

他提供的是cpu的温度,又不是室温。

陆小凤之北京 发表于 2023-12-4 17:16:09

测温用热电阻或者热电偶

Joshua_Astray 发表于 2023-12-4 17:39:12

ST的规格书里面已经说明了,只能保证相对温度,不保证绝对温度,要用的话,每个都要经过校准

ibmx311 发表于 2023-12-5 06:40:40

想测温就好好搞恒流源,然后pt100

令狐冲 发表于 2023-12-5 09:07:17

相对温度是准确的,绝对温度不准。如果单片机功耗一定,标定校准记录下,比如在25°恒温下,记录下读取的数值,然后根据变化算实际温度。
页: [1]
查看完整版本: STM32F030的内部温度传感器,测出来差20度