搜索
bottom↓
回复: 5

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

[复制链接]

出0入4汤圆

发表于 2023-12-4 15:45:10 | 显示全部楼层 |阅读模式
一共配置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[ADC_T_CPU] - 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度,算是正常。




出0入57汤圆

发表于 2023-12-4 15:50:06 | 显示全部楼层
他提供的是cpu的温度,又不是室温。

出0入0汤圆

发表于 2023-12-4 17:16:09 | 显示全部楼层
测温用热电阻或者热电偶

出0入0汤圆

发表于 2023-12-4 17:39:12 | 显示全部楼层
ST的规格书里面已经说明了,只能保证相对温度,不保证绝对温度,要用的话,每个都要经过校准

出0入300汤圆

发表于 2023-12-5 06:40:40 来自手机 | 显示全部楼层
想测温就好好搞恒流源,然后pt100

出0入32汤圆

发表于 2023-12-5 09:07:17 | 显示全部楼层
相对温度是准确的,绝对温度不准。如果单片机功耗一定,标定校准记录下,比如在25°恒温下,记录下读取的数值,然后根据变化算实际温度。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 18:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表