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 O que é um termopar.
Material Necessário
- Freedom Board KL05Z
- MAX6675 – Módulo MAX6675 com Termopar com Rosca 7,5 mm ou Termopar Tipo K com Módulo MAX6675
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.
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.
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