目录
概述
1 认识STM32G474内部温度传感器
1.1 温度传感器概述
1.2 温度传感器实现原理
1.3 读取温度方法
1.4 ADC模块上温度sensor的位置框图
2 STM32Cube创建项目
2.1 配置参数
2.2 STM32Cube生成的软件架构
3 温度数据算法实现
3.1 算法介绍
3.2 源代码
概述
本文主要介绍STM32G474内部温度传感器的使用的使用方法,包括实现原理,STM32Cube配置参数,已经算法实现。
1 认识STM32G474内部温度传感器
1.1 温度传感器概述
温度传感器(TS)产生随温度线性变化的电压VTS。温度传感器内部连接到ADC输入通道,用于将传感器输出电压转换为数字值。传感器具有良好的线性度,但必须进行校准才能获得良好的整体性能温度测量的准确性。随着温度传感器偏移量的变化由于工艺变化,芯片之间未校准的内部温度传感器适用于仅检测温度变化的应用。
为了提高温度传感器测量的准确性,每个设备都温度传感器出厂校准数据由ST单独校准由ST存储在系统存储区中,以只读模式访问。
温度传感器校准值
1.2 温度传感器实现原理
温度传感器可用于测量设备的结温(Tj)。温度传感器内部连接到所使用的ADC输入通道将传感器输出电压转换为数字值。不使用时,传感器可以进入断电模式。它支持-40至125°C的温度范围。
温度传感器输出电压随温度线性变化。对此的抵消由于工艺变化(从一个芯片到另一个芯片高达45°C),线路因芯片而异。
未校准的内部温度传感器更适合检测温度变化而不是绝对温度。为了提高温度传感器测量值、校值分别存储在系统内存中ST在生产过程中生产的设备。
在制造过程中,温度传感器的校准数据和内部电压基准存储在系统存储区中。用户应用程序可以然后读取它们并使用它们来提高温度传感器或内部参考(更多信息请参阅数据表)。
温度传感器内部连接到ADC输入通道,用于将传感器的输出电压转换为数字值。参考电气特性转换时应用的采样时间值的设备数据表部分内部温度传感器。
1.3 读取温度方法
1)选择连接到VTS的ADC输入通道。
2)具有适当采样时间的程序(请参阅设备数据表)。
3)在ADCx_CCR寄存器中设置VSENSESEL位以唤醒温度传感器从断电模式。
4)启动ADC转换。
5)读取ADC数据寄存器中的VTS数据。
6)使用以下公式计算实际温度:
参数介绍
TS_CAL2是在TS_CAL2_TEMP处获取的温度传感器校准值。
•TS_CAL1是在TS_CAL1_TEMP处获取的温度传感器校准值。
•TS_DATA是ADC转换的实际温度传感器输出值。
有关TS_CAL1和TS_CAL2的更多信息,请参阅设备数据表校准点。
注意点:
传感器在从断电模式唤醒后有一段启动时间,然后才能输出VTS在正确的水平。ADC在通电后也有启动时间,因此可以最大限度地减少ADEN和VSENSESEL位应同时设置。对于在相同VREF+电压下进行的TS_DATA测量,给出了上述公式作为TS_CAL1/TS_CAL2值。如果VREF+不同,则必须调整公式。
例如:如果VREF+=3.3V并且在VREF+=3.0V下获取TS_CAL数据,则TS_data必须替换为TS_DATA x(3.3/3.0)
1.4 ADC模块上温度sensor的位置框图
根据框图可知,STM32G474内部温度sensor连接在ADC5模块上。
2 STM32Cube创建项目
2.1 配置参数
根据框图可得STM32G474的温度传感器挂载在ADC5模块上,在STM32Cube上使能该端口
配分配系数和采样模式
完成以上配置后就可以生成项目
2.2 STM32Cube生成的软件架构
代码205行:选择数据转换通道为温度传感器Sensor
3 温度数据算法实现
3.1 算法介绍
代码42行: 启动ADC数据转换功能
代码43行:获取当前ADC转换的状态
代码46行: 获取ADC的值
代码47~48行:读取标定值
代码49行: 温度数据转换
代码51行: 停止数据转换
3.2 源代码
typedef struct
{
float tempValue;
uint8_t ready; //0x01: data is ok,
//others: data is not ready
} Stru_stTemp;
Stru_stTemp stru_stTemp;
/*
It support the temperature range –40 to 125 °C
To use the sensor:
1. Select the ADC input channels that is connected to VTS.
2. Program with the appropriate sampling time (refer to electrical characteristics section of
the device datasheet).
3. Set the VSENSESEL bit in the ADCx_CCR register to wake up the temperature sensor
from power-down mode.
4. Start the ADC conversion.
5. Read the resulting VTS data in the ADC data register.
6. Calculate the actual temperature using the following formula:
*/
int get_stInternelTemp( Stru_stTemp *pValue )
{
uint32_t value;
float tempvalue;
uint16_t TS_CAL1;
uint16_t TS_CAL2;
HAL_StatusTypeDef status;
HAL_ADC_Start( &hadc5 );
status = HAL_ADC_PollForConversion( &hadc5, 100);
if( status == HAL_OK)
{
value = HAL_ADC_GetValue( &hadc5 );
TS_CAL1 = *(__IO uint16_t *)(0x1FFF75A8);
TS_CAL2 = *(__IO uint16_t *)(0x1FFF75CA);
tempvalue = (110 - 30) * (value*1.1 - TS_CAL1)/ (TS_CAL2 - TS_CAL1) + 30;
// printf(" get conv_value: %04f \r\n", conv_value);
HAL_ADC_Stop( &hadc5 );
pValue->ready = 0x01;
pValue->tempValue = tempvalue;
return 0;
}
else
{
HAL_ADC_Stop( &hadc5 );
}
return -1;
}