本文介绍 ULP 协处理器如何在低功耗模式下读片内温度传感器 TSENS
ESP32 芯片内内置了温度传感器,其温度测量范围在 -40℃ 到 125℃ 之间,通过测量周围环境(例如 WiFi 电路)产生的热量,可以大致评估系统的负荷散热以及环境温度情况。 需要指出的是,由于制程工艺偏差的原因,每片芯片的温度电压特性可能有差异,因此,温度传感器的主要应用场景为测量温度的变化量,而非温度的绝对值。
本例子 ULP 协处理器每隔 3 S 唤醒一次,唤醒后在低功耗模式下通过 TSENS
指令读取片内温度传感器数值,然后唤醒主 CPU 打印出获取的数值,并再次进入 DeepSleep 状态。
下图演示的是,用拇指和食指捏住 Core Board ,通过 PCB 板将手指热量传递到芯片,最终终端打印数值从 142 变化到 144 (注:对于不同的芯片这个数值可能是不一样的)。
需要说明,TSENS 值是一个字节,范围是 0 - 255,其数值变化和环境温度变化近似成线性关系,用户需要自己定义和测量其对应的外界温度值。
ESP32 的 C 语言编译环境安装和配置参照 链接地址,另外 ULP 协处理器目前只支持汇编编程,所以还需要安装汇编工具链,下面介绍汇编工具链的安装和配置。
ULP 协处理器配置汇编编译工具链,只需两步即可安装配置完毕,下面给出 ubuntu 操作系统下配置的步骤,或者点击 链接地址 获得更多 ULP 编程信息
- 第一步, 下载工具链
binutils-esp32ulp toolchain
链接地址, 解压到需要安装的目录- 第二步,添加工具链的
bin
目录到系统环境变量PATH
中。例如我的解压目录是/opt/esp32ulp-elf-binutils
那么添加export PATH=/opt/esp32ulp-elf-binutils/bin:$PATH
这一行到 /home 目录的隐藏文件.bashrc
文件最后一行,保存关闭文件并使用命令source .bashrc
使上述环境变量生效
至此,汇编编译环境就安装好了,在 ulp_tsens/ 目录下依次运行以下命令,进行 config 配置并编译、烧录程序。
Make:
- make defconfig
- make all -j8 && make flash monitor
CMake
- idf.py defconfig
- idf.py flash monitor
ULP 已经内置了 TSENS
的汇编指令,用来读取片内温度传感器,使用示例如下:
TSENS R1, 1000 /* Measure temperature sensor for 1000 cycles, and store result to R1 */
需要注意:单独使用这条 TSENS
指令并不能获得温度传感器的真实数值,因为此时片内相应的电路电源是处于被关闭状态(POWER DOWN)的,需要手动设定寄存器 SENS_SAR_MEAS_WAIT2_REG
中的 SENS_FORCE_XPD_SAR
寄存器置位,给相关电路上电。
/* Force power up */
WRITE_RTC_REG(SENS_SAR_MEAS_WAIT2_REG,SENS_FORCE_XPD_SAR_S,2,SENS_FORCE_XPD_SAR_PU)
之后再使用 TSENS
指令读取片内温度传器,并将温度值传递给 tsens_value
tsens r0, 1000
move r3, tsens_value
st r0, r3, 0
jump wake_up
接下来 Polling 寄存器 RTC_CNTL_DIAG0_REG
进行主 CPU 的唤醒
/* Get ULP back to sleep */
.global exit
exit:
halt
.global wake_up
wake_up:
/* Check if the SoC can be woken up */
READ_RTC_REG(RTC_CNTL_DIAG0_REG, 19, 1)
and r0, r0, 1
jump exit, eq
/* Wake up the SoC and stop ULP program */
wake
/* Stop the wakeup timer so it does not restart ULP */
WRITE_RTC_FIELD(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN, 0)
halt
本例 ULP 协处理器工作时电流为 1.4mA ,工作时间持续 2ms ,ULP 协处理器睡眠时间 3s , 平均电流 5uA 。我们按照 1ms 一个采样点计算电流数据,可以得出整个过程平均电流为 5.9uA 左右
ESP32 内置的 汇编指令 TSENS
可以让我们在低功耗模式下非常容易的进行片内温度传感器读取,另外,当 ULP 协处理器再次进入睡眠时,会关闭掉除 150K 唤醒时钟外的所有电路电源,所以下次 ULP 协处理器唤醒后仍需要置位 SENS_FORCE_XPD_SAR
寄存器给相关内部电路上电(POWER UP) 。