Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Faculdade Estácio de Curitiba Disciplina: Microprocessadores Professor: Henrique Marin van der Broocke Campos Aluno: valmir da silva MAT.: 201512576883 ATIVIDADE SOBRE PWM COM O PIC18F4550 1) Considere que se deseja desenvolver um sistema de monitoramento e controle de temperatura. Dispõe-se para isso do sensor de temperatura LM35, que possui saída em tensão, na taxa de 10 mV/0C. Deseja-se monitorar a temperatura de um forno industrial, que varia de 00C a 1000C. Considerar para a conversão Analógico-digital os pinos de entrada analógica de um microcontrolador, especificado para tensões de 0V até 5V, resolução de 10 bits e método de conversão A/D por Aproximações Sucessivas, com frequência de clock de 20 MHz. Valor: 1,0 a) Calcule a resolução (K) desta conversão A/D. 𝐾 = 𝑉𝐹𝐸 2𝑁−1 >> K= 5 210−1 >> K = 4,88 X 10−3 V / passos b) Para uma temperatura de 350C, calcule o número de passos de conversão. 10 mv = 1°C np = 𝑉𝐴 𝐾 = 350 X 10−3 4,88 X 10−3 np = 71,61 Passos X = 35°C X = 350 X 10^(-3) V c) Para uma temperatura de 350C, calcule o equivalente digital. (71)10 = (01000111)2 d) Considere que há um fator de conversão, necessário para converter o resultado da conversão A/D (num. de passos) no valor de temperatura medido pelo sensor. Calcule este fator de conversão para a temperatura de 350C. (fator de conversão) = (temperatura medida) / (num. de passos) Fc = 𝑇 𝑚 𝑁𝑃 >> 35°𝐶 71 = Fc = 0,49 2 e) Implemente este sistema de monitoramento de temperatura utilizando o PICSIMLAB, de forma que a temperatura medida seja exibida no display de LCD. /* Exemplo de termometro digital */ #include <18F4550.h> #device adc=10 #fuses HS, MCLR, NOWDT #use delay(clock=20MHz) #define LCD_DB0 PIN_D0 #define LCD_DB1 PIN_D1 #define LCD_DB2 PIN_D2 #define LCD_DB3 PIN_D3 #define LCD_DB4 PIN_D4 #define LCD_DB5 PIN_D5 #define LCD_DB6 PIN_D6 #define LCD_DB7 PIN_D7 #define LCD_E PIN_E1 #define LCD_RS PIN_E2 #include <flex_lcd.c> void main () { unsigned int16 temp; float temp_media = 35; float num_pass = 71; // número de passos float fator_convert; lcd_init(); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(ALL_ANALOG); while(true) { fator_convert = temp_media / num_pass; output_bit(PIN_C5, 1); set_adc_channel(2); 3 delay_ms(1000); temp = read_adc() * fator_convert; delay_ms(1000); printf(LCD_PUTC, "\fTEMP DIG: %lu", temp); } } 4 2) Implemente novamente, acrescentando o uso do módulo PWM, de forma que a ventoinha seja acionada por diferentes potências, em conformidade com a temperatura medida e apresentada no display de LCD. Determinar alguns intervalos de variação da temperatura e a respectiva potência da ventoinha, considerando que a redução da temperatura permite a ventoinha operar com menor potência. Exemplo: acima ou igual a 400C a ventoinha opera com a máxima potência. Entre 350C a 390C a ventoinha opera com 80% da potência máxima. Entre 300C a 340C a ventoinha opera com 60% da potência máxima. Abaixo de 30 0C a ventoinha desliga. Enviar um arquivo PDF contendo as respostas e cálculos dos itens “a” até “d”, os códigos implementados dos itens “e” e “f” e nome do(s) aluno(s). Enviar também os arquivos gerados pelo compilador utilizado. Valor: 2,0 /* Exemplo de termometro digital */ #include <18F4550.h> #device adc=10 #fuses HS, MCLR, NOWDT #use delay(clock=20MHz) #define LCD_DB0 PIN_D0 #define LCD_DB1 PIN_D1 #define LCD_DB2 PIN_D2 #define LCD_DB3 PIN_D3 #define LCD_DB4 PIN_D4 #define LCD_DB5 PIN_D5 #define LCD_DB6 PIN_D6 #define LCD_DB7 PIN_D7 #define LCD_E PIN_E1 #define LCD_RS PIN_E2 #include <flex_lcd.c> void main () { unsigned int16 P; unsigned int16 PR2 = 127; unsigned int16 duty; unsigned int16 temp; 5 float temp_media = 35; float num_pass = 71; float fator_convert; float t_pwm; lcd_init(); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(ALL_ANALOG); setup_ccp1(CCP_PWM); while(true) { fator_convert = temp_media / num_pass; output_bit(PIN_C5, 1); set_adc_channel(2); delay_ms(1000); temp = read_adc() * fator_convert; //leitura da temperatura0 delay_ms(1000); if(temp < 30){ set_adc_channel(0); P = 0; PR2 = read_adc(); setup_timer_2(T2_DIV_BY_16, PR2, 1); / duty = (unsigned int16)((PR2 + 1) * 4 * (P/100.0)); set_pwm1_duty(duty); t_pwm = (float)((PR2 + 1) * 4.0 * (1/8000000.0) * 16); printf(LCD_PUTC, "\fT PWM: %.8f", t_pwm); printf(LCD_PUTC, "\n%lu | %f", PR2, 1/t_pwm); delay_ms(500); } if(temp > 30 && temp < 35){ set_adc_channel(0); P = 60; PR2 = read_adc(); 6 setup_timer_2(T2_DIV_BY_16, PR2, 1); duty = (unsigned int16)((PR2 + 1) * 4 * (P/100.0)); set_pwm1_duty(duty); t_pwm = (float)((PR2 + 1) * 4.0 * (1/8000000.0) * 16); printf(LCD_PUTC, "\fT PWM: %.8f", t_pwm); printf(LCD_PUTC, "\n%lu | %f", PR2, 1/t_pwm); delay_ms(500); } if(temp > 35 && temp < 39){ set_adc_channel(0); P = 80; PR2 = read_adc(); setup_timer_2(T2_DIV_BY_16, PR2, 1); duty = (unsigned int16)((PR2 + 1) * 4 * (P/100.0)); set_pwm1_duty(duty); t_pwm = (float)((PR2 + 1) * 4.0 * (1/8000000.0) * 16); printf(LCD_PUTC, "\fT PWM: %.8f", t_pwm); printf(LCD_PUTC, "\n%lu | %f", PR2, 1/t_pwm); delay_ms(500); } else{ set_adc_channel(0); P = 100; PR2 = read_adc(); setup_timer_2(T2_DIV_BY_16, PR2, 1); duty = (unsigned int16)((PR2 + 1) * 4 * (P/100.0)); set_pwm1_duty(duty); t_pwm = (float)((PR2 + 1) * 4.0 * (1/8000000.0) * 16); printf(LCD_PUTC, "\fT PWM: %.8f", t_pwm); printf(LCD_PUTC, "\n%lu | %f", PR2, 1/t_pwm); delay_ms(1000); } printf(LCD_PUTC, "\fTEMP DIG: %lu", temp); } } 7 8
Compartilhar