LM75数字温度传感器应用
- 格式:pdf
- 大小:434.17 KB
- 文档页数:27
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—数字温度传感器和温度监控器概述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与典型应用应用场合系统温度管理个人计算机电子设备工业控制器。
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的多点温度监测系统设计杨新鹏【摘要】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程序解析(数字式温度传感器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温度传感器驱动程序添加与测试作者:郑⽼师,华清远见嵌⼊式学院讲师。
【实验内容】在平台代码中添加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;}。
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的电机温度实时在线监测系统,以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。
具体温度格式如下:。