[原创] MSP430F5739+TMP006温度传感器

蓝雨夜   2012-7-27 10:08 楼主
硬件资源
MSP-EXP430F5739学习板
TMP006基本电路(2层板)



硬件连接:SCL---P1。7
                  SDA--P1。6
Picture.jpg

[ 本帖最后由 蓝雨夜 于 2012-7-27 11:50 编辑 ]
  • 006.JPG
  • Picture 2.jpg

回复评论 (67)

2推荐 蓝雨夜 

//TMP006在I2C总线通讯时的地址
#define TMP006_ADDRESS                0x40        //7位串行总线从机地址

//TMP006含有5个16 bit的寄存器
//只有配置寄存器是,可读,可写的,其他都是只读的

#define VOBJECT_REG                        0x00        //传感器电压寄存器
#define TEMPERATURE_REG               0x01        //温度寄存器
#define CONF_REG                             0x02        //配置寄存器
#define Manufacturer_ID_REG            0xFE        //制造商ID寄存器        5449h
#define Device_ID_REG                      0xFF        //设备ID寄存器       0067h

[ 本帖最后由 蓝雨夜 于 2012-7-27 10:11 编辑 ]
点赞  2012-7-27 10:10
//配置寄存器相关位的定义
//Bit [15] RST: Software reset bit
#define TMP006_NO        0<<15        //正常运作,此位自我清除
#define TMP006_SR        1<<15        //软件复位

//Bits [14:12] MOD[2:0]: Mode of operation
#define TMP006_PD        0<<12        //掉电
#define TMP006_MOD        7<<12        //传感器和环境的连续转换

//Bits [11:9] CR[2:0]: ADC conversion rate
#define TMP006_CONVERSION_RATE_4        0<<9        //转换速率
#define TMP006_CONVERSION_RATE_2        1<<9
#define TMP006_CONVERSION_RATE_1        2<<9
#define TMP006_CONVERSION_RATE_0_5        3<<9
#define TMP006_CONVERSION_RATE_0_25        4<<9

//Bit [8] EN: DRDY enable bit
#define TMP006_DRDY_D        0<<8        //DRDY禁用
#define TMP006_DRDY_E        1<<8        //DRDY使能

//Bit [7] DRDY: Data ready bit
#define TMP006_DRDY_P         0<<7        //忙
#define TMP006_DRDY_R        1<<7        //
点赞  2012-7-27 10:12
//测试程序里用到了一份“MSP430_SWI2C_Master.c”库文件里MSP430的IO模拟的I2C函数

/****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Write_TMP006(unsigned char Reg_Address,unsigned char * data)
{
        unsigned char TxData[3];
       

        TxData[0]=Reg_Address;        //寄存器地址
        TxData[1]=data[0];                //寄存器值 MSB
        TxData[2]=data[1];                //寄存器值 LSB
       
        MSP430_SWI2CMST_writeBlock(TMP006_ADDRESS,3, 0,&TxData[0]);
         
}  
  /****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Read_TMP006(unsigned char Reg_Address,unsigned char *RxData )
{
        unsigned char TxData[2];  

        TxData[0]=Reg_Address;        //地址指针
        MSP430_SWI2CMST_writeBlock(TMP006_ADDRESS,1, 0,&TxData[0]);

        MSP430_SWI2CMST_readBlock(TMP006_ADDRESS,2, RxData);
}
点赞  2012-7-27 10:14
/****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Init_TMP006(void)
{
        unsigned char RxData[2],TxData[2];
        unsigned int confg=0;
        
        //写配置寄存器
        
        confg=                0x8000;
        TxData[0]=(unsigned char)(confg>>8);        //MSB
        TxData[1]=(unsigned char)confg;                        //LSB        
        Write_TMP006(CONF_REG,&TxData[0]);
        
         
        //读配置寄存器
        Read_TMP006(CONF_REG,&RxData[0]);
         
        
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
        
        //写配置寄存器
        //MSB
        confg=                TMP006_MOD        |//传感器和环境的连续转换
                                TMP006_CONVERSION_RATE_0_25        |
                                TMP006_DRDY_D;        //DRDY禁用
        TxData[0]=(unsigned char)(confg>>8);
        //LSB                        
        TxData[1]=(unsigned char)confg;               
        Write_TMP006(CONF_REG,&TxData[0]);
        
        //读配置寄存器
        Read_TMP006(CONF_REG,&RxData[0]);
        
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
        
        
        //设备ID寄存器       0067h    这里我读出来居然是0X07FF  奇怪!!!!!!!!     
       Read_TMP006(Device_ID_REG,&RxData[0]);
        
}
点赞  2012-7-27 10:15
typedef union
{
        unsigned char ucdata[2];
        unsigned int  uidata;
}_ui2uc;
float Read_TMP(void)
{
        unsigned char RxData[2] ;
        _ui2uc ui2uc;
        float temp=0;
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
       
        do
        {
                //读配置寄存器
                Read_TMP006(CONF_REG,&RxData[0]);
        }while((RxData[0]&0x08)!=0x08);
        //
        Read_TMP006(TEMPERATURE_REG,&RxData[0]);
        ui2uc.ucdata[1]=RxData[0];
        ui2uc.ucdata[0]=RxData[1];
         
       
        temp=(ui2uc.uidata>>2)*0.03125;
       
        return temp;
}
点赞  2012-7-27 10:18
测试了下 室温大概也就30左右,采集过来也差不多

不知道如何知道距离远近和温度偏差大小!!!!
d.JPG

[ 本帖最后由 蓝雨夜 于 2012-7-27 10:23 编辑 ]
点赞  2012-7-27 10:19
有使用TMP006的朋友可以交流交流!如何使它测量温度准确些呀!

[ 本帖最后由 蓝雨夜 于 2012-7-27 23:54 编辑 ]
点赞  2012-7-27 23:53

你好,我也在调试这个TMP006有问题请教!

我今天调试这个芯片的时候发现我发送器件地址的时候TMP006有应答,但是再发送寄存器地址的时候就没有应答了,读出的数据都是FF。想请教一下,您是怎么做的,我很急,希望您能帮我一下!
点赞  2012-9-5 22:09
程序接口都能知道了,没看文档呀?

小板子自己做的?我要是有这个器件,就做小一点,装在一个笔状的外壳里,这样是不是好在不同的环境位置测试?

[ 本帖最后由 wangfuchong 于 2012-9-6 06:33 编辑 ]
没工作,没女人老婆,没宽带 ,  没钱
点赞  2012-9-6 06:29

回复 9楼 孤鹜454 的帖子

//写配置寄存器
        
        confg=                0x8000;
        TxData[0]=(unsigned char)(confg>>8);        //MSB
        TxData[1]=(unsigned char)confg;                        //LSB        
        Write_TMP006(CONF_REG,&TxData[0]);
        
         
        //读配置寄存器
        Read_TMP006(CONF_REG,&RxData[0]);
         
        
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
        
        //写配置寄存器
        //MSB
        confg=                TMP006_MOD        |//传感器和环境的连续转换
                                TMP006_CONVERSION_RATE_0_25        |
                                TMP006_DRDY_D;        //DRDY禁用
        TxData[0]=(unsigned char)(confg>>8);
        //LSB                        
        TxData[1]=(unsigned char)confg;               
        Write_TMP006(CONF_REG,&TxData[0]);
        
        //读配置寄存器
        Read_TMP006(CONF_REG,&RxData[0]);
        
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
点赞  2012-9-6 08:25
先复位下看呢!
点赞  2012-9-6 08:26

回复 10楼 wangfuchong 的帖子

看了,没看懂,现在读出来的都是0x7ff。头大啊!
点赞  2012-9-6 15:28

回复 12楼 蓝雨夜 的帖子

读制造商ID也要先复位吗?
点赞  2012-9-6 20:55

回复 14楼 孤鹜454 的帖子

我就上点后,初始化时,程序对它复位下,然后在进行读写的
点赞  2012-9-6 21:21

回复 15楼 蓝雨夜 的帖子

我上电后,在配置里面直接写了0x8000,复位,然后按照手册上的时序写入地址和指针,都成功,但是到最后读出的数据都是0xFF,
SCL_out;
        SDA_out;
        SCL_H;
        
        SDA_H;
        __delay_cycles(50);
        SDA_L;
        __delay_cycles(50);
        SCL_L;
        __delay_cycles(50);
        
        uchar wdata[2]={0x80,0xfe,};
        for(int n=0;n<2;n++)
        {
        for(uint ii = 8;ii > 0;ii--)
        {
          if(wdata[n] & 0x80)SDA_H; else SDA_L;
        __delay_cycles(20);
        SCL_H;
        __delay_cycles(50);
        SCL_L;                               
        wdata[n] <<= 1;
        }
       //检测ACK
        __delay_cycles(50);
        SCL_H;
       
        SDA_in;
        __delay_cycles(50);
        while(0 != SDA_val);
        __delay_cycles(50);
        SCL_L;
        SDA_out;
        }
        //上面有效!第二次开始信号
        
         SCL_out;
        SDA_out;
        SCL_H;
        
        SDA_H;
        __delay_cycles(50);
        SDA_L;
        __delay_cycles(50);
        SCL_L;
        __delay_cycles(50);
        
        uchar wdata1=0x81;
      
        for(uint ii = 8;ii > 0;ii--)
        {
          if(wdata1 & 0x80)SDA_H; else SDA_L;
        __delay_cycles(20);
        SCL_H;
        __delay_cycles(50);
        SCL_L;                               
        wdata1 <<= 1;
        }
       //检测ACK
        __delay_cycles(50);
        SCL_H;
       
        SDA_in;
        __delay_cycles(50);
        while(0 != SDA_val);
        __delay_cycles(50);
        SCL_L;
        SDA_out;
        SDA_L;
        
        //以上是发送地址,下面是接收数据
        
        uchar  rdata = 0x00;
      //  uchar flag;
    uchar iii;
    SCL_out;
        for(iii = 0;iii < 8;iii++)
        {
               
                SCL_H;
                SDA_in;
                __delay_cycles(50);
                rdata<<=1;
                if(SDA_val) rdata|=0x01;
               
               
        
       // __delay_cycles(20);
                SCL_L;
                __delay_cycles(50);
        }
SDA_out;
这是我的一个读TMP006的代码。麻烦您帮我看看有问题吗?
点赞  2012-9-7 08:34

回复 16楼 孤鹜454 的帖子

我是直接用到了一份“MSP430_SWI2C_Master.c”库文件里MSP430的IO模拟的I2C函数

你把I2C的速率加慢试过吗?
点赞  2012-9-7 08:56

回复 17楼 蓝雨夜 的帖子

已经减的很低了,你能不能把你的那个MSP430_SWI2C_Master.c发一份给我,我没找到这个库文件啊!或这麻烦你告诉我到哪里找
点赞  2012-9-8 19:03

回复 18楼 孤鹜454 的帖子

好的!

[ 本帖最后由 蓝雨夜 于 2012-9-8 23:16 编辑 ]
点赞  2012-9-8 23:14

回复 19楼 蓝雨夜 的帖子

谢谢!请教您一个弱弱的问题,这个lib是不是所有的msp430都可以使用啊?例如我的msp430F415
点赞  2012-9-9 12:37
1234下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复