반응형
안녕하세요. 소나무기운입니다.
오늘은 열전대 온도센서에 대해서 알아보지요.
열전대, 열전상, Thermocouple 등 여러가지로 불리웁니다.
다른건 잘 이해하는데 이건 참 이해가 안되더라구요.
써머커플 타입은 K,J,T,N,S,E,B,R 이있어요. 측정하는 온도대역이 다릅니다.
셧다운 커런트가 2uA
20-lead MQFN
2.7V to 5.5V
이칩에 대한 정보를 찾으면 섭씨 온도가 바로 나온다는 말을 많이 하네요.
마이크로칩에서 제공하는 소스코드가 있습니다.
ww1.microchip.com/downloads/en/DeviceDoc/MCP9600_lib_v1_1_0.zip
간단 예제와 라이브러리가 있습니다.
그냥 쉽게 이해되지는 않더군요.
한번 보시죠.
제가 추가한 부분입니다.
MCP9600_GetStatus(i2cParams, &pdevice_status);
if (pdevice_status.tH_update == 1)
{
MCP9600_GetHotJuncTemperature(i2cParams, &fTemp);
// clear status
pdevice_status.input_range_OC = 0;
pdevice_status.SC = 0;
pdevice_status.tH_update = 0;
pdevice_status.burst_compl = 0;
MCP9600_SetStatus(i2cParams, pdevice_status);
}
주기적으로 상태를 읽고 변환이 완료 되어 tH_update가 1이되면
Hotjunc 온도값을 읽어드립니다.
섭시온도가 float형으로 넘어옵니다.
읽고 난 후에는 레지스터를 클리어 해 줍니다.
라이브러리는 많이 복잡해요.
이정도만 있으면 온도 읽는 것은 충분합니다.
//=============================================================================
uint8_t MCP9600_SetStatus(MCP9600_i2c_params i2cParams, MCP9600_status device_status)
{
uint8_t errorCode = MCP9600_NO_ERROR;
uint8_t data[2];
void *pdata;
data[0] = MCP9600_REGADDR_STATUS;
pdata = &device_status;
data[1] = *((uint8_t *)pdata);
data[1] = data[1] & 0xC0;
errorCode = MCP9600_Write(i2cParams, data, sizeof(data));
return errorCode;
}
//=============================================================================
uint8_t MCP9600_GetStatus(MCP9600_i2c_params i2cParams, PMCP9600_status pdevice_status)
{
uint8_t registerPointer;
uint8_t errorCode = MCP9600_NO_ERROR;
registerPointer = MCP9600_REGADDR_STATUS;
errorCode = MCP9600_Write(i2cParams, ®isterPointer, sizeof(registerPointer));
if (errorCode != MCP9600_NO_ERROR)
{
return errorCode;
}
//step2 - read from device register
errorCode = MCP9600_Read(i2cParams, (uint8_t *)pdevice_status, sizeof(MCP9600_status));
return errorCode;
}
//=============================================================================
uint8_t MCP9600_GetHotJuncTemperature(MCP9600_i2c_params i2cParams, float *temperature)
{
int16_t reg_value;
uint8_t errorcode = MCP9600_NO_ERROR;
float temp;
errorcode = MCP9600_GetHotJuncTempRegister(i2cParams, ®_value);
if (errorcode != MCP9600_NO_ERROR)
{
*temperature = 0;
return errorcode;
}
temp = (float)reg_value;
*temperature = temp / 16;
return errorcode;
}
//=============================================================================
#if defined(I2C_FSERV_ENABLED)
uint8_t MCP9600_Write(MCP9600_i2c_params i2cParams, uint8_t *pdata, uint8_t length)
{
uint8_t errorCode = MCP9600_NO_ERROR;
i2c_writeNBytes(i2cParams.i2cAddress, pdata, length);
errorCode = MCP9600_NO_ERROR;
return errorCode;
}
//=============================================================================
uint8_t MCP9600_Read(MCP9600_i2c_params i2cParams, uint8_t *pdata, uint8_t length)
{
uint8_t errorCode = MCP9600_NO_ERROR;
//read the register value
i2c_readNBytes(i2cParams.i2cAddress, pdata, length);
errorCode = MCP9600_NO_ERROR;
return errorCode;
}
#endif // defined(I2C_FSERV_ENABLED)
//=============================================================================
uint8_t MCP9600_GetHotJuncTempRegister(MCP9600_i2c_params i2cParams, int16_t *register_val)
{
uint8_t registerPointer;
uint8_t errorCode = MCP9600_NO_ERROR;
//step1 - set the device register pointer
registerPointer = MCP9600_REGADDR_HOT_JUNC_TEMP;
errorCode = MCP9600_Write(i2cParams, ®isterPointer, sizeof(registerPointer));
if (errorCode != MCP9600_NO_ERROR)
{
return errorCode;
}
//step2 - read from device register
errorCode = MCP9600_Read(i2cParams, (uint8_t *)register_val, sizeof(int16_t));
*register_val = ((*register_val >> 8) & 0xFF) | (*register_val << 8);
return errorCode;
}
오늘도 수고하셨습니다.
반응형
'Microchip PIC' 카테고리의 다른 글
MPLAB X IDE 단축키 정리 (0) | 2021.12.27 |
---|---|
[C언어] unused parameter 'xxx' 해결방법 (0) | 2021.12.07 |
[개발제품소개] BLE, 로드셀, 모바일폰 통신, 저소모전력 설계 (0) | 2021.02.08 |
[로드셀] HX711 사용하기 (0) | 2020.12.11 |
[PIC] HEF ( High Endurance Flash ) EEP ROM 대용 (1) | 2020.08.28 |
댓글