■ 前言

ADT7410是一款基于SOIC封装的高精度数字温度传感器。它内部具有带隙温度参考源以及13位ADC,可以提高0.0625摄氏度的温度精度。这个温度分辨率还可以改变成16位(0.0075℃)。

ADT7410可以工作在2.7V至5.5V的工作电源。工作在3.3V时,工作电流为210uA。 ADT在Shutdown模式下,耗电量仅为2uA。

ADT7410可以工作在-55℃至150℃。可被广泛 应用在医疗器械、环境监控、计算机温度检测、温度保护、工业过程控制、电源系统监测以及手持设备应用等等。

▲ ADT7410内部功能图

ADT7410通过I2C总线与MCU连接。本文通过制作基于STC8G1K08电路板,来访问四个温度传感器。

01实验电路板设计


1.MCU控制板制作1

○ 原理图设计

▲ MCU原理图

2. ADT7410芯片小板2

▲ ADT7410芯片小板

▲ ADT7410 PCB板

通过温度板的右边四个电阻,来设定温度传感器的I2C地址:A1A0。具体设置如下图所示:

▲ ADT7410地址设置通过RA1234

02MCU软件设计3


控制小板的串口命令:

else IFARG0("rt") {printf("%f ", ADT7410ReadT(0));printf("%f ", ADT7410ReadT(1));printf("%f ", ADT7410ReadT(2));printf("%f\r\n", ADT7410ReadT(3));
} else IFARG0("rtx") {printf("%04x ", ADT7410ReadTemp(0));printf("%04x ", ADT7410ReadTemp(1));printf("%04x ", ADT7410ReadTemp(2));printf("%04x\r\n", ADT7410ReadTemp(3));
} else IFARG0("rtb") {nNumber = ADT7410ReadTemp(0);SendChar((unsigned char)(nNumber >> 8));SendChar((unsigned char)(nNumber));nNumber = ADT7410ReadTemp(1);SendChar((unsigned char)(nNumber >> 8));SendChar((unsigned char)(nNumber));nNumber = ADT7410ReadTemp(2);SendChar((unsigned char)(nNumber >> 8));SendChar((unsigned char)(nNumber));nNumber = ADT7410ReadTemp(3);SendChar((unsigned char)(nNumber >> 8));SendChar((unsigned char)(nNumber));
}

▲ 上电后实验电路板

※ 结论


本文构造可以同时访问四路ADT7410温度传感器。 通过串口命令可以获得对应的温度值。

▲ 测量白炽灯泡在点亮后的温度上升

▲ 测量制冷片的温度下降过程

▲ 测量制冷片的温度上升过程

/*
**==============================================================================
** ADT7410.C:             -- by Dr. ZhuoQing, 2020-07-08
**
**==============================================================================
*///------------------------------------------------------------------------------
#define ADT7410_GLOBALS        1              // Define the global variables
#include "ADT7410.H"
#include "STC8G.H"//------------------------------------------------------------------------------//==============================================================================
//              INTERFACE FUNCTIONS
//------------------------------------------------------------------------------
void ADT7410SetAdd(unsigned char ucA10) {g_ucADT7410Add = ADT7410_I2C_ADD + (ucA10 << 1);
}//------------------------------------------------------------------------------
void ADT7410Init(unsigned char ucAdd) {ADT7410SetAdd(ucAdd);ADT7410SetConfiguration(0x80);        // Set 16 bits resolution of temperature.
}//------------------------------------------------------------------------------
float ADT7410ReadT(unsigned char ucAdd) {ADT7410SetAdd(ucAdd);ADT7410SetConfiguration(0x80);return ADT7410ReadTemperature() / 128.0;
}//------------------------------------------------------------------------------
int ADT7410ReadTemp(unsigned char ucAdd) {ADT7410SetAdd(ucAdd);ADT7410SetConfiguration(0x80);return ADT7410ReadTemperature();
}//------------------------------------------------------------------------------
float ADT7410Temperature(int nNumber) {return nNumber / 128.0;
}//------------------------------------------------------------------------------
void ADT7410WriteByte(unsigned char ucAdd, unsigned char ucByte) {I2CStart();I2CSendData(g_ucADT7410Add);I2CReceiveACK();I2CSendData(ucAdd);I2CReceiveACK();I2CSendData(ucByte);I2CReceiveACK();I2CStop();
}void ADT7410WriteInt(unsigned char ucAdd, unsigned int nNum) {I2CStart();I2CSendData(g_ucADT7410Add);I2CReceiveACK();I2CSendData(ucAdd);I2CReceiveACK();ucAdd = (unsigned char)(nNum >> 8);    I2CSendData(ucAdd);I2CReceiveACK();ucAdd = (unsigned char)(nNum);    I2CSendData(ucAdd);I2CReceiveACK();I2CStop();
}//------------------------------------------------------------------------------
unsigned char ADT7410ReadByte(unsigned char ucAdd) {unsigned char ucByte;I2CStart();I2CSendData(g_ucADT7410Add);I2CReceiveACK();I2CSendData(ucAdd);I2CReceiveACK();I2CStart();I2CSendData(g_ucADT7410Add + 1);ucByte= I2CReceiveData();I2CSendNACK();I2CStop();return ucByte;
}void ADT7410ReadDim(unsigned char ucAdd, unsigned char ucLength, unsigned char * pDim) {    unsigned char ucByte, i;I2CStart();I2CSendData(g_ucADT7410Add);I2CReceiveACK();I2CSendData(ucAdd);I2CReceiveACK();I2CStart();I2CSendData(g_ucADT7410Add + 1);I2CReceiveACK();for(i = 0; i < ucLength; i ++) {ucByte= I2CReceiveData();if(i < ucLength - 1)I2CSendACK();else I2CSendNACK();*(pDim + i) = ucByte;}I2CStop();
}//------------------------------------------------------------------------------
int ADT7410ReadTemperature(void) {unsigned char ucBytes[2];int nValue;ADT7410ReadDim(0x0, 2, ucBytes);
//    ucBytes[0] = ADT7410ReadByte(0);
//    ucBytes[1] = ADT7410ReadByte(1);nValue = ucBytes[0];nValue = (nValue << 8) | ucBytes[1];return nValue;
}unsigned char ADT7410ReadStatus(void) {unsigned char ucChar;ucChar = ADT7410ReadByte(ADT7410_STATUS_ADD);return ucChar;
}unsigned char ADT7410ReadConfiguration(void) {unsigned char ucChar;ucChar = ADT7410ReadByte(ADT7410_CONFIGURATION_ADD);return ucChar;
}void ADT7410SetConfiguration(unsigned char ucConfiguration) {ADT7410WriteByte(ADT7410_CONFIGURATION_ADD, ucConfiguration);
}unsigned char ADT7410ReadID(void) {unsigned char ucChar;ucChar = ADT7410ReadByte(ADT7410_ID_ADD);return ucChar;
}void ADT7410SoftwareReset(void) {ADT7410WriteByte(ADT7410_RESET_ADD, 0xaa);
}void ADT7410SetHysteresisTemperature(unsigned char ucHysteresis) {ADT7410WriteByte(ADT7410_THYST_ADD, ucHysteresis);
}void ADT7410SetHighTemperature(int nT) {ADT7410WriteInt(ADT7410_THIGH_ADD, nT);
}void ADT7410SetLowTemperature(int nT) {ADT7410WriteInt(ADT7410_TLOW_ADD, nT);
}void ADT7410SetCriticalTemperature(int nT) {ADT7410WriteInt(ADT7410_TCRIT_ADD, nT);
}int ADT7410ReadHighTemperature(void) {unsigned char ucBytes[2];int nValue;ADT7410ReadDim(ADT7410_THIGH_ADD, 2, ucBytes);nValue = ucBytes[0];nValue = (nValue << 8) | ucBytes[1];return nValue;
}int ADT7410ReadLowTemperature(void) {unsigned char ucBytes[2];int nValue;ADT7410ReadDim(ADT7410_TLOW_ADD, 2, ucBytes);nValue = ucBytes[0];nValue = (nValue << 8) | ucBytes[1];return nValue;
}
int ADT7410ReadCritialTemperature(void) {unsigned char ucBytes[2];int nValue;ADT7410ReadDim(ADT7410_TCRIT_ADD, 2, ucBytes);nValue = ucBytes[0];nValue = (nValue << 8) | ucBytes[1];return nValue;
}unsigned char ADT7410ReadHysteresisTemperature(void) {return ADT7410ReadByte(ADT7410_THYST_ADD);
}//==============================================================================
//                END OF THE FILE : ADT7410.C
//------------------------------------------------------------------------------
/*
**==============================================================================
** ADT7410.H:            -- by Dr. ZhuoQing, 2020-07-08
**
**  Description:
**
**==============================================================================
*/
#ifndef __ADT7410__
#define __ADT7410__
//------------------------------------------------------------------------------
#ifdef ADT7410_GLOBALS#define ADT7410_EXT
#else#define ADT7410_EXT extern
#endif // ADT7410_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================//------------------------------------------------------------------------------#define ADT7410_I2C_ADD                   0x90ADT7410_EXT unsigned char g_ucADT7410Add;
void ADT7410SetAdd(unsigned char ucA10);float ADT7410Temperature(int nNumber);//------------------------------------------------------------------------------
float ADT7410ReadT(unsigned char ucAdd);
int ADT7410ReadTemp(unsigned char ucAdd);//==============================================================================
//              INTERFACE FUNCTIONS
//------------------------------------------------------------------------------
void ADT7410Init(unsigned char ucA10);void ADT7410WriteByte(unsigned char ucAdd, unsigned char ucByte);
void ADT7410WriteInt(unsigned char ucAdd, unsigned int nNum);unsigned char ADT7410ReadByte(unsigned char ucAdd);
void ADT7410ReadDim(unsigned char ucAdd, unsigned char ucLength, unsigned char * pDim);//------------------------------------------------------------------------------#define ADT7410_TEMPERATURE_ADD          0x0
#define ADT7410_STATUS_ADD          0x2
#define ADT7410_CONFIGURATION_ADD       0x3
#define ADT7410_THIGH_ADD           0x4
#define ADT7410_TLOW_ADD            0x6
#define ADT7410_TCRIT_ADD               0x8
#define ADT7410_THYST_ADD           0xA
#define ADT7410_ID_ADD              0x0B
#define ADT7410_RESET_ADD           0x2F//------------------------------------------------------------------------------
int ADT7410ReadTemperature(void);
unsigned char ADT7410ReadStatus(void);
unsigned char ADT7410ReadConfiguration(void);
void ADT7410SetConfiguration(unsigned char ucConfiguration);
unsigned char ADT7410ReadID(void);
void ADT7410SoftwareReset(void);
void ADT7410SetHysteresisTemperature(unsigned char ucHysteresis);
void ADT7410SetHighTemperature(int nT);
void ADT7410SetLowTemperature(int nT);
void ADT7410SetCriticalTemperature(int nT);
int ADT7410ReadHighTemperature(void);
int ADT7410ReadLowTemperature(void);
int ADT7410ReadCritialTemperature(void);unsigned char ADT7410ReadHysteresisTemperature(void);//==============================================================================
//             END OF THE FILE : ADT7410.H
//------------------------------------------------------------------------------
#endif // __ADT7410__

  1. MCU控制板AD工程文件:AD\Test\2020\Tools\ADT7410STC8G1k.SchDoc * ↩︎

  2. ADT7410印刷电路板设计工程文档:AD\Test\2020\Tools\ADT7410MOD.SchDoc ↩︎

  3. STC8G 工程文件:C51\STC\Test\2020\Tools\ADT7410STC8G1K\ADT7410STC8G1K.uvproj ↩︎

ADT7410 ±0.5℃精度温度传感器相关推荐

  1. 是否显示展开_Creo7.0教程之绝对精度对钣金件展开的作用详解

    在讲Creo7.0绝对精度对钣金展开的帮助之前,我们有必要先来说明一下Creo的精度定义. 刚使用Creo7.0版本的新建模型,很多网友就问,怎么模板文件中有两个同样单位的选择,"abs&q ...

  2. Google 全国 地图 纠偏数据 偏移数据 超高精度(0.002) (纠偏、偏移、地图、数据)

    特别注明,csv数据文件条数众多,如果使用excel打开请使用office 2007及以上版本,否则显示不全(个人建议使用记事本打开,现在的计算机打开十几MB的文本文件 时间还算可以接受) 取值间隔  ...

  3. 基于Stm32f103硬件iic驱动LM75A温度传感器

    这是LM75A温度传感器的概述,本文主要介绍基于Stm32f103的硬件iic驱动LM75A温度传感器. 这是我所使用的硬件电路,很简单. 对于该传感器的使用,主要是读取温度值,查看数据手册我们知道需 ...

  4. Arduino驱动LM35温度传感器自制温度计

    Arduino驱动LM35温度传感器自制温度计 前言 一.硬件部分 二.电气参数 三.原理说明 四.实验操作 1.接线 2.程序驱动 五.实验结果 六.总结 前言 现实生活中的许多场景都需要测量温度. ...

  5. 放大器的传递函数_对数放大器和温度传感器结合的设计温度补偿方案

    精确的RF 功率管理是现代无线发射器的热点话题,从基站的功率放大器 保护到移动应用中的延长电池 使用时间,它都有很多的优点.RF功率监测器,比如对数放大器 ,允许RF功率测量 系统在一个较宽的范围监控 ...

  6. Google提出移动端新SOTA模型MixNets:用混合深度卷积核提升精度

    作者 | Google 译者 | 刘畅 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) [导语]目前,深度卷积(Depthwise convolution)在追求高性能的卷积 ...

  7. java类型精度排序,Java中BigDecimal精度和相等比较的坑

    为什么要有bigdecimal ,他是干什么的 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计 ...

  8. Java中float类型精度问题

    今天发现了一个小的问题,在网上找了说的不多,在这记录下来方便自己和比人解决自己的问题吧. 代码片段 1float unit = Double.valueOf(ActionUtils.getBillin ...

  9. bigdecimal 和负数比较_Java中BigDecimal精度和相等比较的坑

    为什么要有BigDecimal ,他是干什么的 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计 ...

最新文章

  1. 10月机器学习开源项目Top10
  2. 成考高起专计算机统考试题,成考考试题型
  3. Nginx+PHP-FPM——Nginx日志:[Primary script unknown] 网页:[file not found. ]解决方案
  4. 玩linux笔记——持续更新
  5. 程序员编程必备名言佳句,提升装逼指数~
  6. 钱线观察:货币基金T+0驾到 活期存款将死?
  7. 对扩展openflow协议的一点思考
  8. Spcomm使用属性及用法详解
  9. Kubernetes集群部署1
  10. Linux下MongoDB副本集搭建(主--从--仲裁模式)
  11. 汽车编程都是用matlab,MATLAB编程与汽车仿真应用
  12. asp.net mvc 发布问题
  13. 盘点10种局域网联机游戏
  14. Mysql安装后环境变量配置
  15. x86 单线并发多拨_基本上,单线多拨配置成功
  16. 【博文笔记】Attentive Reader\Impatient Reader:机器阅读理解之开山之作Teaching Machines to Read and Comprehend
  17. sql grop by having order by 的用法
  18. ogg19.1.0.0.4打补丁
  19. springboot+vue社区维修平台(源码+文档)
  20. ISDP_ch10ch11问题汇总

热门文章

  1. 从风投那里得到了了 $100W 的种子期投资且已到账,我该如何组建公司及团队?...
  2. ArrayList和LinkedList区别
  3. ipmsg 绑定tcp错误
  4. Spring系列之Spring框架和SpringAOP集成过程分析(十)
  5. 自定义AlertView
  6. java获得项目绝对路径
  7. Linux内存管理【转】
  8. 解读《信息系统灾难恢复规范》---转
  9. Ril分析五——ril学习总结
  10. Linux下安装、配置PHP环境