1. 引言
STM32 在内部都带有一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控一下晶圆上的温度也是挺好的,可以防止芯片过温运行。
2. 问题
2.1. 问题详情
某客户在使用 STM32U575ZIT6Q 时,使用 ADC4 对内部温度传感器 VSENSE进行采样计算,但是总是觉得得到的温度值不对。那么,应该如何对内部温度传感器的 ADC 采样进行计算以得到正确温度值呢?
2.2. 问题分析
首先,应该先来看一下参考手册中,如何描述内部温度传感器的。参考手册说明了,未经校准的内部温度传感器更适用于对温度变量而非绝对温度进行测量的应用。为了提高温度传感器测量的准确性,ST 在生产过程中将校准值存储在每个器件的系统存储器中。用户在软件开发中,可以在应用中去读取这些数据,用于提高温度传感器的准确性。
这个校准值是写在数据手册的,如图 1 所示。
图1. 内部温度传感器
这张表格告诉我们,校准值 TS_CAL1 的数值位于存储器地址 0x0BFA0710 和0x0BFA0711,也就是它是一个 16-bit 的数据;同理,校准值 TS_CAL2 的数值位于存储器地址 0x0BFA0742 和 0x0BFA0743。
再回过头来看一下参考手册是如何描述怎么读取内部温度传感器的温度的,如图 2 所示。
图2. 读取温度传感器
这里描述的是如何读取内部温度传感器的温度,前面主要介绍 ADC 的配置和对温度传感器的采样,最后根据得到的数据使用公式进行计算,得到温度值。前面的 ADC 的配置和采样就不说了,我们主要来看一下公式的使用。
𝑇𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒 (𝑖𝑛℃) = ((𝑇𝑆_𝐶𝐴𝐿2_𝑇𝐸𝑀𝑃 − 𝑇𝑆_𝐶𝐴𝐿1_𝑇𝐸𝑀𝑃)/(𝑇𝑆_𝐶𝐴𝐿2 − 𝑇𝑆_𝐶𝐴𝐿1)
× (𝑇𝑆_𝐷𝐴𝑇𝐴 − 𝑇𝑆_𝐶𝐴𝐿1) )+ 𝑇𝑆_𝐶𝐴𝐿1_𝑇𝐸𝑀𝑃
其中,
Temperature (in ℃) 就是内部传感器的当前温度;
TS_DATA 为内部传感器当前温度对应的采样值;
TS_CAL2_TEMP 为校准值 2 的温度值,TS_CAL2 为对应的采样值,对于 STM32U5来说,TS_CAL2_TEMP 为 130℃,对应的采样值存储在 0x0BFA0742 和 0x0BFA0743;
TS_CAL1_TEMP 为校准值 1 的温度值,TS_CAL1 为对应的采样值,对于 STM32U5来说,TS_CAL1_TEMP 为 30℃,对应的采样值存储在 0x0BFA0710 和 0x0BFA0711;
对于 STM32U5 来说,公式可简化为:
𝑇𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒 (𝑖𝑛℃) =(130 − 30)/(𝑇𝑆_𝐶𝐴𝐿2 − 𝑇𝑆_𝐶𝐴𝐿1)× (𝑇𝑆_𝐷𝐴𝑇𝐴 − 𝑇𝑆_𝐶𝐴𝐿1) + 30
那么,是不是直接读取了 TS_CAL2 和 TS_CAL1,放到公式里,然后通过 ADC 得到TS_DATA,就可以直接算温度了呢?接着往下看。
2.3. 问题解决
在室温下使用 NUCLEO-U575ZI-Q 做个实验:
读取 0x0BFA0742 和 0x0BFA0743 得到 TS_CAL2 为 0x155D,也就是 0d5469;读取 0x0BFA0710 和 0x0BFA0711 得到 TS_CAL1 的值为 0x102F,也就是 0d4143。
此时,由 ADC1 对内部温度传感器进行采样转换,得到 TS_DATA 为 0xEAA,也就是
0d3754。
那么,如果直接放进去算:
𝑇𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒 (𝑖𝑛℃) =(130 − 30)/(5469 − 4143 )× (3754 − 4143) + 30 =
100/1326 × (−389) + 30 = 0.66
室温下,这个 0.66℃显然不对。
2.3.1. 使用 ADC1 测量内部温度传感器的温度值
再来看数据手册里对校准值的描述,如图 3 所示。
图3. 温度传感器校准值重要参数
这个表格有一个非常重要的参数,就是 ADC1 的参考电压,它是 3.0V,而 NUCLEOU575ZI-Q 板子的 ADC 参考电压为 3.3V。所以,这两个 TS_CAL1 和 TS_CAL2 对于
NUCLEO-U575ZI-Q 中的 STM32U575ZIT6Q 的内部温度传感器肯定是不能直接用的,
需要先换算为 3.3V 参考电压的值才行。
所以,新的值计算如下:
TS_CAL2 = 5469 × 3 / 3.3 = 4972
TS_CAL1 = 4143 × 3 / 3.3 = 3766
再回到刚才的实验中,计算的公式如下:
𝑇𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒 (𝑖𝑛℃) =(130 − 30)/(4972 − 3766) × (3754 − 3766) + 30 =100/1206 × (−12) + 30 = 29
这次算出来的结果为 29℃就对了。
2.3.2. 使用 ADC4 测量内部温度传感器的温度值
那对于 ADC4 是否也是一样的呢?
首先,要知道在 STM32U5 中,ADC1 为 14-bit SAR ADC,而 ADC4 为 12-bit SAR ADC。同样的这块板子,同样的室温下,由 ADC4 对内部温度传感器进行采样转换得到的值是 0x3AA,也就是 0d938。
要使用 0d938 计算温度值,TS_CAL1 和 TS_CAL2 也要相应转为 12 位的数据才行。将它们由 14 位数据转为 12 位的数据,相当于就是右移 2 位,也相当于除以 4。
由于参考电压仍然是 3.3V,所以针对 ADC4 的 TS_CAL2 和 TS_CAL1 应该计算如下:
TS_CAL2 :由读取到的 0x155D 右移 2 位,得到 0x557,也就是 0d1367,再换算成3.3V 的 。
TS_CAL2 = 1367 × 3 / 3.3 = 1243
也可以直接使用上面 ADC1 例子的值来计算。
TS_CAL2 = 4972 / 4 = 1243
TS_CAL1 :由读取到的 0x102F 右移 2 位,得到 0x40B,也就是 0d1035,再换算成
3.3V 的 。
TS_CAL2 = 1035 × 3 / 3.3 = 941
也可以直接使用上面 ADC1 例子的值来计算。
TS_CAL2 = 3766 / 4 = 941
计算的公式如下:
𝑇𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒 (𝑖𝑛℃) =(130 − 30)(1243 − 941) × (938 − 941) + 30 =100/302 × (−3) + 30 = 29
算出来的结果也是 29℃。
3. 小结
当我们使用芯片的内部温度传感器计算内部温度时,需注意校准值是使用哪个 ADC、在什么参考电压下得到的。当实际应用与内部温度传感器校准时所使用 ADC 及条件不一样时,应该对存储单元里的校准值先做计算转化,然后才可以使用参考手册所提供的公式进行计算,否则将会得到错误值。
文档中所用到的工具及版本
NUCLEO-U575ZI-Q
LAT 中的附件
STM32U5_ADC4_TemperatureSensor_v0.1.7z
本文档参考ST官方的《【应用笔记】LAT1271+待机模式被意外唤醒之原因分析》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89067055