EMC1402 温度传感器的配置
这里介绍一下 EMC1402 温度传感器的配置方法:单片机用的是STM32F103
1.首先简单的介绍一下这款温度传感器的硬件连接,如下图所示:
该 EMC1402 不仅可以感应自身的周围的温度,还可以扩展通过 DP、DN和外部CPU连接,测量外部的CPU温度。
- EMC1402 有两种温度范围 ,一种是标准的0 - 127.875,另一种是扩展的温度范围:-64 - + 191.875. 通过配置寄存器的 B2 进行配置,如下图所示:
3. EMC1402 的温度值,存储在温度数据寄存器里,高位存储温度值的整数,低位存储温度值的小数。 地址: 00h 和 29h 存储的是 EMC1402 的内部温度值,00h 存储温度值的整数, 29h 存储温度值的小数。 地址: 01h 和 10h 存储的是和 EMC1402连接 的外部CPU的温度值,01h 存储温度值的整数, 10h 存储温度值的小数。如下图所示:
4. EMC1402 的温度值的存储格式,计算方式如下:
1)标准格式:存储的是实际温度。
温度值 = 整数 + 分数 >> 5 * 0.125
2)扩展格式:存储的温度
if(Integer_Date < 64)
{
Temperature_Date = -(64 - Integer_Date + ((Fractional_Date >>5) * 0.125));
}
else
{
Temperature_Date = (float)Integer_Date - 64 + ((Fractional_Date >>5) * 0.125);
}
如图所示:
配置为标准的温度模式,代码的配置如下:
/*
- 函 数 名: EMC1402_InitSet(void)
- 功能说明: 设置 EMC1402 温度传感器的温度范围:0°C - 127.875°C
- 形 参:无
- 返 回 值: 无
*/
void EMC1402_InitSet(void)
{
uint8_t EMC1402_Config_Status = 0;
IIC_Init();
iic_write(IIC_ADDRESS,0x03,0x00);
EMC1402_Config_Status = iic_read(IIC_ADDRESS,0x03);
EMC1402_Config_Status &= 0xFB;
iic_write(IIC_ADDRESS,0x03,EMC1402_Config_Status);
}
/*
- 函 数 名: Internal_Temperature(void)
- 功能说明: 获取 EMC1402 内部温度传感器的温度(温度范围:0°C - 127.875°C )
- 形 参:无
- 返 回 值: 温度值
/
float Internal_Temperature(void)
{
uint8_t Integer_Date = 0;
uint8_t Fractional_Date = 0;
float Temperature_Date = 0;
Integer_Date = iic_read(IIC_ADDRESS,0x00);
Fractional_Date = iic_read(IIC_ADDRESS,0x29);
Temperature_Date = (float)Integer_Date + ((Fractional_Date >>5) * 0.125);
return Temperature_Date;
}
配置为扩展的温度模式,代码的配置如下:
/
- 函 数 名: EMC1402_InitExternSet(void)
- 功能说明: 设置 EMC1402 温度传感器的温度范围:-64°C - +191.875°C
- 形 参:无
- 返 回 值: 无
*/
void EMC1402_InitExternSet(void)
{
uint8_t EMC1402_Config_Status = 0;
IIC_Init();
iic_write(IIC_ADDRESS,0x03,0x00);
EMC1402_Config_Status = iic_read(IIC_ADDRESS,0x03);
EMC1402_Config_Status |= 0x04;
iic_write(IIC_ADDRESS,0x03,EMC1402_Config_Status);
}
/*
- 函 数 名: Internal_TemperatureExtern(void)
- 功能说明: 获取 EMC1402 内部温度传感器的温度(温度范围:-64°C - +191.875°C )
- 形 参:无
- 返 回 值: 温度值
*/
float Internal_TemperatureExtern(void)
{
uint8_t Integer_Date = 0;
uint8_t Fractional_Date = 0;
float Temperature_Date = 0;
Integer_Date = iic_read(IIC_ADDRESS,0x00);
Fractional_Date = iic_read(IIC_ADDRESS,0x29);
if(Integer_Date < 64)
{
Temperature_Date = -(64 - Integer_Date + ((Fractional_Date >>5) * 0.125));
}
else
{
Temperature_Date = (float)Integer_Date - 64 + ((Fractional_Date >>5) * 0.125);
}
return Temperature_Date;
}