snifer

[原创]ADT7312温度传感器在高炉作业室室内温度监测中的应用

0
阅读(2822)

最近这边一个钢铁公司在温度监控中用到了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引脚能够以比较器模式或中断模式工作。

产品特色

  1. 易于使用,不需要校正或校准。
  2. 低功耗。
  3. 极佳的长期稳定性和可靠性。
  4. 通过汽车应用认证。-----摘自官网

我本人参与了这个项目的部分编程工作,使用到了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       //读电源方式

bit symbol=0;                 //温度的正负号 symbol=0 为正;symbol=1 为负
sbit ADT7312_DQ=P0^2; 
unsigned char SN[8];
void Close_WDG(void); 
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);
 }
}
void Delay1us(int us)    //延时us毫秒
{
 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; 
}
//向ADT7312写一个字节ch
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;
  Delay1us(45);
  ADT7312_DQ=1;
  ch=ch>>1;
  Delay1us(1);
 } 
}
//接收ADT7312传送来的一个字节并返回
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;
}
//跳过ROM区
void skipROMCode(void)
{
 resetADT7312();
 writeByteToADT7312(SKIP_ROM);
}
//启动ADT7312的温度转化功能
void startConvertT(void)
{
 resetADT7312();  //复位
 writeByteToADT7312(SKIP_ROM);  //广播
 writeByteToADT7312(CONVERT_T);  //启动AD转换12bit700ms
}
//读取ADT7312的序列号,写入SN[]
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;
 writeByteToADT7312(READ_SRAM);
 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;
}
//读取与指定的ADT7312相匹配的温度值
unsigned int getT_matchADT7312(char ID)
{
  unsigned int T;
  int i;
 
  for(i=0;i<30000;i++);//延时等待转换结束
  resetADT7312();      //复位
  skipROMCode();
  writeByteToADT7312(CONVERT_T);
  Delay1us(2);         //2us
 
  resetADT7312();      //复位
  matchADT7312(ID);
  T=getTempValue();
  return(T);
}
//返回温度的正负号
bit getSymbol()
{
  return symbol;
}
 
如果大家有疑问可以向我交流,这过程中调试了N多个错误,感谢ADI,感谢悠悠假期,谢谢。