新闻详情

新闻详情

首页 / 资讯中心 / 详情

手把手教你用STM32 HAL库驱动TMP117温度传感器(附完整代码)

发布时间:2026/9/13 12:53:46来源:尧图网络
手把手教你用STM32 HAL库驱动TMP117温度传感器(附完整代码)
STM32 HAL库驱动TMP117高精度温度传感器实战指南在工业控制、医疗设备和消费电子等领域温度测量往往是系统设计中最基础却最关键的环节之一。德州仪器TI推出的TMP117数字温度传感器以其±0.1°C的测量精度和-40°C至125°C的宽工作范围成为替代传统热敏电阻和热电偶的理想选择。本文将基于STM32CubeMX和HAL库从零开始构建完整的TMP117驱动方案帮助开发者快速实现高精度温度监测系统。1. 硬件准备与CubeMX配置TMP117采用标准I2C接口通信最高支持1MHz的快速模式PlusFm。在开始编码前需要完成以下硬件连接引脚连接TMP117的SDA接STM32的PB7I2C1_SDATMP117的SCL接STM32的PB6I2C1_SCLADD0引脚接地默认I2C地址0x48打开STM32CubeMX按步骤配置I2C外设在Pinout Configuration标签页启用I2C1将PB6和PB7自动配置为I2C1_SCL和I2C1_SDA在I2C Mode and Configuration中设置参数Timing 0x00707CBB // 100kHz标准模式 No Stretch Mode Disable提示对于长距离布线或干扰环境建议降低I2C时钟频率至50kHz以下并启用时钟延展Clock Stretching。生成代码前务必在Project Manager标签页勾选Generate peripheral initialization as a pair of .c/.h files这将方便后续的驱动代码管理。2. HAL库驱动实现2.1 基础通信函数封装创建tmp117.h头文件定义常用寄存器地址#define TMP117_I2C_ADDR 0x48 1 // HAL库要求左移1位 #define TMP117_REG_TEMP 0x00 #define TMP117_REG_CONFIG 0x01 #define TMP117_REG_HIGH_LIMIT 0x02 #define TMP117_REG_LOW_LIMIT 0x03实现温度读取函数时需要注意TMP117的数据格式转换float TMP117_ReadTemperature(I2C_HandleTypeDef *hi2c) { uint8_t buf[2]; int16_t rawTemp; // 读取温度寄存器 HAL_I2C_Mem_Read(hi2c, TMP117_I2C_ADDR, TMP117_REG_TEMP, I2C_MEMADD_SIZE_8BIT, buf, 2, HAL_MAX_DELAY); // 组合两个字节并转换为温度值 rawTemp (buf[0] 8) | buf[1]; return rawTemp * 0.0078125f; // LSB 7.8125m°C }2.2 高级配置功能TMP117提供了丰富的配置选项通过配置寄存器0x01可以设置位域参数可选值说明[15:13]转换周期000-111从15.5ms到8s共8档[10:9]平均模式00-11关闭/8次/32次/64次平均[8]数据就绪中断0/1启用温度转换完成中断[7:5]警报模式000-111设置高低限触发条件配置示例代码void TMP117_Config(I2C_HandleTypeDef *hi2c, uint16_t settings) { uint8_t buf[2]; buf[0] settings 8; // 高字节 buf[1] settings 0xFF;// 低字节 HAL_I2C_Mem_Write(hi2c, TMP117_I2C_ADDR, TMP117_REG_CONFIG, I2C_MEMADD_SIZE_8BIT, buf, 2, HAL_MAX_DELAY); }典型配置调用设置1Hz采样64次平均TMP117_Config(hi2c1, 0x0220);3. 抗干扰设计与性能优化3.1 I2C通信可靠性增强工业环境中I2C总线易受干扰可通过以下措施提升稳定性硬件层面在SCL和SDA线上串联100Ω电阻添加4.7kΩ上拉电阻至3.3V使用双绞线或屏蔽线缆软件层面HAL_StatusTypeDef Safe_I2C_Read(I2C_HandleTypeDef *hi2c, uint16_t devAddr, uint16_t memAddr, uint8_t *pData, uint16_t size) { HAL_StatusTypeDef status; uint8_t retry 3; do { status HAL_I2C_Mem_Read(hi2c, devAddr, memAddr, I2C_MEMADD_SIZE_8BIT, pData, size, 100); if(status HAL_OK) break; HAL_Delay(1); } while(--retry); return status; }3.2 温度数据滤波处理对于需要高稳定读数的应用可采用滑动窗口滤波#define FILTER_WINDOW_SIZE 8 typedef struct { float buffer[FILTER_WINDOW_SIZE]; uint8_t index; float sum; } TempFilter; float FilterTemperature(TempFilter *filter, float newTemp) { filter-sum - filter-buffer[filter-index]; filter-buffer[filter-index] newTemp; filter-sum newTemp; filter-index (filter-index 1) % FILTER_WINDOW_SIZE; return filter-sum / FILTER_WINDOW_SIZE; }初始化滤波器并使用的示例TempFilter tempFilter {0}; float currentTemp FilterTemperature(tempFilter, TMP117_ReadTemperature(hi2c1));4. 实战案例恒温控制系统结合PID算法实现一个简单的恒温控制演示4.1 PID控制器实现typedef struct { float Kp, Ki, Kd; float integral; float prevError; } PIDController; float PID_Update(PIDController *pid, float setpoint, float input, float dt) { float error setpoint - input; pid-integral error * dt; float derivative (error - pid-prevError) / dt; pid-prevError error; return pid-Kp * error pid-Ki * pid-integral pid-Kd * derivative; }4.2 系统集成主控制循环代码框架void TemperatureControlLoop(void) { PIDController pid { .Kp 2.0f, .Ki 0.5f, .Kd 1.0f }; TempFilter filter {0}; float setpoint 37.0f; // 目标温度37°C while(1) { float rawTemp TMP117_ReadTemperature(hi2c1); float filtered FilterTemperature(filter, rawTemp); float output PID_Update(pid, setpoint, filtered, 0.1f); // 输出控制加热器PWM占空比0-100% uint8_t duty (uint8_t)constrain(output, 0, 100); SetHeaterDuty(duty); HAL_Delay(100); // 100ms控制周期 } }在实际项目中我们还需要添加温度超限报警、安全保护等机制。TMP117自带的高低温度限制寄存器可以硬件触发警报减轻MCU的轮询负担// 设置温度上限报警40°C void SetTempAlarms(I2C_HandleTypeDef *hi2c) { uint8_t highLimit[2]; int16_t tempHigh (int16_t)(40.0f / 0.0078125f); highLimit[0] tempHigh 8; highLimit[1] tempHigh 0xFF; HAL_I2C_Mem_Write(hi2c, TMP117_I2C_ADDR, TMP117_REG_HIGH_LIMIT, I2C_MEMADD_SIZE_8BIT, highLimit, 2, HAL_MAX_DELAY); }
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Steam游戏卡在‘正在启动’?安全软件白名单竟是真凶 2026/9/13 17:33:39

Steam游戏卡在‘正在启动’?安全软件白名单竟是真凶

1. 这个“正在启动”卡顿,90%不是Steam故障,而是你动了不该动的文件 “Steam游戏一直正在启动怎么办?”——这是最近两周我在三个不同技术群、两个游戏论坛和一个本地PC维修店听到频率最高的问题。不是闪退、不是报错代码、不是黑屏&#xff…

阅读更多 →
我以为神经网络 99% 准确率就是好模型,直到 CFO 甩来一张误判成本表 2026/9/13 17:33:39

我以为神经网络 99% 准确率就是好模型,直到 CFO 甩来一张误判成本表

我以为神经网络 99% 准确率就是好模型,直到 CFO 甩来一张误判成本表 发版那天下午,我盯着监控大屏上跳动的数字,心跳比压测时还快。我们的神经网络模型刚上线 4 小时,准确率稳稳停在 99.2%,召回率也在预期范围内。团队群里的表情包还没刷完,业务总监的消息先到了:「市场部反馈…

阅读更多 →
磁盘取证全流程:从基础操作到高级技术实战 2026/9/13 17:33:39

磁盘取证全流程:从基础操作到高级技术实战

1. 磁盘取证概述:从理论到实践的完整指南 磁盘取证作为数字取证领域的核心分支,已经发展出一套成熟的技术体系。简单来说,它就像给硬盘做一次"全身体检",只不过检查的对象不是细胞组织,而是存储介质上的每一…

阅读更多 →
独立开发者出海变现实战(10):从 0 到第一笔海外收入 2026/9/13 17:33:39

独立开发者出海变现实战(10):从 0 到第一笔海外收入

前九篇依次建立了机会筛选、需求证据、MVP、技术边界、支付、冷启动、内容、定价和分析。本篇不再引入新工具,而是把这些产物压缩成四周执行系统。第一笔海外收入的意义不是金额大小,而是一个此前不认识你的目标用户,在明确承诺、真实付款和可…

阅读更多 →
Cilium 在 kind 集群中的镜像预加载(Preload):原理、完整部署流程与故障排查 2026/9/13 17:33:39

Cilium 在 kind 集群中的镜像预加载(Preload):原理、完整部署流程与故障排查

Cilium 在 kind 集群中的镜像预加载(Preload):原理、完整部署流程与故障排查 【免费下载链接】cilium eBPF-based Networking, Security, and Observability 项目地址: https://gitcode.com/GitHub_Trending/ci/cilium 导读 本指南围…

阅读更多 →
OI-wiki 莫队二次离线算法详解:把莫队转移再次离线,用差分与扫描线突破 O(1) 转移瓶颈 2026/9/13 17:30:39

OI-wiki 莫队二次离线算法详解:把莫队转移再次离线,用差分与扫描线突破 O(1) 转移瓶颈

OI-wiki 莫队二次离线算法详解:把莫队转移再次离线,用差分与扫描线突破 O(1) 转移瓶颈 【免费下载链接】OI-wiki :star2: Wiki of OI / ICPC for everyone. (某大型游戏线上攻略,内含炫酷算术魔法) 项目地址: https:…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞