Autor Tema: Ayuda con PWM pic16f877a  (Leído 2363 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jeanvial

  • PIC10
  • *
  • Mensajes: 5
Ayuda con PWM pic16f877a
« 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);
 }

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con PWM pic16f877a
« Respuesta #1 en: 13 de Septiembre de 2006, 11:23:11 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything