实战项目(5) MCP9600热电偶检测物体温度

一 简介

1》热电偶工作的原理:
热电偶的工作原理是两种不同成份的材质导体组成闭合回路,当两端存在温度梯度时,回路中就会有电流通过,此时两端之间就存在电动势——热电动势,这就是所谓的塞贝克效应。在温度测量中,热电偶的应用极为广泛,它具有结构简单、制造方便、测量范围广、精度高、惯性小和输出信号便于远传等优点 原理链接
2》MCP9600搭建测试环境-图片
在这里插入图片描述
当前用的是K型的检测,注意会有几种类型选择:Supported Types (designated by NIST ITS-90):

  • Type K, J, T, N, S, E, B and R
    对于在MCP9600 datasheet里面会有详细的介绍

二 实验平台

1》软件平台:基于nordic 的蓝牙nRF5_SDK_14.2.0_17b948a
2》硬件平台:主控芯片nRF52832、MCP9600器件

三 基础知识

1、主控芯片nRF52832是如何获取MCP9600检测到物体温度的?
答:
1》nRF52832通过I2C接口访问MCP9600器件,根据i2c接口时序以及器件地址、寄存器地址,从而获取相应的数据
2》nRF52832用模拟i2c代码,详细的i2c介绍原理和源代码 前面写的博客地址
不过需要修改一下延时时钟,就可以正常读取

 #define  TWI_DELAY_HRS() delay_us(10)

四 添加驱动代码

1.i2c驱动,上面已经有介绍
2.主控芯片nRF52832和MCP9600对应接线

/*****************************************
*mcp9600       nRF52832 
*I2C_SCL       P13
*I2C_SDA       P14
*VCC           VCC
*GND           GND
*ADD           GND
*ÆäËüÏß        ¿Õ
******************************/

注意:*ADD 接GND,地址为0XC0
地址默认为:不接线为0xCE [参考链接](//https://detail.tmall.com/item.htm?spm=a230r.1.14.24.6c2e20ffFtntrZ&id=612675943543&ns=1&abbucket=18)

3.添加i2c的读写函数

uint8_t TemHum_buff[2];

void I2C_writeReg(uint8_t dev_addr,uint8_t savHigaddr,uint8_t sav_lowaddr)
{
	uint8_t send_buff[2] = {0};
	send_buff[0] = savHigaddr;
	send_buff[1] = sav_lowaddr;
	
	hrs_iic_transfer(dev_addr, send_buff, 2, TWI_ISSUE_STOP);
}


void I2C_WR_data(uint8_t dev_addr,uint8_t sav_addr,
	 uint8_t rdatalen)
{
	uint8_t send_buff[1] = {0};
	send_buff[0] = sav_addr;
//	send_buff[1] = sav_lowaddr;	
	
	hrs_iic_transfer(dev_addr, send_buff, 1, TWI_DONT_ISSUE_STOP);
	hrs_iic_transfer(dev_addr|0x01, TemHum_buff, rdatalen, TWI_ISSUE_STOP);
}

4.MCP9600的初始化

void temp_init (void)
{
	hrs_iic_init(I2C_SDA,I2C_SCL);
    delay_ms(100);
	
	I2C_writeReg(0XC0,0X05,0X00);//write on this register the rest should be ok
	                             //set thermocouple to  K no filter
	I2C_writeReg(0XC0,0X06,0X00);
}

5.MCP9600的读取和计算函数

float temperature=0;
uint8_t  temperature1=0;
uint8_t MCP9600_datah=0,MCP9600_datal=0;
void temp_read(void)
{
	temp_init();
	nrf_delay_ms(100); //stretch time
	I2C_WR_data(0XC0,0X00,2);
	MCP9600_datah=TemHum_buff[0];
	MCP9600_datal=TemHum_buff[1];
	
   if ((MCP9600_datah & 0x80) == 0x80)
   { 
     temperature = (MCP9600_datah*16 + MCP9600_datal/ 16) - 4096;
   }
   else 
   {
      temperature = MCP9600_datah*16+(float) MCP9600_datal / 16.0;
   }
   
   BLE_RTT("MCP9600_datah=%d...MCP9600_datal=%d\r\n ",MCP9600_datah,MCP9600_datal);
	
   temperature1 =(uint8_t )temperature;

    BLE_RTT("temp_read=%d\r\n ",temperature1);
//	temperature = (MCP9600_datah*16) + (MCP9600_datal/16); //temperature is always > than 0 
}

直接调用 temp_read就可以读取,只是做一个简单的demo

五 实现效果

已经得到温度的变化,且正常显示,实验成功
在这里插入图片描述
可以加入QQ群:687360507
与大伙沟通交流,技术在于分享而进步

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值