LM75数字温度传感器应用

合集下载

基于LM75A的多点温度监测系统设计

基于LM75A的多点温度监测系统设计

监测 系统。所设计的 多 路 温度监测 系统工作稳定, 测量精度高, 具有宽广的应用领域和应用价值。 关键词 : I c总线; L M 7 5 A; 温度 ; 单片机
中图分 类号 : T P 2 7 4 文献 标志 码 : B 文 章编 号 : 1 0 0 0— 0 6 8 2 ( 2 0 1 3 ) 0 2— 0 0 8 0— 0 2

杨新鹏 (
) , 毕业 于哈尔滨工程大学 自动化专业 ,
“ ~ “ 一 J
’ 工…
Ab s t r a c t : T he pa p e r d e s i g ns a mu l t i— — c h a n n e l s t e mpe r a t u r e mo n i t o r i n g s y s t e m ba s e d o n d i g i t a l i n t e l ・ ・ l e c t i v e t e mp e r a t u r e s e ns o r LM7 5 A.T he mo ni t o r i n g s y s t e m h a v e t h e c h a r a c t e r i s t i c s o f h i g h wo r ki n g s t a bi l i - t y a nd me a s u r e p r e c i s i o n. I t p o s s e s s wi d e a p p l i c a t i o n i f e l d s a n d wo r t h i n e s s . Ke y wor ds: 1 2 C b us ;LM75 A ;t e mp e r a t u r e;s i n g l e c h i p

lm75a 指标

lm75a 指标

lm75a指标什么是LM75A指标?LM75A是一种数字式温度传感器,属于I2C总线原件。

它能够提供精确的温度测量数据,并且具有高精度和可靠性,被广泛应用于各种电子设备中。

首先,让我们了解LM75A指标的基本特性。

LM75A的主要特点包括以下几个方面:1.高分辨率:LM75A可以提供12位精度的温度测量数据,这意味着它可以检测到非常微小的温度变化。

2.宽工作范围:LM75A可以在-55C至+125C的温度范围内工作,使其适用于各种环境条件。

3.数字输出:LM75A通过I2C总线输出温度测量数据,使其与其他电子设备的通信更加便捷。

4.低功耗:LM75A的工作电流非常低,在典型情况下仅为200μA左右,这使得它非常适合用于电池供电的设备中。

5.可编程阈值:LM75A具有可编程的高温和低温阈值,当温度超过或低于设定的阈值时,LM75A会触发报警信号。

接下来,让我们详细了解LM75A指标的工作原理。

LM75A采用热敏电阻和模拟数字转换器(ADC)来测量温度。

当温度变化时,热敏电阻的电阻值也会发生变化,LM75A将这个变化转换为数字信号,并通过I2C 总线发送给主控制器。

LM75A的工作原理可以分为以下几个步骤:1.初始化:首先,主控制器需要通过I2C总线初始化LM75A,包括设置工作模式、温度测量分辨率和报警阈值等。

2.温度测量:一旦LM75A被初始化,它将开始测量环境温度。

它通过读取热敏电阻的电阻值,并将其转换为相应的数字信号。

3.数据传输:LM75A将温度测量数据转换为数字信号后,通过I2C总线传输给主控制器。

主控制器可以读取该数据并进行进一步处理。

4.报警功能:LM75A具有可编程的高温和低温阈值,如果温度超过或低于设定的阈值,LM75A将触发报警信号,以便主控制器采取相应的措施。

5.最后,让我们来讨论LM75A指标的应用领域。

由于LM75A具有高精度和可靠性,它被广泛应用于各种电子设备中,特别是需要监测温度的领域,如:1.家庭电器:LM75A可以用于监测家用电器的工作温度,如空调、冰箱、洗衣机等。

LM75B与LM75A的区别

LM75B与LM75A的区别

LM75B—数字温度传感器和温度监控器概述LM75B是一款内置带隙温度传感器和∑-Δ模数转换技术的温度数字转换器,它也是温度检测器,可提供过热输出功能。

LM75B 包含多个数据寄存器:配置寄存器(Conf)用来存储器件的某些设置,如器件的工作模式、OS工作模式、OS极性和OS错误队列等;温度寄存器(Temp)用来存储读取的数字温度;设定点寄存器(Tos & Thyst)用来存储可编程的过热关断和滞后限制,器件通过两线的串行I2C总线接口与控制器通信。

LM75B还包含一个开漏输出(OS)管脚,当温度超过编程限制的值时该输出有效。

LM75B有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。

LM75B可配置成不同的工作模式。

它可设置成在正常工作模式下周期性地对环境温度进行监控,或进入关断模式来将器件功耗降至最低。

OS输出有2种可选的工作模式:OS比较器模式和OS中断模式。

OS输出可选择高电平或低电平有效。

错误队列和设定点限制可编程,可以激活OS输出。

温度寄存器通常存放着一个11位的二进制数的补码,用来实现0.125℃的精度,在需要精确地测量温度偏移或超出限制范围的应用中非常有用。

当LM75B在转换过程中不产生中断(I2C总线部分与∑-Δ转换部分完全独立)或LM75B不断被访问时,器件将一直更新温度寄存器中的数据。

正常工作模式下,当器件上电时,OS工作在比较器模式,温度阈值为80℃,滞后75℃,这时,LM75B就可用作独立的温度控制器,预定义温度设定点。

特点器件可以完全取代工业标准的LM75和LM75A,并提供了良好的温度精度(0.125℃),单个器件的电源范围可超出2.8V~5.5V 的范围具有I2C总线接口,同一总线上可连接多达8个器件电源电压范围:2.8V~5.5V环境温度范围:Tamb=-55℃~+125℃频率范围20Hz至400kHz,具有总线失效功能,总线失效自动恢复,防止锁死总线提供0.125℃的精度的11位ADC温度精度:-25℃~+100℃时为±2℃-55℃~+125℃时为±3℃可编程温度阈值和滞后设定点为了减低功耗,关断模式下消耗的电流仅为1.0μA上电时器件可用作一个独立的温度控制器ESD保护:在JESD22-A114标准下,可以通过4500V HBM模式在JESD22-A115标准下,可以通过450V MM模式在JESD22-C101标准下,可以通过2000V CDM模式在JEDEC标准下(JESD78)所做的闩锁测试可达100mA小型8脚封装:SO8、TSSOP8和3mm×2mm×SON8U封装信息管脚图/管脚描述LM75B与典型应用应用场合系统温度管理个人计算机电子设备工业控制器。

I2C实践(一)-LM75A温度传感器_图文.

I2C实践(一)-LM75A温度传感器_图文.

FPGA/CPLD开发套件实验教程—— PERI2-4DI 篇实验四、I 2C 实践(一)-LM75A 温度传感器实验目的:在这一课里,我们一起来学习I2C 协议,以及I2C 驱动的编写方法,并通过FPGA/CPLD来驱动LM75A 温度传感器,读出当前温度信息。

实验原理:(1 I2C串行总线概述采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。

同时,系统的更改和扩充极为容易。

常用的串行扩展总线有: I2C (Inter IC BUS )总线、单总线(1-WIRE BUS )、SPI (Serial Peripheral Interface )总线及Microwire/PLUS等。

本课仅讨论I2C 串行总线。

I2C 总线是PHLIPS 公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C 总线只有两根双向信号线。

一根是数据线SDA ,另一根是时钟线SCL 。

I2C 总线通过上拉电阻接正电源。

当总线空闲时,两根线均为高电平。

连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA 及SCL 都是线“与”关系。

每个接到I2C 总线上的器件都有唯一的地址。

主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主FPGA/CPLD开发套件实验教程—— PERI2-4DI 篇机即为发送器,总线上接收数据的器件则为接收器。

在多主机系统中,可能同时有几个主机企图启动总线传送数据,为了避免混乱, I2C 总线要通过总线仲裁,以决定由哪一台主机控制总线。

在FPGA/CPLD应用系统的串行总线扩展中,我们经常遇到的是以FPGA/CPLD为主机,其它接口器件为从机的单主机情况。

(2I2C总线的数据传送1)、数据位的有效性规定I2C 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

基于LM75A的多点温度监测系统设计

基于LM75A的多点温度监测系统设计

基于LM75A的多点温度监测系统设计杨新鹏【摘要】The paper designs a multi - channels temperature monitoring system based on digital intellective temperature sensor LM75A. The monitoring system have the characteristics of high working stability and measure precision. It possess wide application fields and worthiness.%采用基于I2C总线的智能数字温度传感器LM75A,设计了一款基于I2C总线的多点温度监测系统.所设计的多路温度监测系统工作稳定,测量精度高,具有宽广的应用领域和应用价值.【期刊名称】《工业仪表与自动化装置》【年(卷),期】2013(000)002【总页数】3页(P80-81,84)【关键词】I2C总线;LM75A;温度;单片机【作者】杨新鹏【作者单位】中航工业洛阳电光设备研究所,河南洛阳471009【正文语种】中文【中图分类】TP274温度检测是现代检测技术的重要组成部分,在保证产品质量、节约能源和安全生产等方面起着重要作用。

该文介绍了基于I2C总线的智能数字温度传感器LM75A的多点温度采集监测系统,具有宽广的应用领域和使用价值。

1 系统总体设计方案系统采用ATMEL公司的AT89C52单片机作为处理器,通过P1.0和P1.1端口模拟I2C总线时序,采用智能数字温度传感器LM75A,设计了一款基于I2C总线的8点温度采集监测系统。

系统可通过上位机监控软件实现传感器序号显示、温度值显示、温度报警、远距离通信。

测温系统与上位机软件通过RS232进行通信。

2 系统硬件设计系统使用ATMEL公司的AT89C52单片机作为主控制器,最多可采集8路温度。

第七章 LM75A 数字温度计

第七章 LM75A 数字温度计
}
void main() { int t;
SysInit(); for (;;) {
t = LM75A_GetTemp(); DispTemp(t); Delay(1000); } } 由于本实验LED数码管只需要显示十进制数字和减号,所以在数码管上显示字符的DispChar()程序如下: /* 函数:DispChar() 功能:在数码管上显示字符 参数: x:数码管的坐标位置(0~7) c:要显示的字符(仅限十进制数字和减号) */ void DispChar(unsigned char x, unsigned char c) { //0123456789的数码管字型数据 code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; x &= 0x07; x = 7 - x; if ( c == '-' ) { DispBuf[x] = 0x40; } else if ( ( c >= '0' ) && ( c <= '9' ) ) { DispBuf[x] = Tab[c-'0']; } }
int t;
I2C_Gets(0x90,0x00,2,buf);

t = buf[0];
t <<= 8;
t += buf[1]; t >>= 5;
//去掉无关位
return t;
}
/*
函数:ByteToStr() 功能:字节型变量c转换为十进制字符串
*/ void ByteToStr(unsigned char idata *s, unsigned char c) {

LM75A程序解析(数字式温度传感器

LM75A程序解析(数字式温度传感器

LM75A程序解析(数字式温度传感器2011-01-29 15:14:13| 分类:默认分类| 标签:lm75a 工程师|字号订阅最近在测试LM75A的过程中出现的问题,从网上找来资料,调试发现都有问题,所以啊思路可以参考别人的具体程序还是自己写吧呵呵!网上的两个程序都有问题,都是数据处理过程中的问题:第一篇网上的帖子:在如今什么芯片都在涨价就是工资没涨价的情况下,看到LM75A 比DS18B20还是便宜,有兴趣的朋友可以考虑下,这是网上资料,本人没测试LM75A是PHILPS公司生产的数字温度传感器及看门狗。

通过片内集成的带隙温度传感器和∑-△数摸转换器来实现数字温度的测量,并通过该温度传感器为用户提供温度超限报警输出。

LM75A内部包含多个数据寄存器:(1)配置寄器(Conf):用来存储器件的配置,如:器件工作模式、OS工作模式、OS极性和OS故障队列;(2)温度寄存器(Temp):用于存储读取的数字温度;(3)设定点寄存器(Tos&Thyst):用来存储可编程的过热关断和滞后限制。

器件通过2线的串行I2C总线接口与控制器通信。

LM75A包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。

LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时挂8个LM75A而无需其他硬件的支持CPU:STC89C54RD+晶震:11.0592MA0 A1 A2 均接地地址设置为0 OS脚和INT0相连并通过10K上拉到VCC;当转换温度超过极限温度,输出中断蜂鸣器报警;刷新数码管显示温度共5位前一位表示正负温度后三位为温度125 - -55 最后一位为0.1度最高可精确到0.125 数码管图略(看程序应该会知道)定时器100MS采集温度一次#include#include#includesbit xiaoshu=P2^0; //COM口sbit ge=P2^1;sbit shi=P2^3;sbit bai=P2^4;sbit fh=P2^5;sbit SDA_LM75=P1^0; //数据sbit SCL_LM75=P1^1;sbit BP=P2^1;bit dp=0;unsigned char JS=0;#define LED P0 //8位数码管动态时时刷新#define CONF 0X01 //配置寄存器#define TEMP 0X00 //温度寄存器只读#define ALARM 0X03 //超温关闭极限寄存器默认5000H#define DELAY 0X02 //滞后寄存器默认4B00H#define WADDR 0X90 //写地址#define RADDR 0X91 //读地址unsigned int tempdata=0; //全局变量申明温度unsigned char code tab[]={ 0x3f,0x30,0x6d,0x79,0x72,0x5b,0x5f,0x31,0x7f,0x7b,0x40}; //共阴//0, 1, 2 3 4 5 6 7 8 9//unsigned char tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳//0, 1, 2 3 4 5 6 7 8 9unsigned char code tabdp[]={ 0xbf,0xb0,0xed,0xf9,0xf2,0xdb,0xdf,0xb1,0xff,0xfb,0xc0 };//共阴带小数点//0, 1, 2 3 4 5 6 7 8 9//unsigned char tabdp[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};/ /共阳void delay_xms(unsigned int count) //延时函数{register unsigned char j;while (count --){for (j=0;j<125;j++) //约1MS{}}}void Led_Display(unsigned int i,bit mode) //显示函数{if(mode)LED = 0x40; //共阴负//LED=0xBF;elseLED = 0x00;//LED= 0XFF;fh = 1;bai = 0;shi = 0;ge = 0;xiaoshu=0;delay_xms(1);LED = tab[i/1000];i%=1000;fh = 0;shi = 0;ge = 0;xiaoshu=0;delay_xms(1);LED = tab[i/100];fh=0;bai = 0;shi = 1;ge = 0;xiaoshu=0;delay_xms(1);LED = tabdp[i/10]; //带小数点fh=0; bai = 0;shi = 0;ge = 1;xiaoshu=0;delay_xms(1);LED = tab[i%10];fh=0;bai = 0;shi = 0;ge = 0;xiaoshu=1;delay_xms(1);}void delay(void) //延时函数{_nop_();_nop_();_nop_();_nop_();}void start_lm75(void)//起始{SDA_LM75=1;SCL_LM75=1;delay();SDA_LM75=0;delay();SCL_LM75=0;}void stop_lm75(void)//停止{SDA_LM75=0;SCL_LM75=1;SDA_LM75=1;delay();SCL_LM75=0;}void Check_Ack(void) //检查应答信号{SDA_LM75=1;SCL_LM75=1;F0=0;delay();if(SDA_LM75) //如果数据为高置位非应答标志FO F0=1; //通用标志位PSW状态寄存器SCL_LM75=0; //准备下一变化数据}void Ack(void) //发响应信号{SDA_LM75=0;delay();SCL_LM75=1;delay();SCL_LM75=0;}void no_Ack(void) //发非响应信号{SDA_LM75=1;SCL_LM75=0;delay();SCL_LM75=1; //迫使数据传输结束delay();}void send_byte(unsigned char temp) //发送一字节数据{ unsigned char i=8;while(i--){SDA_LM75=(bit)(temp&0x80);SCL_LM75=1;delay();SCL_LM75=0;temp<<=1;}SCL_LM75=0;SDA_LM75=1; //释放SDA数据线}unsigned char read_byte(void) //读一字节数据{unsigned char i=8;unsigned char temp;while(i--){temp<<=1;if(SDA_LM75)temp++;SCL_LM75=1;delay();SCL_LM75=0;}SCL_LM75=0;delay();SDA_LM75=1; //释放SDA数据线return (temp);}void Write_chardata(unsigned char addr,unsigned char tempdata)//写配置寄存器{start_lm75();send_byte(WADDR);Check_Ack();if(F0){no_Ack();return;}Ack();send_byte(addr);Check_Ack();if(F0){no_Ack();return;}Ack();send_byte(tempdata);Check_Ack();if(F0)return;}Ack();delay();stop_lm75();}void Write_intdata(unsigned char addr,unsigned int tempdata)//写16位寄存器{unsigned char datahigh;unsigned char datalow;datahigh=(unsigned char)(tempdata>>8);datalow=(unsigned char)(tempdata&0x00FF);start_lm75();send_byte(WADDR);Check_Ack();if(F0){no_Ack();return;}Ack();send_byte(addr);Check_Ack();if(F0){no_Ack();return;}Ack();send_byte(datahigh);send_byte(datalow);Check_Ack();if(F0){no_Ack();return;}Ack();delay();stop_lm75();}unsigned char read_chardata(unsigned char addr) //读8位寄存器unsigned char temp;start_lm75();send_byte(WADDR);Check_Ack();if(F0){no_Ack();return 0;}Ack();send_byte(addr);Check_Ack();if(F0){no_Ack();return 0;}Ack();send_byte(RADDR);Check_Ack();if(F0){no_Ack();return 0;}Ack();temp=read_byte();stop_lm75();return (temp);}unsigned int read_intdata(unsigned char addr) //读16位寄存器{//unsigned char temphigh,templow; 原函数使用的是无符号字符型,8位unsigned int temphigh,templow; //改成了无符号整形16位start_lm75();send_byte(WADDR);Check_Ack();if(F0){no_Ack();return 0;}Ack();send_byte(addr);Check_Ack();if(F0){no_Ack();return 0;}Ack();send_byte(RADDR);Check_Ack();if(F0){no_Ack();return 0;}Ack();temphigh=read_byte(); templow=(read_byte())&0xe0; stop_lm75();if(!(temphigh&0x80)){dp=0;return (((temphigh<<8)|templow)>>5); //如果使用的是8位字符型temphigh的话左移过程中数据已经全部丢了!}else{dp=1;return (0x800-((temphigh<<8)|templow)>>5);}}void initial() // 初始化LM75A{Write_chardata(CONF,0X20); //0S中断模式,温度转换正常模式Write_intdata(ALARM,0x3300); //100度极限由高9位有效位组成BIT15为1表示为负为0表示为正超过100度触发外部中断0 Write_intdata(DELAY,0X4A80); // 95度后不报警}void int0_int() interrupt 0 using 1 // 外部中断0服务函数{BP=0;delay_xms(1000);delay_xms(1000);}void t0_int() interrupt 1 using 1 //定时器0中断服务函数{TR0=0;TH0=0xdc; // 10MS中断初值TL0=0xff;TR0=1;JS++;if(JS>10) //加到10为100MS{JS=0;tempdata=read_intdata(TEMP); //采集数据tempdata=(tempdata/8)*10; //转换为温度}}void main() // 入口函数{IP=0X01;TMOD=0X01;TH0=0xdc; // 10MS中断初值TL0=0xff;IT0=0; //外部中断0采用电平触发ET0=1;TR0=1; //开放定时器0中断EX0=1;EA=1;initial();while(1){if(dp)Led_Display(tempdata,1);elseLed_Display(tempdata,0);}}第二个程序,问题同样出现在数据处理中!://main主函数/*main.cLM75A数字温度计*/#include "Disp.h"#include "I2C.h"#include#include/*函数:Delay()功能:延时1ms~65.536s 参数:t>0时,延时(t*0.001)st=0时,延时65.536s*/void Delay(unsigned int t) {do{TH0 = 0xFC;TL0 = 0x66;TR0 = 1;while ( !TF0 );TR0 = 0;TF0 = 0;} while ( --t != 0 );}/*函数:SysInit()功能:系统初始化*/void SysInit(){TMOD &= 0xF0;TMOD |= 0x01; //设置T0为16位定时器 DispInit(); //数码管扫描显示初始化I2C_Init(); //初始化I2C总线}/*函数:ByteT oStr()功能:字节型变量c转换为十进制字符串void ByteToStr(unsigned char idata *s, unsigned char c){code unsigned char Tab[] = {100,10};unsigned char i;unsigned char t;for ( i=0; i<2; i++ ){t = c / Tab[i];*s++ = '0' + t;c -= t * Tab[i];}*s++ = '0' + c;*s = '\0';}/*函数:LM75A_GetT emp功能:读出LM75A的温度值返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)*/int LM75A_GetTemp(){unsigned char buf[2];int t;I2C_Gets(0x90,0x00,2,buf);t = buf[0];t <<= 8;t += buf[1];t >>= 5; //去掉无关位右移8位后再左移高位始终是0 正负将无法判断 return t;}/*函数:DispTemp()功能:在数码管上显示出温度值参数:t:补码,除以8以后才是真正温度值*/void DispTemp(int t){code unsigned char Tab[8][4] ={"000","125","375","500","625","750","875"};unsigned char buf[4];bit s; //符号位unsigned char i; //整数部分unsigned char d; //小数部分unsigned char x; //临时变量//分离出符号s = 0;if ( t < 0 ){s = 1;t = -t;}//分离出整数和小数部分i = t / 8;d = t % 8;//整数部分转换成字符串ByteToStr(buf,i);x = 4 - strlen(buf);//清除所有显示DispClear();//显示符号if ( s ) DispChar(x,'-');x++;//显示整数部分DispStr(x,buf);//显示小数点DispDotOn(4);//显示小数部分DispStr(5,Tab[d]);}void main(){int t;SysInit();for (;;){t = LM75A_GetT emp(); DispTemp(t); Delay(1000); } }。

基于FS_S5PC100的LM75温度传感器驱动程序添加与测试

基于FS_S5PC100的LM75温度传感器驱动程序添加与测试

基于FS_S5PC100的LM75温度传感器驱动程序添加与测试 基于FS_S5PC100的LM75温度传感器驱动程序添加与测试作者:郑⽼师,华清远见嵌⼊式学院讲师。

【实验内容】在平台代码中添加I2C设备LM75;在内核配置菜单中配置温度传感器LM75驱动程序。

编写应⽤程序读取当前温度;温度传感器芯⽚位于COM3下⽅,紧靠蓝⾊的可调电阻旋钮。

【实验⽬的】熟悉内核中I2C驱动的⼯作原理,了解sysfs接⼝的使⽤⽅法【实验平台】主机:Ubuntu 10.10⽬标板:FS_S5PC100⽬标内核版本:2.6.29交叉编译器版本:arm-unknown-linux-gnueabi-gcc-4.2.2【实验步骤】在主机ubuntu环境下:1、在内核S5PC100平台代码中添加⼀个I2C设备⽤来描述LM75:打开平台代码源⽂件:$ vim (kernel_dir)/arch/arm/mach-s5pc100/mach-smdkc100.c在结构体:static struct platform_device *smdkc100_devices[] __initdata = {…};的定义后⾯添加如下代码:static struct i2c_board_info i2c_devs0[] __initdata = {{ I2C_BOARD_INFO("lm75", 0x90 >> 1 ), },};在函数smdkc100_machine_init中的/* i2c */s3c_i2c0_set_platdata(NULL);s3c_i2c1_set_platdata(NULL);之后添加如下代码:i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));2、在内核源码根⽬录下执⾏:$ make menuconfig进⼊配置菜单后选择lm75温度传感器的驱动程序:Location:-> Device Drivers-> Hardware Monitoring support (HWMON [=y])3、重新编译内核$ make zImage4、重新烧写或者下载内核到开发板5、将⽂件夹s5pc100_lm75复制到linux环境中,如:/home/linux/test$ cp s5pc100_lm75 /home/linux/test –a$ cd /home/linux/test/s5pc100_lm756、$ arm-linux-gcc read_temp.c -o read_temp //编译应⽤程序7、$ sudo cp read_temp /source/rootfs在开发板的串⼝终端控制台下:8、运⾏应⽤程序# ./read_temp⽤⼿捂住传感器芯⽚,可以看到温度值会持续上升:lm75 0-0048: Starting lm75 updateCurrent temperature is: 27.000000Current temperature is: 27.000000lm75 0-0048: Starting lm75 updateCurrent temperature is: 28.000000Current temperature is: 28.000000lm75 0-0048: Starting lm75 updateCurrent temperature is: 29.000000Current temperature is: 29.0000009、阅读驱动源码:driver/hwmon/lm75.c,理解i2c驱动的注册⽅法,lm75的⼯作原理以及sysfs 接⼝的编程⽅法附:1、温度传感器接⼝原理图2、测试程序代码:#include <stdio.h>#include <fcntl.h>int main(){int n, temp_int;float temp_float;char buf[10];int fd = open("/sys/bus/i2c/devices/0-0048/temp1_input", O_RDONLY); if(fd < 0) {perror("open error");return -1;}printf("fd = %d\n", fd);while(1) {n = read(fd, buf, 10);if(n < 0) {perror("read error");return -1;}if( 0 == n) {printf("Nothing can be read now.\n");perror("read zero");return -1;}buf[n-1] = '\0';temp_int = atoi(buf);temp_float = temp_int / 1000; // translate into real temperatureprintf("Current temperature is: %f\n", temp_float);sleep(1);close(fd);fd = open("/sys/bus/i2c/devices/0-0048/temp1_input", O_RDONLY); }return 0;}。

I2C实践(一)-LM75A温度传感器_图文.

I2C实践(一)-LM75A温度传感器_图文.

FPGA/CPLD开发套件实验教程—— PERI2-4DI 篇实验四、I 2C 实践(一)-LM75A 温度传感器实验目的:在这一课里,我们一起来学习I2C 协议,以及I2C 驱动的编写方法,并通过FPGA/CPLD来驱动LM75A 温度传感器,读出当前温度信息。

实验原理:(1 I2C串行总线概述采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。

同时,系统的更改和扩充极为容易。

常用的串行扩展总线有: I2C (Inter IC BUS )总线、单总线(1-WIRE BUS )、SPI (Serial Peripheral Interface )总线及Microwire/PLUS等。

本课仅讨论I2C 串行总线。

I2C 总线是PHLIPS 公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C 总线只有两根双向信号线。

一根是数据线SDA ,另一根是时钟线SCL 。

I2C 总线通过上拉电阻接正电源。

当总线空闲时,两根线均为高电平。

连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA 及SCL 都是线“与”关系。

每个接到I2C 总线上的器件都有唯一的地址。

主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主FPGA/CPLD开发套件实验教程—— PERI2-4DI 篇机即为发送器,总线上接收数据的器件则为接收器。

在多主机系统中,可能同时有几个主机企图启动总线传送数据,为了避免混乱, I2C 总线要通过总线仲裁,以决定由哪一台主机控制总线。

在FPGA/CPLD应用系统的串行总线扩展中,我们经常遇到的是以FPGA/CPLD为主机,其它接口器件为从机的单主机情况。

(2I2C总线的数据传送1)、数据位的有效性规定I2C 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

采用TMP275温度传感器实现对电机设备温度实时监测

采用TMP275温度传感器实现对电机设备温度实时监测

采用TMP275温度传感器实现对电机设备温度实时监测电机的温度检测与控制在工业生产中有着至关重要的作用,目前国内缺乏针对电机转子温度进行实时在线监控的系统。

而电机超时、超负荷的运转会导致电机温度急剧上升,轻则影响工业生产的安全性、稳定性,重则直接酝酿巨大的经济损失。

由于电机内部的结构复杂,工作时转子高速运转,无法实现有线测量,所以大多数电机的温度监测系统还以非直接接触式的测量为主,但这些方法存在测量误差大、延时时间长等缺点。

文中研究了一种基于TMP275的电机温度实时在线监测系统,以MSP430为核心处理器,通过红外无线发射模块,实现对电机设备温度实时在线监测,通过实验对比分析得出该系统测量精度高,误差小,响应速度快,运行可靠,可广泛应用于高精度仪器仪表控制系统中。

1 模块电路硬件设计1.1 总体结构设计本设计以MSP430作为控制器,MSP430是一款超低功耗的单片机,采用+3.3 V供电。

特别适合应用与电池供电的长时间工作场合。

通过TMP275对电机内部温度进行测量,送MSP430进行处理,并将处理结果送给固定在转子上的红外发射模块。

固定在定子上的红外接收模块将接收到的数据送给上位机,实现实时在线监测,系统的总体结构框图如图1所示。

1.2 传感器采集电路的设计本设计采用的TMP275数字式温度传感芯片,采用+3.3 V供电,同时集成I2C总线接口和16位AD转换电路。

在-55~+127℃的工作温度范围内,TMP275数字传感器仅产生+0.5 ℃的误差;同时相对模拟型温度传感器,TMP275输出的数字信号便于直接送给控制器进行处理,避免了模-数转换电路的繁琐与实时性差的缺点。

采集电路的设计如图2所示,其中A2、A1、A0是它的地址引脚,工作时将它们同时接地。

芯片将采集的温度转换为16位的二进制数:第1位是符号位,紧接着是整数部分7位,小数部分4位,最后4位全是0。

具体温度格式如下:。

tmp75芯片原理

tmp75芯片原理

tmp75芯片原理
TMP75芯片是一种数字温度传感器芯片,采用了数字式温度传感器技术,可以直接将温度转换为数字信号输出。

其原理基本上是利用芯片内部的温度传感器来检测环境温度,并将检测到的温度值转换为数字信号输出。

TMP75芯片内部集成了温度传感器、模数转换器和数字接口电路,通过I2C接口与微处理器进行通信。


TMP75芯片被连接到电源并进行初始化后,温度传感器开始测量环境温度,并将数字化的温度值发送给微处理器。

TMP75芯片的工作原理主要基于热敏电阻的特性。

当环境温度发生变化时,芯片内部的热敏电阻也会随之改变,从而改变了电阻值。

TMP75芯片通过测量这种电阻值的变化来计算出环境温度,并将其转换为数字信号输出。

数字化的温度值可以通过I2C接口传输到微处理器,实现对环境温度的精确监测和控制。

除了基本的工作原理外,TMP75芯片还具有一些特殊的工作机制,比如温度测量精度、分辨率、工作电压范围等。

这些特性都是基于其内部电路设计和工作原理的基础上实现的。

总的来说,TMP75芯片的原理是基于数字式温度传感器技术,利用热敏电阻的特性来实现对环境温度的精确测量和数字化输出。

温度传感器在铁路中的运用

温度传感器在铁路中的运用

温度传感器在铁路中的运用
温度传感器在铁路中有广泛的应用,以下是一些常见的例子:
1. 轨道温度监测:温度传感器可以安装在轨道上,实时监测轨道的温度变化。

这对于预防轨道膨胀、收缩和断裂等问题非常重要,特别是在极端温度条件下。

2. 列车制动系统:温度传感器可以用于监测列车制动系统的温度,以确保制动系统正常工作。

如果制动系统过热,可能会导致制动失效,从而危及列车的安全。

3. 列车电气系统:温度传感器可以用于监测列车电气系统的温度,例如电机、变压器和电缆等。

这有助于及时发现潜在的故障,并采取必要的维护措施。

4. 车厢环境控制:温度传感器可以用于监测车厢内的温度,以确保乘客的舒适。

这对于长途列车和高寒地区的列车尤为重要。

5. 铁路设施监测:温度传感器可以用于监测铁路设施的温度,例如信号设备、变电所和通信设备等。

这有助于确保这些设施的正常运行,并及时发现潜在的问题。

温度传感器在铁路中扮演着重要的角色,它们可以帮助确保列车的安全、可靠运行,并提高乘客的舒适性。

LM75数字温度传感器应用

LM75数字温度传感器应用
/* USART1 配置 */ USART_Configuration();
I2C_LM75_Init();/*I2C 初始化*/
Thermometer_Temperature();/*温度显示*/
while(1 ) { if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET) { i = USART_ReceiveData(USART1); printf(" %c",i&0xFF); /* 打印输入字符 */
ErrorStatus HSEStartUpStatus;
/* 函数及引用外部函数 -----------------------------------------------*/ void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); extern void I2C_LM75_Init(void); extern u32 TempCelsius_Value ; extern u16 I2C_LM75_Temp_Read(void); extern ErrorStatus I2C_LM75_Status(void); extern void Thermometer_Temperature(void) ;
节,设备地址字节(如表 8-26 所示)包括了读/写选择位,每次读/写操作必须由停止状态(STOP)
结束。称作确认(ACK)的约定确认了每个字节的接收。
表 8-26 STLM75 从地址字节定义
ห้องสมุดไป่ตู้

51单片机中使用LM75A温度传感器的简单实例

51单片机中使用LM75A温度传感器的简单实例

51单片机中使用LM75A温度传感器的简单实例/*本程序使用LM75A数字温度传感器对环境温度的测量,显示格式如下0XX.XXC其中最高位0代表符号位,XX.XX为显示位数,保留两位小数,C 为温度单位摄氏度。

*/#include#include#define uint unsigned int#define uchar unsigned charsbit led1= P1^0;sbit led2= P1^1;sbit led3= P1^2;sbit bell= P1^3;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;sbit SCL= P3^6;sbit SDA= P3^7;bit ack;uchar data LM75A=0x90; // LM75A 的I2C 地址uchar data temp[2]={0};uchar s=0;uchar z;uchar x;uchar flag=0;uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//0~ 9 uchar code zfs[]={0xfc,0x02};//+/-uchar code Tab[8]={0,12,25,37,50,62,75,87};void Start_I2c();void Stop_I2c();void SendByte(uchar);uchar RcvByte();void Ack_I2c(bit);void ReadTemp();void ConvertTemp();void delay(uint);void control(uchar,uchar);void disply(uchar,uchar,uchar); void alert();void main(){P1=0x07;while(1){ReadTemp();//读取LM75A 当前温度值ConvertT emp(); alert();disply(s,z,x);}}void alert(){if(z>24) flag=1;else {flag=0;bell=0;}if(flag!=0) bell=1;}void delay(uint i){while(i--) ;}void control(uchar con1,uchar con2) { uchar i,j;uchar s;s=con1;for(i=6;i>0;i--){P1_7=0;delay(1);P1_5=s%2;s=s/2;P1_7=1;delay(1);}j=con2;for(i=8;i>0;i--){。

数字温度传感器芯片LM75CIM5

数字温度传感器芯片LM75CIM5

数字温度传感器芯片LM75CIM5产品说明:元件型号:LM75CIM5 品牌:国半封装:SOP8-3.9 性能:LM75数字温度传感器 2线串行可编程温度传感器,用户编程设置监控值、滞后值。

与 LM75的通信是通过与行业标准协议兼容的2线总线完成的。

它允许读入当前温度,对设定值和滞后编程,并配置器件。

LM75上电时为比较器模式。

缺省设置值为80℃,滞后5℃,0.5℃精度. 简述: LM75为数码温度感应器,它提供以两条线的I2C协议来监视温度的介面,上位机可以随时要求LM75去读取温度,当温度超过设定的温度时,系统会自动输出一个信号,可用于上位机的监操作。

主机可以通过程序来控制温度警报器(TOS)及温度,而且主机也能从LM75的TOS 及THYST 记录器中读取数据。

A0、A1、A3这三只引脚可以设定选项。

2.芯片参数 Supply Voltage 3.0V to 5.5V Supply Current operating 250 μA (typ) 1 mA (max) shutdown 4 μA (typ) Temperature Accuracy -25°C to 100°C±2°C(max) -55°C to 125°C±3°C(max) 3.LM75的控制方法(简介,详细见DATASHEET) LM75提供I2C接口,可用于上位机与LM75的通信,I2C的资料可参考相关资料。

LM75内部有四个寄存器,四个寄存通过POINT REGISTER进行选择,在LM75上电时该寄存默认为00,即选择温度寄存器(Temperature register),这个寄存器中存贮了当前所采样的温度值,如果通过过I2C发出一个读命令,则LM75会返回该寄存中的温度值,该温度值为一个16位的字,具体的格式见DataSheet. 4.例子#include "sensors.h" #include main() { unsigned int Data; printf("This program is testingLM75......\n"); LM75_Init(); while(1){ Data=LM75_GetTempertureValue(); printf("Current Temperature value is:%d\n",Data); Dalay1S(); } } 注:如果当前目标板发生变化,与LM75的相联的管脚也要做相应的变化,同时也要注意LM75的A0、A1、A2的变化。

基于FPGA的LM75A温度传感器(VHDL)

基于FPGA的LM75A温度传感器(VHDL)

1.编写的程序(一)功能模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;--实体--entity at24c08 isport(clk : in std_logic; --时钟信号rst : in std_logic; --复位信号scl : out std_logic; --i2c时钟线sda : inout std_logic; --i2c数据线urv_1 : in std_logic; --上限值1urv_2 : in std_logic; --上限值2sel : out std_logic_vector(3 downto 0);seg : out std_logic_vector(7 downto 0);beep : out std_logic --蜂鸣器输出信号线);end at24c08;--结构体--architecture arch_at24c08 of at24c08 issignal clk_sslow : std_logic;signal counter : std_logic_vector(23 downto 0);signal readdata_reg_buf : std_logic_vector(15 downto 0);signal readdata_ten : integer range 0 to 24564;signal readdata_std : std_logic_vector(15 downto 0);signal qian : std_logic_vector(3 downto 0);signal bai : std_logic_vector(3 downto 0);signal shi : std_logic_vector(3 downto 0);signal ge : std_logic_vector(3 downto 0);signal qian_0 : integer range 0 to 10;signal bai_0 : integer range 0 to 10;signal shi_0 : integer range 0 to 10;signal ge_0 : integer range 0 to 10;--数码管部分信号signal sel_0 : std_logic_vector(3 downto 0);signal seg_0 : std_logic_vector(7 downto 0);signal count : std_logic_vector(13 downto 0);signal clk_slow : std_logic;signal scan_num : std_logic_vector(1 downto 0);signal seg_data_buf : std_logic_vector(3 downto 0);--i2c部分信号signal sda_buf : std_logic; --i2c输入/输出数据寄存器signal link : std_logic; --sda输入输出方向寄存器signal readdata_reg : std_logic_vector(15 downto 0);--i2c读回的数据寄存器signal sda_0 : std_logic; --与sda端口连接信号signal scl_0 : std_logic; --与scl端口连接信号--按键消抖部分信号signal delay_cnt : std_logic_vector(19 downto 0); --消抖延时计数器signal start_delay : std_logic; --按键延时开始--分频部分信号signal clk_div : std_logic_vector(12 downto 0); --分频计数器,5000分频,10khz--蜂鸣器部分信号signal beep_en : std_logic; --蜂鸣器使能信号signal beep_buf : std_logic; --与beep端口连接的信号--时钟部分信号signal level_high : std_logic; --高电平中间值,1249 signal level_low : std_logic; --低电平中间值,3749 signal level_hig_edge : std_logic; --上升沿,4999signal level_low_edge : std_logic; --下降沿,2499--状态机部分信号signal main_state : std_logic_vector(1 downto 0); --状态机主状态signal i2c_state : std_logic_vector(2 downto 0); --i2c状态signal i2c_per_state : std_logic_vector(3 downto 0); --i2c每一步状态--分频部分常量constant div_parameter : std_logic_vector(12 downto 0):="1001110001000";--分频系数,500--状态机部分常量--操作状态常量constant read_init : std_logic_vector(2 downto 0) :="000";--EEPORM 初始化constant read_high : std_logic_vector(2 downto 0) :="001";--读高位数据状态constant read_low : std_logic_vector(2 downto 0) :="010";--读低位数据状态--i2c每一步状态常量constant start : std_logic_vector(3 downto 0) :="0000";--开始位constant first : std_logic_vector(3 downto 0) :="0001";--数据第一位constant second : std_logic_vector(3 downto 0) :="0010";--数据第二位constant third : std_logic_vector(3 downto 0) :="0011";--数据第三位constant fourth : std_logic_vector(3 downto 0) :="0100";--数据第四位constant fifth : std_logic_vector(3 downto 0) :="0101";--数据第五位constant sixth : std_logic_vector(3 downto 0) :="0110";--数据第六位constant seventh : std_logic_vector(3 downto 0) :="0111";--数据第七位constant eighth : std_logic_vector(3 downto 0) :="1000";--数据第八位constant ack : std_logic_vector(3 downto 0) :="1001";--应答位constant stop : std_logic_vector(3 downto 0) :="1010";--停止位--结构体开始beginscl <= scl_0;seg <= seg_0;sda_0 <= sda_buf when (link)='1' else 'Z';sda <= sda_0;sel <= sel_0;beep <= beep_buf;--按键消抖key : process(clk,rst)beginif(not rst='1') thendelay_cnt <= (others => '0');elsif (clk'event and clk='1') thenif start_delay='1' thenif(delay_cnt /= "11110100001001000000") then --20ms延时delay_cnt <= delay_cnt+'1';elsedelay_cnt <= (others => '0');end if;end if;end if;end process key;--分频部分div : process(rst,clk)beginif(not rst='1') thenclk_div <= "0000000000000";level_high <= '0';level_low <= '0';level_hig_edge <= '0';level_low_edge <= '0';elsif(clk'event and clk='1') thenif(clk_div /= div_parameter-'1') then clk_div <= clk_div+'1';elseclk_div <= "0000000000000";end if;if(level_high='1') thenlevel_high <= '0';elseif(clk_div="10011100001") thenlevel_high <= '1';end if;end if;if(level_low_edge='1') thenlevel_low_edge <= '0';elseif(clk_div="100111000011") thenlevel_low_edge <= '1';end if;end if;if(level_low='1') thenlevel_low <= '0';elseif(clk_div="111010100101") thenlevel_low <= '1';end if;end if;if(level_hig_edge='1') thenlevel_hig_edge <= '0';elseif(clk_div="1001110000111") thenlevel_hig_edge <= '1';end if;end if;end if;end process div;--EEPROM操作部分state : process(clk,rst)beginif(not rst='1') thenstart_delay <= '0';scl_0 <= '1';sda_buf <= '1';link <= '0';readdata_reg <= "0000000000000000";main_state <= "00";i2c_state <= read_init;i2c_per_state <= start;elsif(clk'event and clk='1') thencase main_state is--初始化EEPROMwhen "00" =>--等待读写要求scl_0 <= '1';sda_buf <= '1';link <= '0';i2c_state <= read_init;i2c_per_state <= start;main_state <= "10";--读取EEPRO数据when "10" =>if(level_hig_edge='1') thenscl_0 <= '1';elseif(level_low_edge='1') thenscl_0 <= '0';end if;end if;case i2c_state iswhen read_init => --读命令地址case i2c_per_state iswhen start =>if(level_high='1') thensda_buf <= '0';link <= '1';end if;if((level_low and link)='1') thenlink <= '1';sda_buf <= '1';i2c_per_state <= first;end if;when first =>if(level_low='1') thensda_buf <= '0';i2c_per_state <= second;end if;when second =>if(level_low='1') thensda_buf <= '0';link <= '1';i2c_per_state <= third;end if;when third =>if(level_low='1') thensda_buf <= '1';link <= '1';i2c_per_state <= fourth;end if;when fourth =>if(level_low='1') thensda_buf <= '0';link <= '1';i2c_per_state <= fifth;end if;when fifth =>if(level_low='1') thensda_buf <= '0';link <= '1';i2c_per_state <= sixth;end if;when sixth =>if(level_low='1') thensda_buf <= '0';i2c_per_state <= seventh;end if;when seventh =>if(level_low='1') thensda_buf <= '1';link <= '1';i2c_per_state <= eighth;end if;when eighth =>if(level_low='1') thenlink <= '0';i2c_per_state <= ack;end if;when ack =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenif(sda_buf='1') thenmain_state <= "00";end if;end if;if(level_low='1') thenlink <= '0';i2c_state <= read_high;i2c_per_state <= first;end if;when others => null;end case;when read_high => --读回数据case i2c_per_state iswhen first =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= second;end if;when second =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= third;end if;when third =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= fourth;end if;when fourth =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= fifth;end if;when fifth =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= sixth;end if;when sixth =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= seventh;end if;when seventh =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= eighth;end if;when eighth =>if(level_hig_edge='1') thensda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(15 downto 9) <= readdata_reg(14 downto 8);readdata_reg(8) <= sda;end if;if(level_low='1') theni2c_per_state <= ack;end if;when ack =>if(level_high='1') thenlink <= '1';sda_buf <= '0';i2c_per_state <= first;i2c_state <= read_low;end if;when others => null;end case;when read_low =>case i2c_per_state iswhen first =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= second;end if;when second =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= third;end if;when third =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= fourth;end if;when fourth =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= fifth;end if;when fifth =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= sixth;end if;when sixth =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= seventh;end if;when seventh =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= eighth;end if;when eighth =>if(level_hig_edge='1') thenlink <= '0';sda_buf <= sda;end if;if(level_high='1') thenreaddata_reg(7 downto 1) <= readdata_reg(6 downto 0);readdata_reg(0) <= sda;end if;if(level_low='1') theni2c_per_state <= ack;end if;when ack =>if(level_high='1') thenlink <= '1';sda_buf <= '1'; --非应答位-- i2c_per_state <= stop;end if;if(level_low='1') thenlink <= '1';sda_buf <= '0';i2c_per_state <= stop;end if;when stop =>if(level_high='1') thenlink <= '1';sda_buf <= '1'; --停止位end if;if(level_low='1') thenmain_state <= "00";end if;when others => null;end case;when others => null;end case;when others => null;end case;end if;end process state;--数据处理部分anly1 : process(readdata_reg_buf)beginreaddata_ten <= conv_integer(readdata_reg_buf)*12;qian_0 <= readdata_ten/1000;bai_0 <= (readdata_ten/100) rem 10;shi_0 <= (readdata_ten/10) rem 10;ge_0 <= readdata_ten rem 10;end process anly1;anly2 : process(qian_0,bai_0,shi_0,ge_0)beginqian <= conv_std_logic_vector(qian_0,4);bai <= conv_std_logic_vector(bai_0,4);shi <= conv_std_logic_vector(shi_0,4);ge <= conv_std_logic_vector(ge_0,4);end process anly2;--数码管显示部分scan : process(rst,clk)beginif(not rst='1') thencount <= (others => '0');clk_slow <= '0';elsif(clk'event and clk='1') thenif(count="11111011011111") thencount <= (others => '0');clk_slow <= not clk_slow;elsecount <= count + '1';end if;end if;end process scan;seg1 : process(clk_slow,rst)beginif(not rst='1') thenscan_num <= "00";elsif(clk_slow'event and clk_slow='1') thenif(scan_num="11") thenscan_num <= "00";elsescan_num <= scan_num + '1';end if;end if;end process seg1;seg2 : process(seg_data_buf)begincase seg_data_buf iswhen "1111" => seg_0 <= "10001110";when "1110" => seg_0 <= "10000110"; when "1101" => seg_0 <= "10100001";when "1100" => seg_0 <= "11000110";when "1011" => seg_0 <= "10000011";when "1010" => seg_0 <= "10011000";when "1001" => seg_0 <= "10010000";when "1000" => seg_0 <= "10000000"; when "0111" => seg_0 <= "11111000"; when "0110" => seg_0 <= "10000010"; when "0101" => seg_0 <= "10010010"; when "0100" => seg_0 <= "10011001"; when "0011" => seg_0 <= "10110000"; when "0010" => seg_0 <= "10100100"; when "0001" => seg_0 <= "11111001"; when "0000" => seg_0 <= "11000000"; when others => seg_0 <= "11111111";end case;end process seg2;seg0 : process(scan_num)begincase scan_num iswhen "00" =>sel_0 <= "1110";seg_data_buf <= ge;when "01" =>sel_0 <= "1101";seg_data_buf <= shi;when "10" =>sel_0 <= "1011";seg_data_buf <= bai;when "11" =>sel_0 <= "0111";seg_data_buf <= qian;when others => null;end case;end process seg0;--数据缓存部分ss : process(clk,rst)beginif(not rst='1') thenclk_sslow <= '0';counter <= (others => '0');elsif(clk'event and clk='1') thenif(counter /= "111111111111111111111110") then counter <= counter + '1';elsecounter <= (others => '0');clk_sslow <= not clk_sslow;end if;end if;end process ss;buf : process(clk_sslow)beginif(clk_sslow'event and clk_sslow='1') thenreaddata_reg_buf <= readdata_reg;elsereaddata_reg_buf <= readdata_reg_buf;end if;end process buf;--蜂鸣器报警部分bep : process(clk,rst)variable count : integer range 0 to 50000; --1KHz方波beginif(not rst='1') thencount := 0;beep_en <= '0';elsif(clk'event and clk='1') thenif(beep_en='1') thencount := count+1;if(count>50000) thencount := 0;beep_buf <= not beep_buf;end if;elseif(not urv_1='1') thenif(readdata_reg>"0000000000000011") thenbeep_en <= '1';end if;elsif(not urv_2='1') thenif(readdata_reg>"1111111111100000") thenbeep_en <= '1';end if;end if;end if;end if;end process bep;end arch_at24c08;(二)测试模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity tb is--null;end tb;architecture behv_tb of tb iscomponent at24c08port(clk : in std_logic; --时钟信号rst : in std_logic; --复位信号scl : out std_logic; --i2c时钟线sda : inout std_logic; --i2c数据线urv_1 : in std_logic; --上限值1urv_2 : in std_logic; --上限值2sel : out std_logic_vector(3 downto 0);seg : out std_logic_vector(7 downto 0);beep : out std_logic --蜂鸣器输出信号线);end component;constant clockperiod : time := 20ns;signal clk_tb : std_logic := '0';signal rst_tb : std_logic;signal scl_tb : std_logic;signal sda_tb : std_logic;signal urv_1_tb : std_logic;signal urv_2_tb : std_logic;signal sel_tb : std_logic_vector(3 downto 0);signal seg_tb : std_logic_vector(7 downto 0);signal beep_tb : std_logic;beginmyuit : at24c08 port map(clk => clk_tb,rst => rst_tb,scl => scl_tb,sda => sda_tb,urv_1 => urv_1_tb,urv_2 => urv_2_tb,sel => sel_tb,seg => seg_tb,beep => beep_tb);process(clk_tb)beginclk_tb <= not clk_tb after clockperiod/2;end process;rst_tb <= ‘0',‘1' after 1000ns;end behv_tb;。

LM75B与LM75A的区别

LM75B与LM75A的区别

LM75B与LM75A的区别LM75B—数字温度传感器和温度监控器概述LM75B是一款内置带隙温度传感器和∑-Δ模数转换技术的温度数字转换器,它也是温度检测器,可提供过热输出功能。

LM75B 包含多个数据寄存器:配置寄存器(Conf)用来存储器件的某些设置,如器件的工作模式、OS工作模式、OS极性和OS错误队列等;温度寄存器(Temp)用来存储读取的数字温度;设定点寄存器(Tos & Thyst)用来存储可编程的过热关断和滞后限制,器件通过两线的串行I2C总线接口与控制器通信。

LM75B还包含一个开漏输出(OS)管脚,当温度超过编程限制的值时该输出有效。

LM75B有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。

LM75B可配置成不同的工作模式。

它可设置成在正常工作模式下周期性地对环境温度进行监控,或进入关断模式来将器件功耗降至最低。

OS输出有2种可选的工作模式:OS比较器模式和OS中断模式。

OS输出可选择高电平或低电平有效。

错误队列和设定点限制可编程,可以激活OS输出。

温度寄存器通常存放着一个11位的二进制数的补码,用来实现0.125℃的精度,在需要精确地测量温度偏移或超出限制范围的应用中非常有用。

当LM75B在转换过程中不产生中断(I2C总线部分与∑-Δ转换部分完全独立)或LM75B不断被访问时,器件将一直更新温度寄存器中的数据。

正常工作模式下,当器件上电时,OS工作在比较器模式,温度阈值为80℃,滞后75℃,这时,LM75B就可用作独立的温度控制器,预定义温度设定点。

特点器件可以完全取代工业标准的LM75和LM75A,并提供了良好的温度精度(0.125℃),单个器件的电源范围可超出2.8V~5.5V 的范围具有I2C总线接口,同一总线上可连接多达8个器件电源电压范围:2.8V~5.5V环境温度范围:Tamb=-55℃~+125℃频率范围20Hz至400kHz,具有总线失效功能,总线失效自动恢复,防止锁死总线提供0.125℃的精度的11位ADC温度精度:-25℃~+100℃时为±2℃-55℃~+125℃时为±3℃可编程温度阈值和滞后设定点为了减低功耗,关断模式下消耗的电流仅为1.0μA上电时器件可用作一个独立的温度控制器ESD保护:在JESD22-A114标准下,可以通过4500V HBM模式在JESD22-A115标准下,可以通过450V MM模式在JESD22-C101标准下,可以通过2000V CDM模式在JEDEC标准下(JESD78)所做的闩锁测试可达100mA小型8脚封装:SO8、TSSOP8和3mm×2mm×SON8U封装信息管脚图/管脚描述LM75B与典型应用应用场合系统温度管理个人计算机电子设备工业控制器。

STM32f103处理器与LM75A温度传感器的通信应用

STM32f103处理器与LM75A温度传感器的通信应用
ui_cnt = TIME;
do {
ui_stateflag = I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);
}while((ui_stateflag==ERROR) && (-- ui_cnt));
if(ui_stateflag==SUCCESS) {
unsigned int I2C2_TempRead(void)
{
unsigned int ui_stateflag, ui_cnt;
unsigned short Value[2];
unsigned int LM75A_RegValue;
LM75A_RegValue = 0xFFFF;
ui_cnt = TIME;
if(ui_stateflag==RESET) {
ui_stateflag = ERROR;
I2C_GenerateSTART(I2C2,ENABLE);//等待I2C开启和总线为空
ui_cnt = TIME;
do {
ui_stateflag = I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
ui_cnt = TIME;
do {
ui_stateflag = I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED);
}while((ui_stateflag==ERROR) && (-- ui_cnt));
if(ui_stateflag==SUCCESS) {
ui_stateflag = ERROR;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

* 文件名
: main.c
* 描述
: 主程序
******************************************************************************/
/* 头文件 ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" #include <stdio.h>
MSB
LSB
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
0
0
0
0
0
0
P1
P0
详见指针寄存器位 选择表 8-22 简介
表 8-22 指针寄存器位选择简介
指针值
选中
寄存器
P1
P0
名称
描述
字位
读/写 权限
0
0 TEMP 温度寄存器 16 只读
0
0 CONF 配置寄存器 8 读/写
上电默认
R/W
位功能 定义
位 7~4 固定为 1001 A2,A1,A0 位设定状态必须与 STLM75A2,A1,A0 引接输入状态匹配,以便得到 ACK 信号 R/W:读/写操作选择位
STLM75 的 I2C 串行总线数据传输序列图分别如下所示图 9-11 所示。
图 9-11a 典型的从预置指针位置读出 2 字节,如温度,超阀值,滞后寄存器
} }
}
#ifdef DEBUG
/******************************************************************************
I2C 接口温度传感器 LM75A 应用案例
本实例利用 Cortex-M3 处理器 STM32F10xxx 的 I2C 接口对支持 I2C 总线协议的温度传 感器进行操作,读取温度值。
LM75A 设计要求
根据本实例的要求,本实例的设计包含硬件电路设计和软件设计,其中硬件电路设计是 本例的基础,大致划分如下: (1)STM32F10xxx 微处理器与温度传感器 I2C 接口电路设计,此部分是该硬件电路设计的关 键; (2)微处理器通过 I2C 接口读/写温度传感器的软件代码设计。
N/A 00
备注 存贮温度数据
1
0
THYS 滞后寄存器 16 读/写
4B00
默认=75℃
1
1
TOS
超温关闭
16 读/写 5000
设定超温关闭默认=80℃
(2)配置寄存器
配置寄存器 8 位可读/写,是用来存储设备设置的操作模式,比如超阀值温度关闭运行模式,
超温极性和超温故障队列等。如下表所示。
表 8-23 配置寄存器格式及位功能定义
节,设备地址字节(如表 8-26 所示)包括了读/写选择位,每次读/写操作必须由停止状态(STOP)
结束。称作确认(ACK)的约定确认了每个字节的接收。
表 8-26 STLM75 从地址字节定义
MSB
LSB
Byte
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
1
0
0
1
A2
A1
A0
int main(void) { u16 i=0;
#ifdef DEBUG debug();
#endif
/* 系统时钟配置 */ RCC_Configuration();
/* 中断向量配置 */ NVIC_Configuration();
/* GPIO 配置 */ GPIO_Configuration();
数字输出
十六进制码 0FAh 032h 001h 000h 1FFh 1CEh 1B0h 192h
STLM75 工作模式介绍 STLM75 所有的传输都在微处理器的控制下进行,微处理器作为主设备工作并提供给
STLM75 时钟信号,STLM 总是作为从设备身份工作。所有数据传输过程中数据字节都是先 传高位。读/写操作由开始状态(START)开始,紧跟着的是设备地址字节和一个或多个数据字
图 9-11b 典型的指针设置后立即读出 2 字节,如温度,超阀值,滞后寄存器 图 9-11c 典型的指针从带电预置指针的配置寄存器读出 1 字节 图 9-11d 典型的指针设置后立即读配置寄存器
图 9-11e 写配置寄存器 图 9-11f 写超阀值寄存器与滞后寄存器
I2C 接口温度传感器硬件原理图说明
它 函 数 包 含 在 main.c , stm32f10x_it.c , tsensor.c 当 中 。 限 于 篇 幅 cortexm3_macro.s,
stm32f10x_vector.s 省略介绍。
具体的程序代码及其说明(见注释语句)如下。
/******************************************************************************
STLM75 引脚功能描述
图 9-9 STLM75 功能框图
数字温度传感器 STLM75 的引脚示意如图 9-10 所示,相关引脚功能定义如下表。
图 9-10 STLM75 芯片引脚示意图
表 8-20 STLM75 数字温度传感器引脚功能定义
引脚
信号名称 功能定义
1 SDA
串行数据输入/输出
2 SCL
ErrorStatus HSEStartUpStatus;
/* 函数及引用外部函数 -----------------------------------------------*/ void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); extern void I2C_LM75_Init(void); extern u32 TempCelsius_Value ; extern u16 I2C_LM75_Temp_Read(void); extern ErrorStatus I2C_LM75_Status(void); extern void Thermometer_Temperature(void) ;
位 7:设置为’0’,保留
(3)温度寄存器 温度寄存器是一个由两个字节组成的 16 位“只读”操作寄存器,当温度—数字转换过程中, 温度值存贮于此寄存器,每当温—数转换完成,该寄存器内容将更新。 表 8-24 温度寄存器格式及位功能定义
Byte
HS Byte
LS Byte
MSB
TMSB
TLSB
LSB
TD:温度数据位
注:该寄存器格式兼容于 DS75 等同类芯片。
在温度寄存器,超阀值寄存器,滞后寄存器中,每单位值代表 0.5℃。该值均以二进制补码 表示,因而读 0 0000 0000b 时相当于 0℃。 STLM75 温度数值格式
表 8-26 显示的是外部温度与数字输出数据值之间的关系,温度寄存器,超阀值温度关 闭寄存器,滞后寄存器组成的温度相关数据值用补码表示。左边的数据包含了温度极性信息, 当为’0’时,表示此时的温度是正温;为’1’时,表示此时的温度为负温。
Byte
HS Byte
LS Byte
MSB
TMSB
TLSB
LSB

15
14 13 2 11 10 9 8 7 6 5 4 3 2 1 0
STLM75
9Bit
SB
TMSB TD TD TD TD TD TD
0
0
0
0
0
0
0
TLSB
SB:补码符号位,’0’表正温度,’1’表负温度
位功能 定义
TMSB:温度值最高位 TLSB:温度值最低位
LM75A 硬件电路设计
本实例硬件电路所用的 ARM Cortex-M3 核心处理器为 STM32F103VBH6, I2C 数字温 度传感器芯片为 STLM75,其详细介绍如下文。 LM75A 主要器件
在本章的实例设计中,选择 ST 公司的 STLM75 器件,它是一种含 9 位 ADC、温度分 辨率高达 0.5℃的数字温度传感器,测量范围能够达到-55℃~125℃。它提供两条线支持 I2C 总线协议的接口来监测温度,并具备自校准功能。上位机可以随时要求 STLM75 去读取温 度,当温度超过设定的温度时,芯片系统会自动输出一个超温报警信号,可用于上位机的监 控操作。主机可以通过程序来控制温度警报器(TOS)及温度。A0、A1、A3 这三只引脚可以设 定地址。下图是 STLM75 功能方框图。
表 8-25 温度与数字输出关系表
温度
+125℃ +25℃ +0.5℃
0℃ -0.5℃ -25℃ -40℃ -55℃
二进制码 0 1111 1010 0 0011 0010 0 0000 0001 0 0000 0000 1 1111 1111 1 1100 1110 1 1011 0000 1 1001 0010
TD0~8:温度数据位
(4)超阀值温度寄存器(TOS) 超温寄存器是由两个字节组成的 16 位可读/写操作的寄存器,存储了温度报警值的高位。默 认为 80℃。如下表 8-25 所示。 (5)迟滞温度寄存器(THYS) 迟滞温度寄存器是由两个字节组成的 16 位可读/写操作寄存器,存储用户设定的温度报警值 低位,默认设置为 75℃。超温寄存器及滞后温度寄存器格式如下表所示。 表 8-25 超温寄存器及滞后温度寄存器格式及位功能定义
相关文档
最新文档