TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: jeanvial en 13 de Septiembre de 2006, 10:40:12
-
Hola a todos.
Por favor ayudenme si no hago esto voy a reprobar.
Tengo el siguiente programa que sirve para controlar la intencidad luminosa con un PWM, simulado en el proteus me da todo bien, pero fisicamente no me sale como en la simulación.
Cuando uso setup_adc( ADC_CLOCK_INTERNAL ); la salida de tatos que se muestran en el LCD es muy rapida y oscila mucho ¿como puedo cambiar la velocidad de refresco?
#include <16F877a.h>
#device adc=10
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use standard_io(A)
#include <lcd.c>
long valor=0;
const long escala=1023;
const float v_max=5.01;
void lectura_datos(void);
void modo_pwm(void);
void main(void){
lcd_init();
//lcd_gotoxy(1,1);
set_tris_a(0xFF); //puerto A como entratada
setup_adc_ports( ALL_ANALOG ); //seleccion de entradas analogicas
setup_adc( ADC_CLOCK_INTERNAL ); //habilita conversor
set_adc_channel( 0 ); //seleccion de canal
setup_ccp1(CCP_PWM); //configuracion de ccp1 en modo pwm
setup_timer_2(T2_DIV_BY_16,255,16); //definiendo el periodo del pwm
set_pwm1_duty(0);
for(;;){ ///bucle...
lectura_datos(); //llamada a la funcion lectura de datos
modo_pwm(); //llamada a la funcion de pwm
delay_ms(100); //cada 200ms realiza una lectura del conversor y muestra los nuevos datos por la lcd
} ///...infinito
}
void lectura_datos(void){
float tension;
float resolucion=.0050;
float result;
float temperatura;
valor = read_adc();
delay_us(10);
tension = ((valor * v_max) / escala);
result=(tension/resolucion * .73925);
temperatura=(result/10);
printf( lcd_putc, "\f %2.2f G Cent.",temperatura);
delay_ms(1000000);
}
void modo_pwm(){
set_pwm1_duty(valor);
}
-
Tengo el siguiente programa que sirve para controlar la intencidad luminosa con un PWM, simulado en el proteus me da todo bien, pero fisicamente no me sale como en la simulación.
Fíjate de poner el bit del tris correspondiente al PWM que estás usando en 0 para que sea configurado como salida.
Si no me equivoco sería el TRISC<1>.
Cuando uso setup_adc( ADC_CLOCK_INTERNAL ); la salida de tatos que se muestran en el LCD es muy rapida y oscila mucho ¿como puedo cambiar la velocidad de refresco?
Si no aclaras bien, según leo el muestreo es cada 200mseg, lo cual cambiaría 5 veces por segundo, si esto es muy rápido pues bien, cambia dicho tiempo y asunto solucionado.
Ahora si tu letura de A/D no es estable, esa es otra cuestión y puede deberse a
1) Que no esperes el tiempo suficiente antes de disparar la conversión
2) Que no esté bien filtrado el PIN de A/D que estas usando
3) Que tu fuente de referencia sea muy ruidosa.
Saludos