STM32 内部温度传感器测量程序(标准库函数版)
一、核心原理与硬件基础1. 内部温度传感器简介STM32多数型号如F1/F4/L0系列内置温度传感器用于监测芯片内部温度其核心特性连接通道STM32F103系列中内部温度传感器连接ADC1的通道16需使能TSVREFE位。测量范围-40℃~125℃具体以数据手册为准。精度±1.5℃典型值受VDDA电压、采样时间影响。转换公式基于传感器输出电压与温度的线性关系需参考芯片数据手册。2. 温度计算原理根据STM32F103数据手册内部温度传感器输出电压VSENSEV_{SENSE}VSENSE与温度TTT的关系为VSENSEV25−(T−25)×Avg_SlopeV_{SENSE} V_{25} - (T - 25) \times \text{Avg\_Slope}VSENSEV25−(T−25)×Avg_Slope其中V25V_{25}V2525℃时的输出电压典型值1.43VAvg_Slope\text{Avg\_Slope}Avg_Slope温度系数典型值4.3mV/℃TTT实际温度℃。通过ADC采集VSENSEV_{SENSE}VSENSE对应的数字量反推温度T25V25−VSENSEAvg_SlopeT 25 \frac{V_{25} - V_{SENSE}}{\text{Avg\_Slope}}T25Avg_SlopeV25−VSENSE其中VSENSEADC值×VDDA4095V_{SENSE} \frac{\text{ADC值} \times V_{\text{DDA}}}{4095}VSENSE4095ADC值×VDDA12位ADCVDDAV_{\text{DDA}}VDDA为ADC参考电压通常3.3V。二、程序设计基于STM32F103标准库1. 核心函数组成函数功能依赖库文件ADC1_TempSensor_Init初始化ADC1及内部温度传感器通道stm32f10x_adc.c、stm32f10x_rcc.cADC1_Read_Temp读取ADC值并计算温度℃stm32f10x_adc.c2. 完整代码实现2.1 头文件与宏定义temp_sensor.h#ifndef__TEMP_SENSOR_H#define__TEMP_SENSOR_H#includestm32f10x.h// ADC参数定义STM32F103#defineADC1_DR_Address((uint32_t)0x4001244C)// ADC1数据寄存器地址#defineTEMP_SENSOR_CHADC_Channel_16// 内部温度传感器通道ADC1_CH16#defineVDDA_VOLTAGE3.3f// ADC参考电压单位V#defineV251.43f// 25℃时传感器输出电压单位V#defineAVG_SLOPE0.0043f// 温度系数4.3mV/℃单位V/℃// 函数声明voidADC1_TempSensor_Init(void);// 初始化ADC1及温度传感器floatADC1_Read_Temp(void);// 读取温度值返回℃#endif/* __TEMP_SENSOR_H */2.2 源文件实现temp_sensor.c#includetemp_sensor.h#includestm32f10x_adc.h#includestm32f10x_rcc.h#includestm32f10x_gpio.h/** * brief 初始化ADC1及内部温度传感器通道 * param 无 * retval 无 */voidADC1_TempSensor_Init(void){ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 1. 使能时钟ADC1、GPIOA、AFIORCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);// 2. 配置ADC时钟PCLK2分频最大14MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);// 72MHz/612MHzSTM32F103最高ADC时钟// 3. 配置GPIO内部温度传感器无需外部引脚此处仅为占位GPIO_InitStructure.GPIO_PinGPIO_Pin_0;// 示例引脚实际不使用GPIO_InitStructure.GPIO_ModeGPIO_Mode_AIN;// 模拟输入GPIO_Init(GPIOA,GPIO_InitStructure);// 4. ADC初始化独立模式、单次转换、软件触发ADC_InitStructure.ADC_ModeADC_Mode_Independent;// 独立模式ADC_InitStructure.ADC_ScanConvModeDISABLE;// 单通道模式非扫描ADC_InitStructure.ADC_ContinuousConvModeDISABLE;// 单次转换非连续ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None;// 软件触发ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;// 右对齐ADC_InitStructure.ADC_NbrOfChannel1;// 转换通道数1通道16ADC_Init(ADC1,ADC_InitStructure);// 5. 配置温度传感器通道通道16采样时间239.5周期ADC_RegularChannelConfig(ADC1,TEMP_SENSOR_CH,1,ADC_SampleTime_239Cycles5);// 6. 使能内部温度传感器和Vrefint通道关键ADC_TempSensorVrefintCmd(ENABLE);// 需在ADC使能前调用// 7. 使能ADC1并校准ADC_Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADC1);// 复位校准寄存器while(ADC_GetResetCalibrationStatus(ADC1));// 等待复位完成ADC_StartCalibration(ADC1);// 开始校准while(ADC_GetCalibrationStatus(ADC1));// 等待校准完成}/** * brief 读取ADC值并计算温度℃ * param 无 * retval 温度值浮点数单位℃ */floatADC1_Read_Temp(void){uint16_tadc_value;floatvoltage,temp;// 1. 启动ADC转换软件触发ADC_SoftwareStartConvCmd(ADC1,ENABLE);// 2. 等待转换完成EOC标志置位while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));// 3. 读取ADC原始值12位0~4095adc_valueADC_GetConversionValue(ADC1);// 4. 计算传感器输出电压Vvoltage(float)adc_value*VDDA_VOLTAGE/4095.0f;// 5. 代入公式计算温度℃temp25.0f(V25-voltage)/AVG_SLOPE;returntemp;}3. 主程序调用示例main.c#includestm32f10x.h#includetemp_sensor.h#includestdio.h// 重定向printf到串口可选用于调试输出#ifdef__GNUC__#definePUTCHAR_PROTOTYPEint__io_putchar(intch)#else#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)#endifPUTCHAR_PROTOTYPE{USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);returnch;}intmain(void){floattemperature;// 初始化系统时钟72MHz省略具体代码SystemInit();// 初始化串口用于调试输出可选USART1_Init(115200);// 假设已实现串口初始化函数// 初始化ADC1及温度传感器ADC1_TempSensor_Init();while(1){// 读取温度每秒1次temperatureADC1_Read_Temp();printf(Chip Temperature: %.2f ℃\r\n,temperature);// 串口输出// 延时1秒可通过SysTick实现Delay_ms(1000);}}// 简单延时函数毫秒级voidDelay_ms(uint32_tms){uint32_ti;for(;ms0;ms--)for(i0;i7200;i);// 72MHz时钟下约1ms}参考代码 STM32 测量内部温度传感器程序库函数www.youwenfan.com/contentcst/133729.html三、关键注意事项1. 硬件前提VDDA电压确保ADC参考电压VDDAV_{\text{DDA}}VDDA稳定通常3.3V若实际电压偏离需修改代码中VDDA_VOLTAGE宏定义。芯片型号差异不同STM32型号的传感器参数V25V_{25}V25、Avg_Slope\text{Avg\_Slope}Avg_Slope可能不同如F4系列V250.76VV_{25}0.76VV250.76VAvg_Slope2.5mV/℃\text{Avg\_Slope}2.5mV/℃Avg_Slope2.5mV/℃需查阅对应数据手册。2. 软件优化多次采样平均单次采样误差较大建议连续采样5~10次取平均值如adc_value (adc_value1 adc_value2 ...) / n。校准必要性ADC校准ADC_StartCalibration可减少转换误差必须在ADC使能前完成。采样时间内部温度传感器响应较慢建议使用最长采样时间239.5周期确保转换精度。3. 常见问题排查问题原因解决方案温度值恒为0或异常未使能TSVREFE位ADC_TempSensorVrefintCmd调用ADC_TempSensorVrefintCmd(ENABLE)温度波动大电源噪声或单次采样误差增加采样次数取平均靠近芯片放置去耦电容ADC转换超时ADC时钟过快超过14MHz降低RCC_ADCCLKConfig分频系数如RCC_PCLK2_Div8四、扩展应用1. 温度报警功能// 温度超限报警阈值30℃#defineTEMP_THRESHOLD30.0fif(temperatureTEMP_THRESHOLD){GPIO_SetBits(GPIOB,GPIO_Pin_0);// 触发GPIO输出如LED报警}2. 低功耗优化休眠模式读取温度后关闭ADCADC_Cmd(ADC1, DISABLE)需要时再开启。DMA传输通过DMA自动读取ADC值减少CPU干预适用于多通道采样。五、总结本程序基于STM32标准库实现了内部温度传感器的读取与温度计算核心步骤包括ADC初始化、传感器通道配置、ADC值读取及公式换算。使用时需注意芯片型号差异与硬件参数校准适用于芯片温度监控、过热保护等场景。核心价值无需外部传感器低成本实现STM32内部温度监测为嵌入式系统的热管理提供基础支持。