一 简介
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
与大伙沟通交流,技术在于分享而进步