以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为真实值。