STM32驱动LM75A温度传感器全攻略:从寄存器解析到数据采集 | 零基础入门STM32第五十一步

主题内容教学目的/扩展视频
温度传感器电路原理,手册分析,驱动程序,读出温度值。读出温度值即可。

师从洋桃电子,杜洋老师



回顾上期🔍STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步


一、LM75A驱动设计整体架构

硬件层
调用
依赖
基于
I2C物理总线
STM32固件库 stm32f10x_i2c.c
LM75A传感器
用户程序 main.c
LM75A驱动 lm75a.c
I2C总线驱动 i2c.c

二、LM75A核心寄存器解析

2.1 关键寄存器地址表

寄存器名称地址功能描述
温度寄存器0x00存储当前温度值(只读)
配置寄存器0x01控制器件工作模式
过温阈值0x02设置温度报警上限
滞后温度0x03设置温度报警下限

2.2 配置寄存器详解(0x01)

// 配置寄存器位定义
#define CONF_SHUTDOWN   0x01  // 掉电模式使能位
#define CONF_OS_POL     0x04  // OS输出极性
#define CONF_OS_F_QUE0  0x08  // 故障队列位0
#define CONF_OS_F_QUE1  0x10  // 故障队列位1

三、温度采集与数据处理

3.1 温度数据格式

根据LM75A数据手册,温度数据采用11位有效位存储,具体结构如下:

(图1:Temp存储器表)

3.2 数据处理流程

//读出LM75A的温度值(-55~125摄氏度)
//温度正负号(0正1负),温度整数,温度小数(点后2位)依次放入*Tempbuffer(十进制)

void LM75A_GetTemp(u8 *Tempbuffer){   
    u8 buf[2]; //温度值储存   
    u8 t=0,a=0;   
    I2C_READ_BUFFER(LM75A_ADD,0x00,buf,2); //读出温度值(器件地址,子地址,数据储存器,字节数)
	t = buf[0]; //处理温度整数部分,0~125度
	*Tempbuffer = 0; //温度值为正值
	if(t & 0x80){ //判断温度是否是负(MSB表示温度符号)
		*Tempbuffer = 1; //温度值为负值
		t = ~t; t++; //计算补码(原码取反后加1)
	}
	if(t & 0x01){ a=a+1; } //从高到低按位加入温度积加值(0~125)
	if(t & 0x02){ a=a+2; }
	if(t & 0x04){ a=a+4; }
	if(t & 0x08){ a=a+8; }
	if(t & 0x10){ a=a+16; }
	if(t & 0x20){ a=a+32; }
	if(t & 0x40){ a=a+64; }
	Tempbuffer++;
	*Tempbuffer = a;
	a = 0;
	t = buf[1]; //处理小数部分,取0.125精度的前2位(12、25、37、50、62、75、87)
	if(t & 0x20){ a=a+12; }
	if(t & 0x40){ a=a+25; }
	if(t & 0x80){ a=a+50; }
	Tempbuffer++;
	*Tempbuffer = a;   
}

四、驱动程序代码精析

4.1 器件地址定义

#define LM75A_ADD 0x9E  // 7位地址:1001110 + R/W位
  • 地址计算
    根据数据手册,LM75A的7位地址为1001xxx(xxx由A2-A0引脚决定)

4.2 温度读取函数

void LM75A_GetTemp(u8 *Tempbuffer) {
    u8 buf[2];
    I2C_READ_BUFFER(LM75A_ADD, 0x00, buf, 2);  // 关键调用
    
    // 符号处理(代码详见3.2节)
    // 小数精度处理(代码详见3.2节)
}

4.3 掉电模式设置

void LM75A_POWERDOWN(void){// 
    I2C_SAND_BYTE(LM75A_ADD,0x01,1); //
}
  • 实现原理:向配置寄存器(0x01)写入0x01,开启低功耗模式

五、主程序调用示例

5.1 显示驱动集成

int main(void) {
	u8 buffer[3];  // 存储符号、整数、小数
    I2C_Configuration();
    TM1640_Init();   // 数码管显示初始化
    
    while(1) {
		LM75A_GetTemp(buffer); //读取LM75A的温度数据
        
        // 显示处理(示例)
        TM1640_display(0, tempData[1]/10);   // 十位数
        TM1640_display(1, tempData[1]%10);  // 个位数
        TM1640_display(2, tempData[2]/10);  // 小数第一位
        TM1640_display(3, tempData[2]%10);  // 小数第二位
        
        delay_ms(200);
    }
}

六、常见问题排查表

现象可能原因解决方案
温度显示异常数据补码转换错误检查符号位处理逻辑
无法进入掉电模式配置寄存器地址错误确认写入地址是否为0x01
小数部分不准确分辨率计算错误验证LSB的位权计算
I2C通信失败器件地址配置错误使用逻辑分析仪抓取地址波形

七、关键调试技巧

  1. 补码验证工具
    使用在线二进制补码计算器验证转换逻辑:

    // 示例:原始数据0xFFF0的转换
    int16_t raw = 0xFFF0;  // 补码表示-16
    
  2. 温度数据可视化
    通过串口打印原始数据:

    printf("Raw Data: %02X %02X\n", buf[0], buf[1]);
    
  3. I2C总线监控
    使用Saleae逻辑分析仪解析通信时序:

MCU LM75A 通信开始 START信号 发送设备地址+写模式(0x9E) 响应ACK 发送寄存器地址(0x00) 响应ACK 重复启动条件 REPEATED START 发送设备地址+读模式(0x9F) 响应ACK 发送温度高字节(DATA1) 响应ACK 发送温度低字节(DATA2) 发送NACK STOP信号 MCU LM75A

八、相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] I2C总线规范(中文)
[6] LM75(温度传感器)数据手册+编程说明+应用
[7] 温度传感器数码管显示程序
[8] LM75A驱动程序分析.pptx


总结

本文详细解析了LM75A温度传感器的驱动开发,重点阐述了:

  1. 寄存器配置:掌握配置寄存器的位定义
  2. 数据解析:二进制补码转换与小数处理
  3. 驱动集成:从底层I2C到上层应用的完整调用链

    通过实际代码分析与结构图解,可快速实现精准的温度采集系统。建议配合逻辑分析仪进行波形验证,确保通信可靠性。

💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨OLED显示屏原理与驱动程序重点课程,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-07)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值