Hola estoy haciendo el siguiente programa que modifica el valor PWM de una salida en funcion de dos entradas analógicas. Una va a ser un potenciómetro para seleccionar un voltaje en una fuente y el otro la salida de la fuente con el fin de regularla. El proyecto que hice es el siguiente, y tras varios problemas di con la solución y por lo menos di con la forma de que me simule en proteus el lcd y el pwm mas o menos.
Pero en la realidad el LCD muestra la primera linea en negro (y no es problema del ajuste de brillo) y el pwm no se mueve al mover el pot)
En Proteus el lcd funciona correctamente y el PWM si aumenta cuando tiene que aumentar, pero en vez de parar el punto mas alto (D=99% o 100%) empieza a variar la frecuencia y hace otro PWM con otra frecuencia.
Subo abajo el proyecto.
#include <16F876A.h>
#device adc=10
#use delay(clock=4000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
#include <LCD.C>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long volt, salida;
int d=1; //de 0 a 132
void main()
{
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,32,1);
setup_ccp1(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
do
{
set_adc_channel( 0 );
volt =read_adc();
set_adc_channel(1);
salida = read_adc();
if (volt>salida)
{
if (d<180)
d++;
}
if (volt<salida)
{
if (d>0)
d--;
}
set_pwm1_duty(d);
// ahora empezamos con las tareas del LCD
delay_ms(10);
printf(lcd_putc," \f v= %Ld,s= %Ld", volt, salida);
}while (1);
}
Les agradeceria que me ayuden para ver que estoy haciendo mal. Muchas gracias
Pero en la realidad el LCD muestra la primera linea en negro (y no es problema del ajuste de brillo) y el pwm no se mueve al mover el pot)
En Proteus el lcd funciona correctamente y el PWM si aumenta cuando tiene que aumentar, pero en vez de parar el punto mas alto (D=99% o 100%) empieza a variar la frecuencia y hace otro PWM con otra frecuencia.
Subo abajo el proyecto.
#include <16F876A.h>
#device adc=10
#use delay(clock=4000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
#include <LCD.C>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long volt, salida;
int d=1; //de 0 a 132
void main()
{
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,32,1);
setup_ccp1(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
do
{
set_adc_channel( 0 );
volt =read_adc();
set_adc_channel(1);
salida = read_adc();
if (volt>salida)
{
if (d<180)
d++;
}
if (volt<salida)
{
if (d>0)
d--;
}
set_pwm1_duty(d);
// ahora empezamos con las tareas del LCD
delay_ms(10);
printf(lcd_putc," \f v= %Ld,s= %Ld", volt, salida);
}while (1);
}
Les agradeceria que me ayuden para ver que estoy haciendo mal. Muchas gracias