본문 바로가기
Microchip PIC

[열전대 온도센서] MCP9600 사용하기

by 소나무기운 2020. 12. 15.
반응형

MCP9600

안녕하세요. 소나무기운입니다.

 

오늘은 열전대 온도센서에 대해서 알아보지요.

열전대, 열전상, 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, &registerPointer, 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, &reg_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, &registerPointer, 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;
}

 

오늘도 수고하셨습니다.

반응형

댓글