No creo que sea buena idea eso del período a 3ms como lo tienes ahora.
No conozco el entero funcionamiento de los servos, pero siempre trabajo bajo la premisa que el fabricante lo conoce mejor y hay que respetar sus especificaciones.
Trabajar con interrupciones no es tan difícil, si ya lo has hecho, pues ahora lo que vas a hacer es cambiar de interrupción. Yo creo que sí puedes.
Ahora bien, si quieres trabajarlo así, sin interrupciones, es tu decisión. Pero entonces por lo menos coloca:
setup_timer_2(T2_DIV_BY_16,255,1);
Para que aunque sea el período sea de unos 4ms...
En cuanto a esto:
y ademas e creado una nueva variable de "correccion" para la conversion adc cuando la mete al PWM.
Así como lo estás haciendo está medio extraño.
Porque estás multiplicando el valor leído del CAD por un valor float, pero después lo guardas en un entero?
Yo te recomendaría que guardaras la lectura en una variable int16, o long; luego multipliques por el factor en float y guardes en otra variable float; y después pases la variable float a entero haciendo casting.
Aunque sinceramente, no le veo lógica a eso. ¿Qué es lo que hace exactamente esa corrección?
Porque la conversión A/D la puedes configurar a 10bits, y luego el valor de duty también es de 10bits... entonces qué necesitas corregir?
Espero haberme explicado.
Como siempre digo, sólo son sugerencias, la decisión final está en tus manos.
Nos leemos!