Monitorando a temperatura com FRDM-KL05Z utilizando o Termopar Tipo K com Módulo MAX6675 Deixe um comentário

Olá caro leitor, tudo bem? Esse post é uma continuação de uma série de artigos sobre a NXP FRDM-KL05Z. Neste artigo irei apresentar a biblioteca de software que desenvolvi para realizar a leitura de temperatura utilizando termopar tipo K. Além disso, será demonstrada a biblioteca de software desenvolvida para a utilização do circuito integrado (CI) MAX6675 e um exemplo de aplicação.
Sobre a teoria de funcionamento dos termopares sugiro a leitura do artigo Como funciona o termopar, escrito pelo Pedro Bertoleti.

Material Necessário

Características do MAX6675

O CI MAX6675 digitaliza o sinal de um termopar tipo K. O resultado da digitalização é disponibilizado através do protocolo de comunicação SPI. O resultado da conversão é oferecido em 12-bit com resolução de 0,25 ºC, com range de operação de 0 ºC a 1024 ºC. O circuito integrado MAX6675 ainda conta com recurso de detecção de circuito aberto, onde é possível verificar se a junção do termopar está íntegra ou se o mesmo está desconectado.

Datasheet e aplicações (Figura 01)

Biblioteca de software MAX6675 para FRDM-KL05Z

A biblioteca de software desenvolvida faz uso drivers de acesso aos periféricos do microcontrolador que apresentei no segundo (Biblioteca para FRDM-KL05Z: Aprenda a utilizar) artigo da série. Como dito anterior o CI MAX6675 utiliza como interface o SPI. O SPI utilizado pelo Freedom Board KL05Z é SPI0. Os pinos SPI0 são:

D12 ~ PTA6: Miso
D11 ~ PTA7: Mosi
D13 ~ PTB0: SCK
D10 ~ PTA5: SS

A seguir temos o código fonte da biblioteca de software desenvolvida.

No arquivo temos o protótipo das funções de acesso públicos, temos a função “max6675_init”, onde função é responsável em inicializar o SPI0 e pinos de “CS – Chip Select” . A segunda função é “max6675_reads_temperature” é onde feita a leitura da temperatura, a função tem dois parâmetro, o primeiro é tipo do retorno da temperatura (Celsius, Fahrenheit e Kelvin) e o segundo é valor da temperatura. Nessa função tem como retorno “true” ou “false”, true para leitura bem sucedida e false leitura inválida ou falha.

Código fonte max6675.h

/*
 * max6675.h
 *
 *  Created on: 23/02/2020
 *      Author: Evandro Teixeira
 */
#ifndef THIRDPARTKL05Z_MAX6675_MAX6675_H_
#define THIRDPARTKL05Z_MAX6675_MAX6675_H_

#include "../KL05Z_Libraries/board_frdm_kl05z.h"
#include <stdbool.h>typedef enum
{
    MAX6675_Celsius = 0,
    MAX6675_Fahrenheit,
    MAX6675_Kelvin
}MAX6675_TemperatureType_t;

/*
 * CLK: 180 KHz
 * SPI0
 * D12 ~ PTA6: Miso
 * D11 ~ PTA7: Mosi
 * D13 ~ PTB0: SCK
 * D10 ~ PTA5: CS
 */
void max6675_init(void);
bool max6675_reads_temperature(MAX6675_TemperatureType_t type,float *value);
#endif /* THIRDPARTKL05Z_MAX6675_MAX6675_H_ */

Código fonte max6675.c
No arquivo max6675.c é onde “toda a mágica acontece” é onde possui o algoritmo leitura do CI. neste arquivo além das funções de acesso público, temos algumas funções privadas que auxiliam na leitura das informações do CI.

/**
 * max6675.c
 *
 *  Created on: 23/02/2020
 *      Author: Evandro Teixeira
 */
#include "max6675.h"

/**
 * @brief
 */
typedef union
{
    uint16_t byte;
    struct
    {
        unsigned A00 : 1;
        unsigned A01 : 1;
        unsigned A02 : 1;
        unsigned value : 12;
        unsigned A15 : 1;
    };
}data_t;

/**
 *
 */
static data_t max6675_read_data(void);
static void max6675_delay(uint16_t t);

/**
 * @brief
 */
static data_t max6675_read_data(void)
{
    data_t data = {0};
    gpio_write(D10,LOW);
    max6675_delay(5);
    data.byte = spi_read(SPI);
    data.byte <<= 8;
    data.byte |= spi_read(SPI);
    max6675_delay(5);
    gpio_write(D10,HIGH);
    return data;
}

/**
 * @brief
 */
static void max6675_delay(uint16_t t)
{
    while(t--)
    {
        __asm("nop");
    }
}

/**
 * @brief
 */
void max6675_init(void)
{
    spi_init(SPI_CONFIG);
    gpio_init(D10,OUTPUT);
    gpio_write(D10,HIGH);
}

/**
 *
 @brief
 * @param
 * @return
 */
bool max6675_reads_temperature(MAX6675_TemperatureType_t type,float *value)
{
    data_t data = {0};
    data = max6675_read_data();
    /* Checks if the thermocouple is connected correctly */
    if(data.A02 == 1)
    {
        return false;
    }
    *value = (float)(data.value * 0.25f);
    if(type == MAX6675_Fahrenheit)
    {
        *value = (float)(*value * 2.25f);
        *value += 32.00f;
    }
    else if(type == MAX6675_Kelvin)
    {
        *value += 273.15f;
    }
    return true;
}


Aplicação de demonstração na FRDM-KL05Z

A aplicação desenvolvida é bem simples, o algoritmo consiste em ler a temperatura a cada 01 segundo e imprimir o valor lido na porta serial. Os valores da temperatura são apresentados em Celsius, Fahrenheit e Kelvin.

Diagrama do circuito utilizando FRDM-KL05Z (Figura 02)

Código fonte da aplicação de demonstração main.c

/**
* main.c
 *
 *  Created on: 23/02/2020
 *      Author: Evandro Teixeira
 */
#include <stdio.h>
#include <stdbool.h>
#include "MKL05Z4.h"
#include "../ThirdpartKL05Z/MAX6675/max6675.h"

/* Declara variaveis globais */
float temperature = 0.00f;
uint8_t type = 0;

int main(void)
{
   /* Inicializa Serial ~ UART */
    uart_init(UART_CONFIG,115200);

    /* Inicializa o timer systick */
    systick_init();

    /* Inicializa SPI0 ~ MAX6675 */
    max6675_init();

    for (;;)
    {
        if(max6675_reads_temperature(type,&temperature) == true)
        {
            char txt[] = {0};
            switch(type)
            {
                case MAX6675_Fahrenheit:
                    sprintf(txt,"Temperatura: %f Graus Fahrenheit", temperature);
                break;
                case MAX6675_Kelvin:
                    sprintf(txt,"Temperatura: %f Graus Kelvin", temperature);
                break;
                case MAX6675_Celsius:
                default:
                    sprintf(txt,"Temperatura: %f Graus Celsius", temperature);
                break;
            }
            uart_put_string(UART,txt);
        }
        else
        {
            uart_put_string(UART,"\n\rTermoPar Desconectado ");
        }
        type++;
        if(type > MAX6675_Kelvin)
        {
            type = 0;
        }
    /**
     * Aguarda 1 segundos
     */
    systick_delay(1000);
    }
    /* Never leave main */
    return 0;
}


Conclusão

O circuito integrado MAX6675 é uma ótima opção para diversos aplicações que necessita monitorar a temperatura.
A biblioteca de software apresentada neste artigo está no meu Github disponível para que todos. Além de utilizar, você também pode contribuir com o projeto, ajudando no seu desenvolvimento. Pode fazer isso testando, avaliando, corrigindo falhas e implementando novas funcionalidades.

O que você achou? Você já utilizou esse CI MAX6675 em seus projetos? Deixe o seu comentário a abaixo.

Referência

GitHub ThirdpartKL05Z: https://github.com/evandro-teixeira/ThirdpartKL05Z

GitHub KL05Z_Libraries: https://github.com/evandro-teixeira/KL05Z_Libraries

Datasheet MAX6675: https://datasheets.maximintegrated.com/en/ds/MAX6675.pdf

Faça seu comentário

Acesse sua conta e participe