[原创]ADT7312温度传感器在高炉作业室室内温度监测中的应用
0赞最近这边一个钢铁公司在温度监控中用到了ADI最新出的ADT7312,价格不是很贵,我把这款芯片给大家介绍一下,
ADT7312是一款±1°C精度的数字温度传感器,可在−55°C至+175°C的极宽温度范围内工作,仅提供裸片形式。该器件含有一个内置带隙基准电压源、一个温度传感器和一个16位模数转换器(ADC),用于监控温度并进行数字转换,分辨率为0.0078°C。默认ADC分辨率设置为13位(0.0625°C)。ADC分辨率为用户可编程模式,可通过串行接口更改。
ADT7312的保证工作电压范围为2.7 V至5.5 V;工作电压为3.6 V时,平均电源电流的典型值为245 μA。ADT7312具有关断模式,可关断器件,3.6 V时的关断电流典型值为2.5 μA。ADT7312的额定工作温度范围为−55°C至+175℃。
CT引脚属于开漏输出,当温度超过临界温度限值(可编程)时,该引脚变为有效。默认临界温度值为147°C。INT引脚也属于开漏输出,当温度超过限值(可编程)时,该引脚变为有效。INT和CT引脚能够以比较器模式或中断模式工作。
产品特色
- 易于使用,不需要校正或校准。
- 低功耗。
- 极佳的长期稳定性和可靠性。
- 通过汽车应用认证。-----摘自官网
我本人参与了这个项目的部分编程工作,使用到了C8051F020作为处理单片机,下面我写一下这个程序,给大家参考一下:
程序如下,为了方便大家阅读,我把标注写的非常详细:
#include "c8051f020.h"
#include "stdio.h"
#include "intrins.h"
#define READ_ROM 0x33 //读ROM
#define MATCH_ROM 0x55 //匹配ROM
#define SKIP_ROM 0xcc //跳过ROM
#define SEARCH_ROM 0xf0 //搜索ROM
#define ALARM_SEARCH 0xec //ROM发出警告
#define CONVERT_T 0x44 //启动温度转化
#define READ_SRAM 0xbe //读暂存存储器
#define WRITE_SRAM 0x4e //写暂存存储器
#define COPY_SRAM 0x48 //拷贝暂存存储器内容
#define RECALL_E2RAM 0xb8 //重新调用E2RAM
#define READ_POWER 0xb4 //读电源方式
sbit ADT7312_DQ=P0^2;
unsigned char SN[8];
void SYSCLK_Init(void);
void UART1_Init(void); //函数说明见LED实验
void DispLED(char *DispBuf,char ShowDot); //函数说明见LED实验
void startConvertT(void);
unsigned int getT_matchADT7312(char ID);
bit getSymbol();
void readSN(unsigned char SN[]);
void main(void)
{
long temperature=0;
unsigned int feedbackT;
unsigned char led[6];
bit sign;
int i;
Close_WDG();//关闭看门狗
SYSCLK_Init();//系统时钟初始化
UART1_Init();//串口初始化
readSN(SN); //读取ADT7312序列号,写入SN[]
while(1)
{
temperature=0;
for(i=0;i<40;i++)
{
startConvertT(); //开始温度转换
feedbackT=getT_matchADT7312(0);//获取温度值
sign =getSymbol();//获取温度的正、负
if(sign)
temperature -=feedbackT;
else
temperature +=feedbackT;
}
sprintf(led,"%6d",(int)(temperature/40));
DispLED(led,3);
}
{
while (us)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
--us;
}
}
//返回: 0-有设备连接 1-无设备连接
bit resetADT7312(void)
{
unsigned char i;
bit RstFlag;
RstFlag=1;
ADT7312_DQ=0;
Delay1us(600);
ADT7312_DQ=1;
Delay1us(60); //15us-60us
for (i=0;i<16;i++) //60us-240us
{
Delay1us(15);
if (ADT7312_DQ==0) RstFlag=0;
}
Delay1us(240); //240us
return RstFlag;
}
void writeByteToADT7312(unsigned char ch)
{
unsigned char i;
ADT7312_DQ=1;
Delay1us(1);
for (i=0;i<8;i++)
{
ADT7312_DQ=0;
Delay1us(15);
ADT7312_DQ=ch&0x1;
ADT7312_DQ=1;
ch=ch>>1;
Delay1us(1);
}
}
unsigned char readByteFromADT7312(void)
{
unsigned char i,ch;
ch=0;
ADT7312_DQ=1;
Delay1us(1);
for (i=0;i<8;i++)
{
ADT7312_DQ=0;
Delay1us(10);
ADT7312_DQ=1;
Delay1us(2);
ch=ch>>1;
if (ADT7312_DQ==1)
{
ch=ch+0x80;
}
Delay1us(45);
}
return ch;
}
void skipROMCode(void)
{
resetADT7312();
writeByteToADT7312(SKIP_ROM);
}
void startConvertT(void)
{
writeByteToADT7312(SKIP_ROM); //广播
writeByteToADT7312(CONVERT_T); //启动AD转换12bit700ms
}
void readSN(unsigned char SN[])
{
char i;
while(resetADT7312());
writeByteToADT7312(READ_ROM); //读取ROM
for(i=0;i<8;i++)
{
SN[i]=readByteFromADT7312();
}
}
void matchADT7312(char ID)
{
unsigned char i;
writeByteToADT7312(MATCH_ROM); //匹配ROM
for ( i = 0; i < 8; i++ )
writeByteToADT7312(SN[ID][i]);
}
unsigned int getTempValue(void)
{
unsigned char low,high;
unsigned int T;
low=readByteFromADT7312();
high=readByteFromADT7312();
T =low+high*256;
if((high & 0xf8)!=0)
symbol=1;
else symbol=0;
if(symbol) //温度为负
T =-T;
T =T&0x07ff;
T =(T/16.0)*100;
return T;
}
unsigned int getT_matchADT7312(char ID)
{
unsigned int T;
int i;
for(i=0;i<30000;i++);//延时等待转换结束
skipROMCode();
writeByteToADT7312(CONVERT_T);
Delay1us(2); //2us
resetADT7312(); //复位
matchADT7312(ID);
T=getTempValue();
return(T);
}
bit getSymbol()
{
return symbol;
}
如果大家有疑问可以向我交流,这过程中调试了N多个错误,感谢ADI,感谢悠悠假期,谢谢。