Hola distro,
Me he tomado la libertad de hacer pequeñas modificaciones a tu codigo para intentar simular lo que propones.
Tengo un par de dudas que espero me puedas resolver:
1.- Por que has definido unos parametros de timer 2 tan bajos? El timer 2 se desborda muy rapido.
2.- Porque haces una comparacion entre "voltaje" y 0.5
Debes ajustar el timer 2 para que genere un periodo equivalente al tiempo de lectura del ADC, si no, no haces una lectura buena.
Al mezclar variables de distinto tipo debes usar los castings para que no haya problemas de conversion, si no el valor de voltaje siempre es 0.00 y por eso no funciona.
Echale un vistazo a este codigo y simulalo en proteus, usa el osciloscopio y el virtual terminal y podras ver lo que te comento.
El ADC solo esta leyendo 0 ó 255, nunca valores intermedios y eso se puede deber a dos cosas, una es que no se pueda usar un PWM como señal analogica de entrada( cosa con la que no estoy de acuerdo) y otra que los tiempos de lectura del adc no se ajustan al periodo del PWM y hace lecturas erroneas.
Espero que te pueda servir el codigo aunque lo tengas que adaptar para tus necesidades concretas.
#include <16f873A.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NODEBUG,BROWNOUT,NOLVP,NOCPD,NOWRT
#device ADC=8
#use delay(CLOCK = 4000000)
#use RS232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)
void main (void)
{
unsigned int8 medicion;
float voltaje;
unsigned int8 duty=127;
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_ADC_PORTS(AN0);
SET_ADC_CHANNEL(0);
setup_timer_2(T2_DIV_BY_4, 255, 1);
setup_ccp1 (CCP_PWM);
setup_ccp2 (CCP_PWM);
while (true)
{
delay_us(10);
medicion=read_adc ();
voltaje= ((float)(medicion)*5/256);
if(voltaje>0.5){
duty=duty-1;
}
else{
duty=duty+1;
}
printf("ADC= %u, V= %f, duty= %u\r\n",medicion,voltaje,duty);
set_pwm1_duty(duty);
set_pwm2_duty(duty);
}
}
Saludos