Problema con PWM inestable

Hola a todos, estoy tratando de hacer funcionar un PWM mediante ADC y desplegar el valor en un LCD. Pero la señal es inestable. Haber si me pueden decir porque.
Adjunto una simulacion en proteus.
Gracias.

#include <16f877a.h>
#device adc=10 /// libreria para el manejo del pic16f877a
#use delay(clock=4000000) /// declara la frecuencia del cristal
#fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include <lcd.c>
void main(void)

{
float ct ,bits;
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
bits=read_adc();
set_adc_channel(0);
set_tris_c(0);
setup_timer_2(T2_DIV_BY_16,207,1);// El periodo de la señal PWM de 3.3 ms.
setup_ccp1(CCP_PWM); // Configura CCP1 en modo PWM

lcd_init();
lcd_gotoxy(6,1);
lcd_putc("PWM");
delay_ms(1000);
lcd_putc("\f");

while(true)
{
set_adc_channel(0);
delay_us(10);
bits=read_adc();
delay_us(10);
set_pwm1_duty(bits);// La anchura del pulso



ct=(bits*100)/1023;
lcd_gotoxy(1,1);
lcd_putc("FREC=300 HZ");
lcd_gotoxy(1,5);
printf(LCD_PUTC,"CICLO T=%4.2f",ct);

}}
 

Adjuntos

  • PWMLCD.rar
    28.3 KB · Visitas: 5
Creo que el Duty del PWM es de 8 Bits y tu estas usando Duty=ADC que es de 10 Bits, lee el ADC con 8 Bits ese debe ser el problema
 
No entiendo como no puedes leer en 8 bits, lo que te dije en el mensaje anterior fue pasar de 10 a 8 Bits 1023/4=255, Bueno casi,casi... jeje por eso cuando pones a fondo el pote por ejemplo read_adc=1023/4=255.75 ese .75 te hace caer a "0" nuevamente, que creo que es lo que esta pasando. Por ejemplo si sumamos .4 a 10 serán 10 pero si le sumamos .5 a 10 serán 11 Bits, bueno creo que me entiendes jeje...
Ya intentaste hacer esto:
#device adc=8
Otra opción sería utilizar bloques if
por ejemplo: si bits >255 bits=255 etc...
 
Atrás
Arriba