Buscar

ADC_PWM VALMIR DA SILVA 201512576883

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

Outros materiais