Instituto Federal Sul-rio-grandense
Curso de Eletrônica
Disciplinas de Instrumentação Industrial, Microcontroladores e Pro...
1 - Introdução
Tornar o conhecimento teórico e prático um único saber é o objetivo de todos os
cursos técnicos e a maior p...
2 - Desenvolvimento
2.1 – Descrição geral do projeto
O kit desenvolvido pode ser usado para simular o controle de dois sis...
2.2.2 – Comunicação serial
Conforme já dito, o microcontrolador PIC16F877A possui uma USART
integrada. Esta USART é respon...
45 V em um resistor de 68 ohms tem-se uma potência dissipada de aproximadamente 30
W. O resistor usado é de 10 W. Porém o ...
Exemplos de equipamentos que utilizam firmwares: celulares mais antigos,
controles remotos, cafeteiras, relógios, BIOS, es...
2.4 – Software
O software desenvolvido não acompanha o kit didático tendo em vista que o
objetivo do kit é justamente poss...
2.4.2 – Software de demonstração

Imagem do software de interface
O software foi desenvolvido na plataforma Delphi 7 da an...
3 - Conclusão
Desenvolver um kit didático representa desenvolver uma ferramenta de
aprendizado. Por este motivo torna-se m...
Apêndice A – Diagrama esquemático da placa
Apêndice B – Firmware do mircrocontrolador
//inclusão de bibliotecas
#include <16F877A.h>
//configurações do dispositivo
#...
#define ft
#define led

RB0
RB4

//Definições dos estados de máquina e valores constantes
#define EST_LE_TEMP 0
#define ES...
{
np++;
}
#INT_TIMER1
void trata_timer1()
{
static unsigned int cont = 0;
if(cont<20)
{
cont++;
} else
{
//efetua o cálcul...
config_pwm();
config_timer1();
config_interrupts();
init_signal();
}
void comunica()
{
if(kbhit()) //se houver algo no buf...
case EST_ENV_PWMR: pwm_r = pwm_r_reg;
sprintf(buffer,"P%5u", pwm_r);
puts(buffer);
sm = sma;
break;
case EST_PWMC_INC: if(...
case EST_HND_SHKN: sprintf(buffer,"HS_OK"); //HANDSHAKING
puts(buffer);
sm = sma;
break;
default: sm = sma;
estado de máqu...
PS0 = 1;
}
void reset_wdt() //chama uma instrução assembly para resetar o wdt
{
#asm
CLRWDT
#endasm
}
void le_temp() //rea...
{
pwm_r = 0;
pwm_r_reg = pwm_r;
pwm_c = 255;
pwm_c_reg = pwm_c;
erro = 1;
flag = 1;
}
if(temp<TEMP_MIN && flag)
{
erro = 0...
Upcoming SlideShare
Loading in …5
×

Relatório de Projeto - Desenvolvimento de um kit didático para disciplinas de Instrumentação e Sistemas de Controle

1,047 views

Published on

  • Be the first to comment

  • Be the first to like this

Relatório de Projeto - Desenvolvimento de um kit didático para disciplinas de Instrumentação e Sistemas de Controle

  1. 1. Instituto Federal Sul-rio-grandense Curso de Eletrônica Disciplinas de Instrumentação Industrial, Microcontroladores e Programação III. Professores Ulisses Lyra dos Santos, Rafael Galli e Norberto de Castro Peil. Desenvolvimento de um kit didático para trabalhos práticos nas disciplinas de Instrumentação Industrial e Sistemas de Controle Gustavo dos Santos Fernandes Rodrian Garcia Radmann Tro7ni
  2. 2. 1 - Introdução Tornar o conhecimento teórico e prático um único saber é o objetivo de todos os cursos técnicos e a maior parte dos cursos superiores. O problema surge quando devido a deficiências financeiras e estruturais dos cursos não é possível reproduzir para o aluno a situação real em que se aplica determinado conteúdo. Nestas situações, apela-se para os kits didáticos, estes embora não apresentem a situação real de aplicação dos conteúdos vistos nas disciplinas, podem simular algo em que seja necessário aplicar parte dos conhecimentos adquiridos em sala de aula. O objetivo deste trabalho foi desenvolver um kit didático para trabalhos práticos nas disciplinas de Instrumentação Industrial e Sistemas de Controle. O kit oferece elementos que podem simular um sistema termodinâmico, um sistema de sensoriamento e um sistema de atuação. A aquisição, registro de dados e lógica de controle deste sistema deve ser feita pela interface serial RS232 de um microcomputador de uso geral. Através da programação em ambiente Delphi, pode-se facilmente implementar uma lógica de controle para o sistema termodinâmico oferecido pelo kit.
  3. 3. 2 - Desenvolvimento 2.1 – Descrição geral do projeto O kit desenvolvido pode ser usado para simular o controle de dois sistemas termodinâmicos diferentes: - um forno controlado; - uma carga que precise ter a sua temperatura máxima limitada. Ex: processador. O sistema termodinâmico oferecido pelo kit é composto por um resistor de 68 ohms / 10 W. Utiliza-se o efeito joule da corrente para aquecê-lo e tornar possível o controle de temperatura tanto por controle de aquecimento quanto por controle de resfriamento. Este resistor também pode se comportar como um atuador, como no caso da simulação do forno controlado. O sistema de sensoriamento é composto por um CI LM35, sensor de temperatura de precisão que é capaz de variar a sua saída em 10 mV a cada variação de um grau Celsius. A partir deste, é possível saber qual é a temperatura do resistor. O sistema de atuação é composto por uma ventoinha que pode ter a sua rotação controlada a partir de um sinal PWM – Pusle Width Modulation. No caso do forno controlado, o resistor também pode se comportar como um atuador e também tem o seu aquecimento controlado por um sinal PWM. O sistema possui um microcontrolador PIC16F877A para fazer a interface entre o kit e a porta serial RS232 do microcomputador. 2.2 – Hardware O hardware do kit é uma placa de interface entre os dispositivos que compõem o kit e o microcomputador. Este kit foi desenvolvido para tornar possível a implementação de lógicas de controle a partir da programação em alto nível por meio de plataformas de desenvolvimento que rodam em microcomputadores de uso geral. Logo se fez necessário desenvolver uma placa microcontrolada que fizesse a interface entre a porta serial RS232 do microcomputador e periféricos do kit. A partir desta placa, tornou-se possível acionar cargas de potência e fazer leituras analógicas de tensão, o que é de extrema importância para o bom funcionamento do kit. 2.2.1 – Microcontrolador O microcontrolador utilizada para a interface foi o PIC16F877A, fabricado pela Microchip. Este microcontrolador foi escolhido pois possui 2 módulos para controle de pwm, suporte para comunicação uart e canais de conversão analógico-digital, e principalmente, por se ter várias peças disponíveis no curso.
  4. 4. 2.2.2 – Comunicação serial Conforme já dito, o microcontrolador PIC16F877A possui uma USART integrada. Esta USART é responsável pela serialização e temporização da transferência dos dados que são enviados e paralelização e temporização dos dados que são recebidos. Através deste periférico integrado ao chip, não é necessário usar o processador para fazer o trabalho de transmissão ou recepção serial, bastando apenas enviar o dado de forma paralela e recebê-lo de forma paralela. O microcontrolador trabalha com o protocolo UART com níveis TTL: 0 V – “0”, 5 V – “1”. Entretanto a porta serial dos microcomputadores utiliza os níveis RS232: +3 a +15 V – “0”, -3 a -15 V - “1”. Para fazer o interface entre a comunicação do microcontrolador com a do microcomputador foi necessário utilizar um conversor de níveis também conhecido como transceptor TTL-RS232, o CI MAX232. O MAX232 é um CI que possui dois tranceptores TTL-RS232 integrados. Através de quatro capacitores externos este consegue gerar as tensões do padrão RS232 sendo alimentado por uma única fonte de 5 V. Para a comunicação com o computador foram usados apenas 3 fios: TX, RX e GND. Não foi necessário utilizar os outros sinais disponíveis na porta. Foi montado um cabo específico para o kit, com um DB9 fêmea em uma das pontas e um conector spox de 3 vias para ser conectado em uma barra de pinos, na outra. 2.2.3 – Alimentação A alimentação do kit é feita por uma fonte linear de aproximadamente 44 V - 800 mA. A tensão de 44 V é resultado da retificação e filtragem da tensão de saída do secundário de um transformador de 30 Vac. Esta tensão está sendo aplicada no ramo do resistor e na entrada de um regulador de 24 V. A tensão de saída do regulador de 24 V está sendo aplicada no ramo da ventoinha e na entrada de um regulador de 5 V. A tensão de saída do regulador de 5 V está alimentando todos os circuitos integrados do kit. Caso haja uma revisão do projeto, procurará reduzir-se a tensão entre os terminais dos reguladores ou montá-los de forma que seja possível a fixação de um dissipador de calor. 2.2.1 – Acionamento de cargas de potência As cargas de potência acionadas pelo microcontrolador são duas: uma ventoinha de 24 V - 300 mA e um resistor de 68 ohms - 10 W. Ambas estão conectadas às saídas de sinal PWM do microcontrolador. A ventoinha está sendo acionada por um transistor NPN BC337 que liga o seu terminal negativo ao GND, quando acionado. Colocou-se um diodo em antiparalelo com a bobina da ventoinha para evitar o golpe indutivo ao desligar o transistor. Este golpe indutivo em casos extremos pode danificar o transistor ou até mesmo o microcontrolador. O resistor está sendo acionado por um transistor MOSFET N IRF3205. Este transistor liga o negativo da fonte ao resistor quando acionado. Sabe-se que aplicando
  5. 5. 45 V em um resistor de 68 ohms tem-se uma potência dissipada de aproximadamente 30 W. O resistor usado é de 10 W. Porém o kit possui um sistema de proteção que bloqueia o uso do usuário quando a temperatura do resistor ultrapassar 100 º C, forçando-o a baixar a temperatura para no mínimo 50 º C antes de desligar o sistema de proteção. Esta proteção foi implementada no firmware do microcontrolador. 2.2.4 – Indicação O kit possui dois leds: um vermelho e um laranja. O led vermelho serve para indicar se a fonte de 5 V está ligada. O led laranja indica o estado do microcontrolador. Aceso indica funcionamento normal. Piscando indica proteção de sobre temperatura e apagado indica que o microcontrolador está inativo. 2.2.5 – Leitura de temperatura O microcontrolador PIC16F877A possui um conversor AD por aproximação sucessiva integrado ao chip. Este tipo de conversor é muito vantajoso quando se necessita de um equivalente binário de uma determinada tensão analógica a partir de uma tensão de referência. Para realizar a leitura de temperatura foi necessário converter de um sinal analógico para digital a saída do sensor de temperatura LM35. Para isso, ligou-se a saída do sensor a uma dos canais de conversão AD do microcontrolador, utilizando um filtro passa-baixas composto por um resistor de 1k2 e um capacitor de 100 nF para estabilizar o sinal. Mesmo realizando uma filtragem analógica ainda foi necessário implementar um filtro digital no firmware do microcontrolador. 2.2.6 – Layout da placa de circuito impresso O layout da placa de circuito impresso foi desenhado no EAGLE v 5.6, da CadSoft. 2.3 – Firmware As pessoas confundem bastante o conceito de “software” e “firmware” e chamam muitas vezes um firmware de software ou um software de firmware. O firmware pode ser definido como um software embarcado. Um software para um hardware específico que vem gravado de fábrica na memória de programa de um sistema microprocessado. Pode-se dizer que o firmware esta “preso” à sua placa de aplicação. Quando se desenvolve um programa para rodar em um hardware específico, este é chamado de firmware. Entretanto ao se desenvolver um programa para funcionar independente do hardware utilizado, desenvolve-se um software.
  6. 6. Exemplos de equipamentos que utilizam firmwares: celulares mais antigos, controles remotos, cafeteiras, relógios, BIOS, estações meteorológicas, multímetros, etc. Exemplos de equipamentos que utilizam softwares: microcomputadores da família PC, MAC, IBM, celulares mais modernos, televisões mais modernas, etc. Exemplos de softwares que parecem firmwares: programa para kits de didáticos, programas para kits de desenvolvimento. 2.3.1 – Compilador O desenvolvimento do firmware gravado no microcontrolador foi feito usandose o CCS C Compiler versão 4.074. Este compilador, apesar de ser muito bom para fins didático e para desenvolvimento rápido é muito deficiente em relação à otimização de código assembly gerado e acesso direto aos registradores do microcontrolador. Optou-se por usar este compilador devido às ferramentas para comunicação serial e a transparência do código escrito. 2.3.2 – Metodologia de desenvolvimento A forma de programar um sistema embarcado é diferente de programar um computador de uso geral. Na programação de um computador têm-se um fim de execução do programa, em um sistema embarcado não. Em um sistema embarcado existem basicamente duas etapas em sua programação: a inicialização e o laço principal. Na inicialização são feitos todos os tipos de configurações e inicializações de variáveis e periféricos. Já no laço principal é feita a execução de rotinas que só cessará quando o dispositivo for desligado, ou seja, um laço é infinito. Um firmware eficiente é um firmware desenvolvido com um único laço (sem for ou while): o laço principal. Todos os outros laços devem ser feitos com estruturas de seleção (if-else switch-case) dentro do laço principal. Deve-se passar pelo início do laço o mais freqüente possível para que se possa realizar comandos de varredura ou testes que dependem de respostas rápidas o mais rápido possível sem deixar o microcontrolador esperando estes resultados. O microcontrolador deve saber qual instrução executar em uma passagem pelo laço com base na instrução executada na ultima passagem pelo laço e nas variáveis de controle que podem direcionar para a execução de uma instrução específica. Um código eficiente tem o menor número de delays possível. Ao invés de usar delays, pode-se ter um timer rodando paralelo ao programa que dita quando um led deve piscar, por exemplo.
  7. 7. 2.4 – Software O software desenvolvido não acompanha o kit didático tendo em vista que o objetivo do kit é justamente possibilitar o usuário desenvolver um software para o sistema de controle. Entretanto, criou-se um software exemplo, para mostrar o funcionamento do kit. 2.4.1 - Interface com a placa A interface com a placa é feita com a porta serial RS232 do microcomputador. O programa pode ser desenvolvido em alguma plataforma de desenvolvimento Delphi, C+ + Builder, Visual Basic, Visual Studio, Eclipse ou em compiladores convencionais. Cabe ao desenvolvedor de compiladores convencionais desenvolverem o código para acessar a porta serial do microcomputador. A placa desenvolvida é uma placa escrava, ou seja, ela só faz o que mandam fazer e só responde o que perguntam. Ocorre uma exceção quando a temperatura do resistor ultrapassa 105 º C, nesta situação a placa encarrega-se de rebaixar a temperatura do resistor e envia um alerta para o microcomputador. Existem basicamente 13 comandos que a placa pode responder: ‘i’ ‘d’ ‘I’ ‘D’ ‘c’ ‘C’ ‘l’ ‘L’ ‘t’ ‘r’ ‘p’ ‘P’ ‘h’ Incrementar o PWM da ventoinha Decrementar o PWM da ventoinha Incrementar o PWM do resistor Decrementar o PWM do resistor Zerar o PWM da ventoinha Põe o PWM da ventoinha no máximo Zerar o PWM do resistor Põe o PWM do resistor no máximo Pede o envio do valor da temperatura Pede o envio do valor da rotação // valor do PWM da ventoinha // valor do PWM do resistor Reconhecimento da placa Da mesma forma, a placa responde o caracter enviado acompanhado de um numero inteiro de 5 casas preenchidas com 0. Ex: recebe ‘t’ envia “t00048”
  8. 8. 2.4.2 – Software de demonstração Imagem do software de interface O software foi desenvolvido na plataforma Delphi 7 da antiga Borland, hoje Embarcadero. Abaixo estão as descrições de cada componente da imagem. O plano cartesiano, representado pelo componente “TChart” no canto inferior direito mostra a variação de temperatura em função do tempo do sistema. O groupbox intitulado “Comunicação com a placa” indica o estado da porta COM do computador e se a placa foi reconhecida pelo sistema. O radiogroup “Métodos de Controle” possui dois radiobuttons que permitem o usuário escolher se deseja que o sistema controle a placa ou se deseja fazer o controle manual dos parâmetros. O groupbox “Interface” permite iniciar o teste e escrever qual é a temperatura desejada do sistema. O radiogroup “Seleção do sistema” permite o usuário escolher se quer simular um forno controlado ou uma carga que deve ser resfriada. Em uma situação pode-se variar o pwm do resistor, na outra o do cooler. O groupbox “PWM Controle” é habilitado apenas no controle manual e serve para o usuário definir o valor de pwm do resistor e pwm do cooler. O groupbox “Informações do sistema” indica o estado do pwm do resistor, do cooler e a temperatura do resistor. O checkbox “Salvar em arquivo”, se selecionado no início do teste guarda as informações em um arquivo de texto. O botão sair serve para sair desligando todos os periféricos da placa antes.
  9. 9. 3 - Conclusão Desenvolver um kit didático representa desenvolver uma ferramenta de aprendizado. Por este motivo torna-se muito mais trabalhoso pois deve-se prever todas as ações de uma pessoa que está em treinamento,é diferente de desenvolver um produto comum. Ao mesmo tempo em que se deve dar liberdade para o sistema fazer o que a pessoa quiser, deve-se ter a segurança de monitorar o estado do sistema e entrar em alerta caso algo dê errado. Sem dúvidas, o desenvolvimento deste projeto trouxe conhecimentos não só do conteúdo que deveria ser visto em sala de aula, mas da área didática e da área de desenvolvimento de produto.
  10. 10. Apêndice A – Diagrama esquemático da placa
  11. 11. Apêndice B – Firmware do mircrocontrolador //inclusão de bibliotecas #include <16F877A.h> //configurações do dispositivo #device adc = 10 #fuses HS, WDT #use delay(clock = 4000000) #use rs232 (baud = 9600, xmit = PIN_C6, rcv=PIN_C7) //Endereçamento de resgistradores #byte PORTA = 0x05 #byte PORTB = 0x06 #byte PORTC = 0x07 #byte PORTD = 0x08 #byte PORTE = 0X09 #byte TRISA = 0x85 #byte TRISB = 0x86 #byte TRISC = 0x87 #byte TRISD = 0x88 #byte TRISE = 0x89 #byte OPTION_REG = 0x81 #byte CCPR1L = 0x15 #byte CCPR1H = 0x16 #byte CCP1CON = 0x17 #byte CCPR2L = 0x1b #byte CCPR2H = 0x1c #byte CCP2CON = 0x1d #bit RB0 = PORTB.0 #bit RB4 = PORTB.4 #bit RC1 = PORTC.1 #bit RC2 = PORTC.2 #bit T0CS = OPTION_REG.5 #bit PSA = OPTION_REG.3 #bit PS2 = OPTION_REG.2 #bit PS1 = OPTION_REG.1 #bit PS0 = OPTION_REG.0 #bit TRISC1 = TRISC.1 #bit TRISB4 = TRISC.4 #define pwm_c_reg CCPR1L #define pwm_r_reg CCPR2L #define sentido_pino_led TRISB4 //Definições de pinos
  12. 12. #define ft #define led RB0 RB4 //Definições dos estados de máquina e valores constantes #define EST_LE_TEMP 0 #define EST_PRC_ERR 1 #define EST_PWMC_INC 'i' #define EST_PWMC_DEC 'd' #define EST_PWMR_INC 'I' #define EST_PWMR_DEC 'D' #define EST_PWMC_MIN 'c' #define EST_PWMC_MAX 'C' #define EST_PWMR_MIN 'l' #define EST_PWMR_MAX 'L' #define EST_ENV_TEMP 't' #define EST_ENV_ROT 'r' #define EST_ENV_PWMC 'p' #define EST_ENV_PWMR 'P' #define EST_HND_SHKN 'h' #define TEMP_MAX 210 #define TEMP_MIN 100 //para o valor real, dividir por 2 //variáveis globais short erro = 0; char buffer[8]; unsigned int sm = 0,sma = 0, pwm_c = 0, pwm_r = 0; unsigned long int temp = 0, np = 0, rpm = 0; //protótipos de subrotinas void inicializa(); void processo(); void config_ad(); void config_pwm(); void comunica(); void config_io(); void reset_wdt(); void config_wdt(); void le_temp(); void config_timer1(); void config_interrupts(); void procura_erro(); void init_signal(); //interrupções #INT_EXT void trata_ext0()
  13. 13. { np++; } #INT_TIMER1 void trata_timer1() { static unsigned int cont = 0; if(cont<20) { cont++; } else { //efetua o cálculo a cada 1 s cont = 0; rpm = np * 60; np = 0; if(erro) { sentido_pino_led = 1; //configura o pino do led como entrada led = !led; //coloca no buffer de saída o inverso do estado do buffer de entrada sentido_pino_led = 0; //configura o pino como saída putc(‘a’); } } set_timer1(15536); //time out após 50 ms } //main void main() { inicializa(); while(1) { comunica(); processo(); reset_wdt(); } } void inicializa() { config_wdt(); config_io(); init_signal(); config_ad();
  14. 14. config_pwm(); config_timer1(); config_interrupts(); init_signal(); } void comunica() { if(kbhit()) //se houver algo no buffer de recepção,executa { sma = sm; //armazena o valor do estado de máquina atual sm = getc(); //pula para o estado indicado pelo caracter recebido } } void processo() { switch(sm) { //estados de execução normal do programa case EST_LE_TEMP: le_temp(); sm = EST_PRC_ERR; //pula para o estado "procura erro" break; case EST_PRC_ERR: procura_erro(); sm = EST_LE_TEMP; //pula para o estado "lê temperatura" break; //estados de tratamento de interrupção case EST_ENV_TEMP: sprintf(buffer,"t%5lu", temp); //imprime o valor medido de temperatura em uma string puts(buffer); //envia a string pelo dispositivo de saída padrão, o periférico USART sm = sma; //retorna para o estado anterior antes da "interrupção" break; case EST_ENV_ROT: sprintf(buffer,"r%5lu", rpm); puts(buffer); sm = sma; break; case EST_ENV_PWMC: pwm_c = pwm_c_reg; sprintf(buffer,"p%5u", pwm_c); puts(buffer); sm = sma; break;
  15. 15. case EST_ENV_PWMR: pwm_r = pwm_r_reg; sprintf(buffer,"P%5u", pwm_r); puts(buffer); sm = sma; break; case EST_PWMC_INC: if(pwm_c<255) pwm_c++; pwm_c_reg = pwm_c; sm = sma; break; case EST_PWMC_DEC: if(pwm_c>0) pwm_c--; pwm_c_reg = pwm_c; sm = sma; break; case EST_PWMC_MIN: pwm_c = 0; pwm_c_reg = pwm_c; sm = sma; break; case EST_PWMC_MAX: pwm_c = 255; pwm_c_reg = pwm_c; sm = sma; break; case EST_PWMR_INC: if(pwm_r<255) pwm_r++; pwm_r_reg = pwm_r; sm = sma; break; case EST_PWMR_DEC: if(pwm_r>0) pwm_r--; pwm_r_reg = pwm_r; sm = sma; break; case EST_PWMR_MIN: pwm_r = 0; pwm_r_reg = pwm_r; sm = sma; break; case EST_PWMR_MAX: pwm_r = 255; pwm_r_reg = pwm_r; sm = sma; break;
  16. 16. case EST_HND_SHKN: sprintf(buffer,"HS_OK"); //HANDSHAKING puts(buffer); sm = sma; break; default: sm = sma; estado de máquina anterior //caso receba algum caracter inválido, retorna para o } } void config_ad() //configura o periférico adc { setup_ADC_ports(RA0_analog); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); } void config_pwm() //configura os dois módulos ccp como geradores de sinal pwm { setup_timer_2(T2_DIV_BY_1,255,1); setup_ccp1(ccp_pwm); set_pwm1_duty(0); setup_ccp2(ccp_pwm); set_pwm2_duty(0); } void config_io() //configura a direção dos pinos(entrada ou saída) { TRISA = 0xff; TRISB = 0b11101111; TRISC = 0b11111001; TRISD = 0xff; TRISE = 0xff; pwm_c = 0; pwm_r = 0; led = 1; } void config_wdt() //configura o watch dog timer { PSA = 1; //preescaler para o watch dog timer não para o timer 0 PS2 = 1; //preescaler de 1:128 PS1 = 1;
  17. 17. PS0 = 1; } void reset_wdt() //chama uma instrução assembly para resetar o wdt { #asm CLRWDT #endasm } void le_temp() //realiza a leitura do pino analógico ligado ao sensor de temperatura { //soma as leituras a cada passada. Quando passa pela oitava vez //obtêm a média dos valores e atualiza o variável global que indica a //temperatura static int cont = 0; static unsigned long int buffer_ad = 0; if(cont<8) //lê e soma 8 amostras { buffer_ad = buffer_ad + read_adc(); cont++; } else { cont = 0; temp = buffer_ad >> 3; //divide por 8 buffer_ad = 0; } } void config_timer1() //configura o timer 1 { setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // clock interno de 1 MHz set_timer1(15536); //time out após 50 ms } void config_interrupts() //configura as fontes de interrupção { enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); enable_interrupts(INT_TIMER1); ext_int_edge(0,H_TO_L); } void procura_erro() //verifica se a temperatura do resistor está muito alta { //e entra em estado de alerta caso esteja static short flag = 0; if(temp>TEMP_MAX)
  18. 18. { pwm_r = 0; pwm_r_reg = pwm_r; pwm_c = 255; pwm_c_reg = pwm_c; erro = 1; flag = 1; } if(temp<TEMP_MIN && flag) { erro = 0; pwm_c = 0; pwm_c_reg = pwm_c; led = 1; flag = 0; } } void init_signal() //piscada inicial do led { led = 0; delay_ms(200); led = 1; delay_ms(200); }

×