wenbo2005.online

学习记录 / STM32

STM32 内部温度传感器与内部电压

STM322024-07-23

以STM32G431RBT6为例:

1,数据手册搜索:Temperature sensor characteristics,在一个表格中找到这两行数据:

Symbol            Parameter                 Min         Typ       Max     Unit

Avg_Slope(1)     Average slope                2.3        2.5         2.7         mV/°C(注意单位)

V30             Voltage at 30°C (±5 °C)    0.742      0.76     0.785         V    (注意这里的30度)

其中,用到 V30 = 0.76 ,avg_slope = 0.0025,adc_volt为采集到的电压值。

TEMP = (V30 - adc_volt) /  avg_slope + 30;

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);

  while (1)
  {
        HAL_ADC_Start(&hadc1);

        HAL_ADC_PollForConversion(&hadc1,10);

        float adc_val = HAL_ADC_GetValue(&hadc1) / 4095.0f * 3.3f;            //ADC1的通道16

        short temp = (0.76f - adc_val) / 0.0025f + 30.0f;

         printf("ADC:%.2fV\r\n",adc_val);
        printf("TEMP:%d'C\r\n",temp);
        HAL_Delay(200);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

以G431CBT6为例,数据手册搜索:refint,在一个表格中找到这行数据:

Symbol         Parameter                 Conditions             Min         Typ         Max         Unit  
VREFINT         Internal reference voltage     –40 °C < TA < +130 °C     1.182     1.212     1.232        V

知道了内部参考电压大概在1.22V左右,是ADC_IN18(有些是ADC_IN17-->后备电源电压)

ADC 开启Vrefint 通道即可,需要充足的时间与校准ADC;

采集到的数据可以作为其他ADC通道的参考电压(更精准):

__IO uint16_t VREFINT_CAL=0;
VREFINT_CAL=*(__IO uint16_t *)(0x1FFF75A8);             //根据数据手册中的地址0x1FFF75A8(关键字:refint),得到VREFINT_CAL(内部参考电压校准值)

VREFINT_CAL:1026 (G431CBT6)            VREFINT_DATA: ADC_IN17采集的原始数据

ADC_DATAX: 另一个通道的原始数据             FULL_SCALE: 4095(分辨率)

公式:

根据公式计算到电压值: Vactual = 3 * VREFINT_CAL * ADC_DATAX / (VREFINT_DATA * 4095)

因为接了一个桥式分压器,所以需要乘以3为真实值。