Por otra parte, no entiendo cómo el ciclo de trabajo (duty cycle) dispone de 10 bits para cargar su valor y el periodo sólo de 8, cuando el periodo siempre será mayor que el ciclo de trabajo.
El período de trabajo se compone de los 8 bits del registro, más dos bits adicionales que corresponden a las fases del reloj.
Del reloj del sistema se derivan internamente 3 señales más, o fases de reloj, quedando la fase principal (0º) y las otras 3 (90º, 180º, 270º). (Esto se usa para la decodificación interna de instrucciones creo).
Con esos dos bits (que no están en el registro de período) estarías seleccionando con que fase de reloj se hace la cuenta del período.
Por suerte esto es transparente al usuario, la cosa funciona como si el período fuera de 10 bits.
Igual no he entendido bien el funcionamiento del registro CCP modo PWM.
El modo PWM da una salida a un pin físico del PIC, con una frecuencia determinada por el registro de período, y un ciclo de trabajo fijado por el registro de ciclo de trabajo (las fórmulas están en las hojas de datos de cada PIC, depende también de la selección que se haga de los pre/post-escaladores, del reloj del sistema, etc).
Hay una base de tiempo, que no es otra cosa que un contador, que inicia la cuenta al habilitarse el módulo, y que tendrá una entrada de reloj también pre-establecida. Cuando la cuenta llega al valor establecido en el registro de ciclo de trabajo, el pin de salida cambia de estado (si es 0 y 1 también depende de la configuración del módulo), y cuando el mismo contador llega al valor establecido en el registro de período (más los dos bits ficticios por esto de las fases del reloj) la salida vuelve a cambiar de estado y se vuelve a iniciar la cuenta (en los PIC's que usan módulos PWM para control de motores = PCPWM, puede hacerse que llegado a este punto se inicie la cuenta regresiva.... igual no creo que sea tu caso).
He hecho los cálculos y, para una precisión de 0.5 grados necesito cargar un valor de 11 bits para generar el periodo. Sin embargo sólo dispongo de 8 bits en PR2.
¿Cómo puedo hacerlo?
Bueno, según tengo entendido (que me corrigan los colegas del foro si me equivoco*) cuando la base de tiemp/el contador del módulo PWM completa un período, esto es, alcanza el valor del registro de período, se tiene la opción de generar un pedido de interrupción.
En esa rutina de interrupción tendríamos que simular un bit más (son 8 de PR2 + 2 de fases de reloj = 10, nos falta uno).
Lo que haría sería configurar la base de tiempo del módulo PWM para que cuente más rápido, 2 veces más rápido que la frecuencia que quiero generar (a 100 Hz).
Luego en el registro de período cargo los 10 bits menos significativos, y el más significativo lo cargo en donde me quede cómodo (llamémoslo MSB).
La idea sería arrancar el módulo normalmente, se produce la primera interrupción (a los 10 ms porque la base de tiempo esta puesta a la mitad del que yo quiero 20ms<-50 Hz).
Hay dos casos, si el MSB es = 1 la rutina de interrupción no haría absolutamente nada.
Pero si es igual a cero la rutina debe poner el registro de ciclo de trabajo = 0, habiéndolo guardado previamente en una variable temporal.
Luego en la próxima rutina de interrupción se recupera el valor del registro de ciclo de trabajo, y así en las sucesiva interrupciones se iría alternando en el registro de ciclo de trrabajo los valores y el valor inicial (que son los 10 bits menos significativos).
En los PIC's con PCPWM se puede anular la escritura del pin por parte del módulo, y mandar el pin a un valor de "override" (anulación sería, figura así en sus hojas de datos), pero ese mecanismo no está en los módulos CCP.
La idea podría extenderse para aumentar la resolución en n bits, pero el límite estaría dado por la velocidad de cuenta de la base de tiempo del PIC y la velocidad de ejecución de la rutina de interrupción.
Bueno, ojalá me hayas entendido algo, y que estos 15 minutos que te dediqué sirvan para algo.
Saludos