PROJETO DE UM CONTROLADOR DE TEMPERATURA CONTROLADO POR MICROCONTROLADOR Estudo dirigido a disciplina “Sistemas Digitais Microprocessados”, com enfoque em uma aplicação prática do conteúdo programático do semestre para realização do projeto final. Novembro de 2011 UNIVERSIDADE ESTADUAL DE SANTA CATARINA - UDESC CENTRO DE CIÊNCIAS TECNOLÓGICAS - CCT - PROJETO DE UM CONTROLADOR DE TEMPERATURA CONTROLADO POR MICROCONTROLADOR Disciplina: Sistemas Digitais Microprocessados Professora: Ana Teruko Watanabe Acadêmicos: Everton Peres Correa Pyter Ely da Silva ÍNDICE INTRODUÇÃO.........................................................................................................................2 DEFINIÇÃO E CARACTERISTICAS DO PROJETO..............................................................3 HARDWARE..................................................................................................................…......5 SOFTWARE........................................................................................................................... 6 FLUXOGRAMA ...................................................................................................................... 7 PROGRAMA EM ASSEMBLY................................................................................................ 8 CONCLUSÃO...................................................................................................................... 18 INTRODUÇÃO Muitas vezes, em diversas situações, temos um ambiente ou até um espaço mais confinado, em que nos interessa não só em saber a temperatura, mas também que esta seja controlada nesse determinado espaço. Seja por uma preferência nossa, ou por definições pré estabelecidas. Tendo essa situação e vista, o projeto ‘controlador de temperatura’ vem oferecer uma solução para tal problema, através de componentes simples e de fácil aquisição. Enfocando a utilização do microcontrolador de arquitetura HCS08, desenvolvido pela Motorola®, que é o principal objeto de estudos da displina “Sistemas Digitais Microprocessados” (SDM). Nesse estudo de caso, veremos uma aplicação simples, mas que mostra o poder do microcontrolador em questão. Utilizando algumas de suas funções mais básicas como entradas digitas/analógicas e interrupções, vemos que soluções para diversos casos - não somente o visto nesse documento - dos mais simples ao mais complexos, podem ser facilmente desenvolvidas para todos os âmbitos, seja industrial, residencial ou comercial. Cuja alguns exemplos podem ser citados como: ○ Chocadeiras elétricas de granja de frango; ○ Câmaras de fusão em maquinas injectoras; ○ Chuveiros elétricos; ○ Aquecedores de ambientes; ○ Entre outros. Nota se que apesar de uma controlador de temperatura ser uma ideia bastante simples, podemos encontras uma grande diversidade de aplicações em setores bem distintos, dando a ele utilidades eficazes. DEFINIÇÕES E CARACTERISCAS DO PROJETO Se trata de um controlador de temperatura, onde a temperatura a ser controlada é definida pelo usuário através de um potenciômetro ligado diretamente a um pino do HCS08. O programa conta com uma lógica relativamente simples, mas eficaz. A cada 512 ms, é coletado o valor da temperatura real medida no ambiente de interesse, e a temperatura selecionada pelo usuário através do potenciômetro, compara as duas, e decide se esfria ou aquece o ambiente. Para aquecer o ambiente o projeto conta com uma lâmpada incandescente, que é ativada através de um mecanismo com trasistores e relés. Já para esfriar, além de desligar a lâmpada, o programa ativa um cooler, para o processo se completar mais rapidamente. Um delay de 4 segundos também foi implementado como item de segurança, já que pode haver o risco do relé ficar chaveando a cada meio segundo, compromentendo o filamento da lâmpada. Esse delay entra em ação no exato momento que o programa percebe que a temperatura do potenciômetro é igual a do ambiente, esperando assim a temperatura estabilizar. Outro item de segurança que foi implementado, foi o ‘botão de emergência’, cujo principal objetivo é desligar a lâmpada e ligar o cooler. Esse mecanismo é ativado através de uma simples interrupção IRQ. Completando o projeto, foi adicionado um display LCD, que mostra em tempo real a temperatura selecionada e a ambiente. Por motivos de praticida e didádica, foi optado por mostrar o valor real lido pelo conversor AD em hexadecimal. Para a concepção do projeto, foram utilizados algumas constantes e variáveis que podem ser vistas em mais detalhes nas tabelas a seguir. Tabela 1: Variável: Definição: temperatura_pot Variável que armazena o valor da tensão enviado pelo potenciômetro. temperatura_real Variável que armazena o valor da tensão enviado pelo sensor LM35 temporario Variável necessária para manipulação do bit antes de envia-lo para o lcd, já que há a necessidade enviar algarismo por algarismo. Tabela 2: Constante: Definição: ‘Definida:’ Constante reponsável por imprimir no LCD a palavra ‘Definida:’ ‘Real:’ Constante reponsável por imprimir no LCD a palavra ‘Real:’ O projeto precisou de uma quantidade grande de portas digitais, tendo em vista que foi utilizado um módulo LCD para visualização da temperatura em tempo real, e a temperatura definida pelo usuário. Detalhes de todas as portas utilizadas no projeto, podem ser vistas na tabela 3: Tabela 3: Porta: Definição: PTA1 Porta analógica, responsável pela aquisição da temperatura ambiente enviado pelo sensor LM35 PTA2 Porta digital, reponsável pelo controle de liga/desliga da lâmpada incandescente. PTA3 Porta análogica, responsável pela aquisição de dados vindo do potenciômetro (temperatura definida pelo usuário). PTA4 Porta digital, responsável pelo controle liga/desliga do cooler resfriador. PTB0, PTB1, PTB2, Portas digitais em geral, basicamente são responsáveis pelo PTB3, PTB4 e PTB5 controle de envio de dados para o LCD. HARDWARE O hardware do projeto pode ser dividido em duas partes. A interface de entrada, e a interface de saída. Na interface de entrada, se encontrar um potenciômetro de 5 Kohms no qual é setado a temperatura a ser mantida, e um sensor de temperatura LM35, que manda um sinal de tensão proporcional a temperatura, mais precisamente 10mV a cada grau celcius. O LM35 tem opera no máximo com 150 graus celcius. Na interface de saída, temos dois trasistores que atuão como chave, já que a tensão de saída do HCS08 é na faixa de 3.3V, o que impossibilitaria de ligar um relé com valores comerciais, bem como ligar o cooler diretamente na saída do pino. Outro ponto a ser observado, é o diodo ligado em paralelo com o relé. Esse díodo tem a função de dissipar a corrente em forma de calor quando o relé é desligado. Os resistores da saída podem ser considerados como 1Kohm. Todo o esquemático do projeto, pode ser visto com detalhes na figura 1. Figura 1: SOFTWARE O software do projeto, foi escrito em linguagem assembly, com uma biblioteca em C que era responsável pelo controle do LCD. Então as funções para escrita do LCD foram chamadas dentro do assembly. Porém ainda foi necessário desenvolver uma sub-rotina na qual era tratado o dado antes de envia-lo ao lcd, essa função - lcd_mostra_valores - separa o bit principal em nibbles, depois filtra, e chama a função para envia-lo ao LCD. A bliblioteca em C, foi desenvolvida a partir da que se encontra no livro ‘Microcontroladores HC908Q’, do autor Fábio Pereira. Dentro do software foram usados alguns dos módulos mais básicos no HCS08, tais como interrupções de timer, interrupções IRQ, pinos no formato analógico e digitais. Foi utilizado interrupção de timer, para coleta dos dados das entradas analógicas a cada 512ms, fazer a comparação e decidir o que deve ser feito. A interrupção IRQ foi utilizada para um botão de emergência, como item complementar de segurança. Entradas analógicas foram necessárias para aquisição dos dados provenientes do potenciômetro e do sensor de temperatura, um artifício interessante que foi usado no software, foi a utilização de sub-rotinas específicas para seleção do canal AD antes da coleta dos dados. Outra sub-rotina a ser comentada, é a que confere se a conversão AD foi efetuada antes de adquirir os dados das entradas. E por último, foram utilizados pinos configurados como entradas digitais, para fazer o controle dos componentes de hardware que possuaim apenas 2 estados. O fluxograma e o programa escrito em assembly podem ser vistos nas páginas seguintes. FLUXOGRAMA Programa escrito em assembly: ; export symbols XDEF asm_main XREF lcd_envia_byte XREF lcd_escreve_char XREF lcd_escreve_string XREF lcd_escreve_num XREF lcd_pos_xy XREF delay_ms ; Include derivative-specific definitions INCLUDE 'derivative.inc' ; Àrea de dados variáveis Data_Sect: SECTION temperatura_pot: DS.W 1 temperatura_real: DS.W 1 temporario: DS.W 1 ; Àrea de constantes ConstSect: SECTION ; seções de constantes definida: DC.B "Definida:" definida_l: DC.B $00 ;NECESSARIO PARA FINALIZAR O STRING real: DC.B "Real:" real_1: DC.B $00 ; variable/data section MY_ZEROPAGE: SECTION SHORT ;*****==== C Ó D I G O ===***** MyCode: SECTION asm_main: ;=== CONFIGURACAO HCS === config: LDA SOPT1 ;desabilita COP AND #127 STA SOPT1 LDHX #0 ;zera variaveis STHX temperatura_real LDHX #0 STHX temperatura_pot LDHX #0 STHX temporario ;config E/S MOV #%00000000, PTAD ;zerando saida PTA2 E PTA4 MOV #%00010100, PTADD ;setando como saida PTA2 ;config analogico MOV #%00001010, MOV #%10001000, MOV #%00000000, MOV #%00111111, desativado... APCTL1 ;configurando entradas analogicas ADCCFG ;modo 10 bits, busclock/1, e outras configurações... ADCSC2 ;sem comparacação, e outras configurações... ADCSC1 ;conversao continua, conversor primeiramente ;config interrupcao externa MOV #%00010010,IRQSC ;IRQ acionado em transição para baixo ;config interrupcao timer LDA #%01010110 STA SRTISC CLI ;configura interrupcao de timer a cada 512ms ; tempo de amostragem da temperatura ;habilita interrupções ;=== PRINCIPAL === principal: BSR lcd_mostra_valores ;chama label responsavel pelo controle do LCD LDHX temperatura_real ;aqui compara se a temperatura ja está igual CPHX temperatura_pot BEQ delay_4s ;label para esperar a temperatura estabilizar um pouco, ; util para o relé nao ficar chaveando, evitando uma possivel ; queima da lampada BRA principal ;volta para principal, caracterizando loop infinito ;=== SUB-ROTINAS === delay_4s: ;label responsavel por fazer um delay de 4 segundos. LDHX #1000 JSR delay_ms LDHX #1000 JSR delay_ms LDHX #1000 JSR delay_ms LDHX #1000 JSR delay_ms RTS lcd_mostra_valores: ;///*** PARTE RESPONSAVEL PELA TEMPERATURA DO POTENCIOMENTRO ***/// ;escreve 'Definida:' no LCD LDA #1 ;define posicao no LCD LDX #2 JSR lcd_pos_xy LDHX #definida JSR lcd_escreve_string ;BIT --X da temperatura definida pelo usuario LDA #1 ;define posicao no LCD LDX #15 JSR lcd_pos_xy LDHX temperatura_pot ;carrega temperatura_pot em H:X STX temporario ;joga valor de X para 'temporario' LDA temporario ;carrega valor de 'temporario' em A AND #%00001111 ;faz um AND bit a bit, para pegar somente o valor ; menos significativo do acumulador JSR lcd_escreve_num ;chama funcao 'lcd_escreve_num' da biblioteca, ; e escreve o valor de A no LCD ;BIT -X- da temperatura definida pelo usuario LDA #1 LDX #14 JSR lcd_pos_xy ;define posicao no LCD LDHX temperatura_pot ;carrega temperatura_pot em H:X STX temporario ;joga valor de X para 'temporario' LDA temporario ;carrega valor de 'temporario' em A LSRA LSRA ;desloca A 4 bits para direita, e coloca 0 nos bits deslocados ; essa funcao se torna necessaria, para pegar a parte mais ; significativa do registrador A. STA temporario ;necessario, se não ocorre ERRO no LCD LDA temporario LSRA LSRA AND #%00001111 ;faz um AND bit a bit, para pegar somente o valor ; menos significativo do acumulador JSR lcd_escreve_num ;chama funcao 'lcd_escreve_num' da biblioteca, ; e escreve o valor de A no LCD ;BIT X-- da temperatura definida pelo usuario LDA #1 LDX #13 JSR lcd_pos_xy ;define posicao no LCD LDHX temperatura_pot ;carrega temperatura_pot em H:X PSHH ;armazena conteudo de H na pilha PULA ;carrega conteudo da pilha (H) em A AND #%00001111 ;filtra nibble menos significativo JSR lcd_escreve_num ;escreve valor no LDC ;///*** PARTE RESPONSAVEL PELA TEMPERATURA DO LM35 ***/// ;escreve 'Real:' no LCD LDA #2 ;define posicao no LCD LDX #2 JSR lcd_pos_xy LDHX #real JSR lcd_escreve_string ;BIT --X da temperatura do LM35 LDA #2 LDX #15 JSR lcd_pos_xy ;define posicao no LCD LDHX temperatura_real ;carrega temperatura_real em H:X STX temporario ;joga valor de X para 'temporario' LDA temporario ;carrega valor de 'temporario' em A AND #%00001111 ;faz um AND bit a bit, para pegar somente o valor ; menos significativo do acumulador JSR lcd_escreve_num ;chama funcao 'lcd_escreve_num' da biblioteca, ; e escreve o valor de A no LCD ;BIT -X- da temperatura do LM35 LDA #2 LDX #14 JSR lcd_pos_xy ;define posicao no LCD LDHX temperatura_real ;carrega temperatura_real em H:X STX temporario ;joga valor de X para 'temporario' LDA temporario LSRA LSRA ;carrega valor de 'temporario' em A ;desloca A 4 bits para direita, e coloca 0 nos bits deslocados ; essa funcao se torna necessaria, para pegar a parte mais STA temporario LDA temporario LSRA LSRA ; significativa do registrador A. AND #%00001111 ;faz um AND bit a bit, para pegar somente o valor ; menos significativo do acumulador JSR lcd_escreve_num ;chama funcao 'lcd_escreve_num' da biblioteca, ; e escreve o valor de A no LCD ;BIT X-- da temperatura do LM35 LDA #2 LDX #13 JSR lcd_pos_xy ;define posicao no LCD LDHX temperatura_real ;carrega temperatura_real em H:X PSHH ;armazena conteudo de H na pilha PULA ;carrega conteudo da pilha (H) em A AND #%00001111 JSR lcd_escreve_num ;filtra nibble menos significativo ;escreve valor no LDC RTS seleciona_adc1: BSET 0, ADCSC1 BCLR 1, ADCSC1 BCLR 2, ADCSC1 BCLR 3, ADCSC1 BCLR 4, ADCSC1 RTS ;label responsavel pela selecao do canal adc1 seleciona_adc3: ;label responsavel pela selecao do canal adc3 BSET 0, ADCSC1 BSET 1, ADCSC1 BCLR 2, ADCSC1 BCLR 3, ADCSC1 BCLR 4, ADCSC1 RTS desliga_adc: BSET BSET BSET BSET BSET 0, 1, 2, 3, 4, ;label responsavel por desligar os canais ad ADCSC1 ADCSC1 ADCSC1 ADCSC1 ADCSC1 RTS aquece: ;label responsavel por ligar a lampada BSET 2, PTAD BCLR 4, PTAD ;liga lamp ;desliga ventilador BRA volta resfria: ;label responsavel por desligar a lampada BCLR 2, PTAD BSET 4, PTAD ;desliga lamp ;liga ventilador BRA volta verifica_coco: ir em frente ;label resposavel pela verificacao do COCO, so deixa o programa ; se o coco terminar de fazer a conversao AD BRCLR 7, ADCSC1, verifica_coco RTS ;=== INTERRUPCAO === interrupcao_timer: ;label responsavel pelo tratamente da interrupcao LDA SRTISC ;apaga ACK da interrupcao ORA #%01000000 STA SRTISC JSR seleciona_adc1 BSR verifica_coco ;seleciona canal adc1 ;espera bit coco setar. LDHX ADCRH ;le a temperatura, e joga para 'temperatura_real' STHX temperatura_real JSR seleciona_adc3 BSR verifica_coco ;seleciona canal adc3 ;espera bit coco setar LDHX ADCRH ;le a valor do potenciometro e grava em 'temperatura_pot' STHX temperatura_pot JSR desliga_adc ;desativa as entradas analogicas. LDHX temperatura_pot ;carrega 'temperatura_pot' no H:X CPHX temperatura_real ;comapra com temperatura real BHI aquece BLS resfria volta: ;se a temperatura do potenciometro for maior, aquece, ; caso for menor, resfria ;label para volta das funcoes 'liga_lamp' e 'desliga_lamp' RTI interrupcao_IRQ: BSET 2, IRQSC ;apaga ack do IRQ BCLR 2, PTAD BSET 4, PTAD ;desliga lampada ;liga ventilador loop: BRA loop ;loop infinito, até o botão RESET for apertado. RTI ;************************************************************** ;* Vetor de interrupcoes * ;************************************************************** ORG $FFD0 DC.W interrupcao_timer ORG $FFFA DC.W interrupcao_IRQ CONCLUSÃO O controlador de temperatura, apesar de ser um projeto simples, demostrou uma grande eficiência no esduto do microcontrolado HCS08. Procurando visar algumas das demais funções que o microcontrolador tem a oferecer. Fica visível o beneficio que de pode ser extraido de sua utilização, onde podemos ver em areas de industriais, assim como residenciais e entre outra. O projeto não só contribui para o estudo do microcontrolador HCS08 , como também oferece uma visão ampla da aplicação em termos profissionalizante da disciplina de “ Sistemas Digitais Microprocessados”, algo que é muito importante para uma futura carreira na engenharia. BIBLIOGRAFIA 1. Microcontroladores HC908Q - Fábio Pereira - Editora Érica 2. Microcontroladores HCS08 - Fábio Pereira - Editora Érica