新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/2 17:08:30来源:尧图网络
手把手教你用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

相关资讯

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

较早相关资讯

最新相关资讯

原生JS实现月下写真页:懒加载、视差滚动与动效性能优化 2026/9/3 2:19:22

原生JS实现月下写真页:懒加载、视差滚动与动效性能优化

月下主题的动态写真页面,很多第一次做的人会把它当成“把图片放在深色背景上,再加一点透明渐变”。实际动手时却发现,图片明明加载了,但滚动起来很生硬;月亮光晕一放大就出现色块;图片进入视口时动画要么不…

阅读更多 →
宝可梦二创剪辑:如何把角色登场剪出悬念与节奏 2026/9/3 2:19:22

宝可梦二创剪辑:如何把角色登场剪出悬念与节奏

最近在整理宝可梦二创剪辑素材时,看到一个标题:劈斧螳螂行踪现身,新角色莎丽登场!。这几个词放在一起,其实已经是一段短片脚本的雏形。很多拿到这类素材的人会立刻开始堆镜头,结果剪出来的片子像 PPT 轮播&…

阅读更多 →
STM32F103硬件I2C驱动DS3231高精度RTC完整方案 2026/9/3 2:19:22

STM32F103硬件I2C驱动DS3231高精度RTC完整方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
熙彼儿WS200Pro评测:百元档LDAC降噪耳机的性价比之选 2026/9/3 2:19:22

熙彼儿WS200Pro评测:百元档LDAC降噪耳机的性价比之选

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Unity Mesh特效实战:从角色贴合到性能优化的完整指南 2026/9/3 2:19:22

Unity Mesh特效实战:从角色贴合到性能优化的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Pandas读写CSV/TXT全攻略:read_csv与to_csv参数详解 2026/9/3 2:16:22

Pandas读写CSV/TXT全攻略:read_csv与to_csv参数详解

写了一个多月的 CSV 实战脚本,回头发现自己对pd.read_csv()的理解其实只停留在“能跑就行”。直到某天接手一份带时间、带单位、还带着乱码的中文业务表,才被sep、encoding、dtype、parse_dates这些参数挨个教做人。这篇文章就把 Pandas 读写 txt 和 csv…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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