搜索
bottom↓
回复: 10

霍尼韦尔HIH6131温湿度传感器,取数据慢还取不到数,什么鬼

[复制链接]

出0入0汤圆

发表于 2017-4-21 15:53:29 | 显示全部楼层 |阅读模式
霍尼韦尔HIH6131温湿度传感器 是I2C接口温湿度传感器

霍尼韦尔给我提供过二次样品,一次是HIH6131-021-001S ,一次是HIH6130-021-001S  这个的区别就是一个带过滤器,一个不带,,,实验测试都是OK的。。。

现在小批量买了200个,HIH6131-021-001 , 和上面的HIH6131-021-001S 的区别就是包装不同。。。

奇怪的问题来了,批量买回来的,读数怎么都是最大值3FFF...我换上样品,又是正常的。。。检查了二天,才发现读数据时间间隔在300ms以下,能正确读回数据,,超过300ms肯不行,300ms是个临界点,有时能读上来,有时读不上来

而换上提供给我的样品,随便读,想什么时候读就什么时候读,都可以读上来


有知道原因的朋友吗?请教了!(我浏览器今天不知道怎么上传不了附件,数据手册大家可自己查一下)


阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-4-21 18:23:19 | 显示全部楼层
这个价格是多少?对焊接要求高嘛。我使用过SHT21,人家对读取时间做出要求,不同的精度有不同的转换时间,过快造成数据不正确,或者死机都有。但你这种从未遇到过

出0入0汤圆

 楼主| 发表于 2017-4-22 12:27:57 | 显示全部楼层
mii 发表于 2017-4-21 18:23
这个价格是多少?对焊接要求高嘛。我使用过SHT21,人家对读取时间做出要求,不同的精度有不同的转换时间, ...

价格和SHT10差不多,,,

头大,一般读快了出问题,这货,读慢了出问题,,。。星期一上班找霍尼韦尔问问,,为什么样品用的没事,供货的却不行

出0入0汤圆

 楼主| 发表于 2017-4-24 10:54:34 | 显示全部楼层
本帖最后由 zuu0 于 2017-4-24 10:55 编辑

有没有人要试一下,就一个IIC, 实在找不到问题了,用STC玩,,免费提供几片传感器

搞不定我就重新换回SHT10了

出0入4汤圆

发表于 2017-4-24 11:26:15 | 显示全部楼层
没有问题,,,

出0入4汤圆

发表于 2017-4-24 11:27:03 | 显示全部楼层
应该是你代码问题,13年就开始使用,高温高湿高粉尘

出0入0汤圆

 楼主| 发表于 2017-4-25 10:13:24 | 显示全部楼层
clesun 发表于 2017-4-24 11:27
应该是你代码问题,13年就开始使用,高温高湿高粉尘

代码搞几天没找到有什么问题,,用提供给我的样品,没有问题,用给我供货的就是不行,,读取速度慢了,数据始终是最大,

可否上一份你的代码我对比一下

下面这个是代码是霍尼韦尔发给我的测试代码: 和我自己写的代码也是一样的情况,我自己代码用在很多芯片上还都没出现过这情况

这个芯片测试起来一直不顺手,按理说状态位应该为0,但从我这一直是1,不管数据正不正确,都没出现过0


void delay(unsigned char c)
{
   unsigned char x,y;
   for(x=c; x>0; x--)
   for(y=5; y>0; y--)
   ;
}

void i2c_start()
{
  sda=1;
  delay(1);
  scl=1;
  delay(1);
  sda=0;
  delay(1);
  scl=0;
  delay(1);
}

void i2c_stop()
{
  sda=0;
  delay(1);
  scl=1;
  delay(1);
  sda=1;
}
void i2c_ack()
{
  sda=0;
  delay(1);
  scl=1;
  delay(1);
  scl=0;
  sda=1;
}
void i2c_nack()
{
  sda=1;
  scl=1;
  delay(1);
  scl=0;
  sda=0;
}
void i2c_readack()
{
  unsigned char i;
  scl=1;
  delay(1);
  while ((sda==1)&&i<250) i++;
  scl=0;
  delay(1);  
}

void i2c_write(unsigned char addr)     //i2c communication to write address of sensor plus one w/r bit.
{
  
unsigned char i;
  unsigned char writedata;
  writedata=addr;
  for(i=0; i<8; i++)                  
   {
         scl=0;
    delay(1);
    writedata=writedata<<1;
    sda=CY;
    delay(1);
    scl=1;
    delay(1);
    scl=0;
    delay(1);      
    }
  sda=1;
  delay(1);
}

unsigned char i2c_read()             //i2c communication to read one byte
{
        unsigned char i;
        unsigned char readbit;
        unsigned char readbyte;
   scl=0;
   delay(1);
   sda=1;
   delay(1);
   for(i=0; i<8; i++)               
    {
     scl=1;
     delay(1);
     readbit=sda;
     readbyte=(readbyte<<1)|readbit;
     scl=0;
     delay(1);
    }
   return readbyte;
}

unsigned char fetch_humidity_temperature(unsigned int *p_H_dat, unsigned int *p_T_dat)
{
        unsigned char Hum_H, Hum_L, Temp_H, Temp_L, _status;
        unsigned int H_dat, T_dat;
       
        i2c_start();                                         //Measurment requestR
        i2c_write(0x4e);                                     //Write sensor address + WRITE "0" bit to SDA line
        i2c_readack();            
        i2c_stop();
        delay(100);

        i2c_start();
        i2c_write(0x4f);                                     //write sensor address + READ "1" bit to SDA line
        i2c_readack();
        delay(1);
        Hum_H=i2c_read();                                    //read first byte
        i2c_ack();                                                 
        Hum_L=i2c_read();                               //read second byte                  
        i2c_ack();
        Temp_H =i2c_read();                               //read third byte
        i2c_ack();
        Temp_L =i2c_read();                              //read fourth byte
        delay(1);
        i2c_nack();
        delay(1);
        i2c_stop();

        _status = (Hum_H >> 6) & 0x03;         
        Hum_H = Hum_H & 0x3f;          
        H_dat = (((unsigned int)Hum_H) << 8) | Hum_L;  
        T_dat = (((unsigned int)Temp_H) << 8)| Temp_L;       
        T_dat = T_dat >> 2;                  
        *p_H_dat = H_dat;          
        *p_T_dat = T_dat;       
        return(_status);
}

出0入0汤圆

发表于 2017-4-25 14:10:08 来自手机 | 显示全部楼层
估计是没有l'初始化,印象中sht10 需要用溶液初始化的,可能这个也需要

出0入0汤圆

 楼主| 发表于 2017-4-25 15:22:12 | 显示全部楼层
fhqiplj 发表于 2017-4-25 14:10
估计是没有l'初始化,印象中sht10 需要用溶液初始化的,可能这个也需要

sht10不用的,,这个搞不好,我就用回sht10了。

出0入0汤圆

 楼主| 发表于 2017-4-25 17:34:08 | 显示全部楼层
有兴趣的同志们可以帮忙研究一下

自认为IIC程序写的还可以。。。比较通用,,我也一直在用的。。


传感器资料

有兴趣的朋友,免费提供几片样品玩。。我打算用回SHT10

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-5-2 11:11:59 | 显示全部楼层
clesun 发表于 2017-4-24 11:27
应该是你代码问题,13年就开始使用,高温高湿高粉尘

大师,看看操作有没有错啊


uint8 I2C_Read_nByte(uint8 I2C_ID,uint8 *Rbuf,uint8 numberBytes)
{
        uint8 retry=0,temp=0,i;
        do
        {
                 I2C_Start();
                I2C_Send_Byte(I2C_ID);//0x4E
                temp=I2C_Wait_Ack();
                if(temp==FALSE)                                //ÎÞÓ¦´ð£¬Í£Ö¹£¬Öظ´
                {
                        I2C_Stop();
                }       
                if(++retry>10)                                //Öظ´10´Î£¬ÈÔÈ»ÎÞÓ¦´ð£¬Í˳ö£¬Æ÷¼þÓÐÎÊÌâ
                {               
                        nAck=0xf1;                                        //nAck=0xf1·¢ËÍI2CµØÖ·ÎÞÓ¦´ð £¨Ð´£©I2CÓ²¼þÎÊÌ⣺Æ÷¼þæ/Æ÷¼þËð»µ/µç·´íÎó               
                        return FALSE ;
                }                               
        }while(temp==FALSE);
        I2C_Stop();
       
       
        Delay_ms(5);          //±£³Ö 3--10ms
       
        retry=0;
        do
        {
                 I2C_Start();
                I2C_Send_Byte(I2C_ID|I2C_READ);//0x4F
                temp=I2C_Wait_Ack();
                if(temp==FALSE)        I2C_Stop();
                if(++retry>10)
                {
                        nAck=0xe1;         //nAck=0xe1·¢ËÍI2CµØÖ·ÎÞÓ¦´ð £¨¶Á£©Æ÷¼þæ
                        return FALSE ;
                }                                         
        }while(temp==FALSE);
       
        for(i=0;i<numberBytes-1;i++)
        {
                 Rbuf=I2C_Get_Byte(Ack);
        }
        Rbuf=I2C_Get_Byte(NAck);       
        I2C_Stop();
       
        return TRUE;
}



延时5ms后





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 05:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表