Primero que nada el cálculo del periodo se hace como habíamos dicho con la siguiente fórmula:
\mathrm{Periodo PWM}=\left(\mathrm{PR2} + 1 \right)\cdot 4\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}
\mathrm{Frecuencia PWM}=\frac {1}{\mathrm{Periodo PWM}}
PR2 entre 0 y 255
Tosc= 1/16MHz = 62.5 ns
TMR2 Preescaler= 1:1, 1:4, 1:16 -> x1, x4, x16
Con estos valores el rango de frecuencia de la señal PWM es:
4MHz a 976.56 Hz.
4Mhz = 1 / { (0 + 1) . 4. 62.5ns . 1 } y 976.56 Hz = 1 / {(255 + 1) . 4 . 62.5ns . 16}
El tema del error de temporización no se que decir, nunca tuve problemas al respecto. :?
Y este sector del código:
void lectura_adc(){ //función de lectura del ADC y su respectiva configuración
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(1);
setup_adc_ports(AN0);
delay_ms(1);
set_adc_channel(0);
delay_ms(1);
value1=(float)read_adc();
delay_ms(1);
setup_adc(ADC_OFF);
}
se puede cambiar y quedar así:
void lectura_adc(){ //función de lectura del ADC y su respectiva configuración
set_adc_channel(0);
delay_us(20);
value1=(float)read_adc();
}
Esto colocarlo al principio de main:
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0);
Y no apagarlo nunca.
Las instrucciones que más demoras son:
value1=(float)read_adc();
if(value1<(512)){
if(value1>(512)){