项目经验:TMP100温度传感器设计全过程
扫描二维码
随时随地手机看文章
网站:bbs.21ic.com
供电电压:2.7V~5V
接口类型:I2C
分辨率:9 bit to 12 bit
工作温度:-40℃~125℃
工作电流:150uA
[size=14.0000pt]你如果需要低功耗的话,直接初始化为9bit,关断模式。关断模式就是采集转换一次温度数据之后,传感器自动进入cut down模式。
[size=13.3333px]uint8 TMP100_init(void)
[size=13.3333px]{
[size=13.3333px] I2CStart(); //启动I2C总线
[size=13.3333px]
[size=13.3333px] I2CWriteByte(slaveaddr); //发送从器件地址 90 写寄存器
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CWriteByte(0x01); //发送配置寄存器地址0x01
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CWriteByte(0x01); //写配置寄存器0x81???? 0x01 设置为关断模式 读9bit
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CStop();
[size=13.3333px] return 1;
[size=13.3333px]}
然后每次读就转换一次,这样功耗是非常低的。
[size=13.3333px]uint8 Read_TMP100(void)
[size=13.3333px]{
[size=13.3333px] volatile uint8 tempH,tempL;
[size=13.3333px] uint8 i=0;
[size=13.3333px] uint8 Tmp[2];
[size=13.3333px] /*--设置温度探头寄存器--*/
[size=13.3333px] I2CStart(); //启动I2C总线
[size=13.3333px]
[size=13.3333px] I2CWriteByte(slaveaddr); //发送从器件地址 90 写寄存器
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CWriteByte(0x01); //发送配置寄存器地址0x01
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CWriteByte(0x81); //写配置寄存器0x81???? 0x81 设置为读9bit
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CStop();
[size=13.3333px]
[size=13.3333px] /*--开始读取数据操作--*/
[size=13.3333px] I2CStart(); //启动I2C总线
[size=13.3333px] //I2CWriteByte(slaveaddr+1); //发送从器件地址
[size=13.3333px] I2CWriteByte(slaveaddr); //发送从器件地址
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] I2CWriteByte(0x00); //读取温度寄存器
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px]
[size=13.3333px]///**********************等待转换完毕**************************/
[size=13.3333px] DelayMCU_ms(40);
[size=13.3333px]
[size=13.3333px]/***********************读取温度***************************/
[size=13.3333px] I2CStart();
[size=13.3333px]
[size=13.3333px] I2CWriteByte(slaveaddr+1); //读取温度寄存器
[size=13.3333px] if(I2CWaitACK()==0) //从地址无响应
[size=13.3333px] {
[size=13.3333px] return 0;
[size=13.3333px] }
[size=13.3333px] tempH = I2CReadByte(); //读取温度高字节
[size=13.3333px] I2CSendAck();
[size=13.3333px]
[size=13.3333px] tempL = I2CReadByte(); //读取低字节
[size=13.3333px] I2CSendNoAck();
[size=13.3333px]
[size=13.3333px] I2CStop();
[size=13.3333px]// RealTemp = (int16)(((uint16)tempH<<8)+tempL);
[size=13.3333px] RealTemp = (int16)(((uint16)tempH<<3)+((tempL>>7)*4));
[size=13.3333px] return 1;
[size=13.3333px]}
待机功耗确实非常低,官方标称的0.1uA,确实是的,不需要另外加电源控制了。
[size=10.5000pt]
本文系21ic论坛网友laocuo1142原创
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!