Bien vamos al tema, lo primero que me llama la atencion es que teniendo la definicion de duty una longitud de 16 bits, (set_pwm1_duty((int16)248) solo son validos valores entre 0 y 499. El resto o sea hasta 16583, los acepta sin errores, pero no cambian nada, quedando el motor al maximo de su velocidad a partir de 500. ¿Porque ocurre eso? y ¿Porque precisamente 499?.
Voy a responderlo rapido: Por que no leiste el datasheet
El duty no es de 16 bits, el duty es de maximo 10 bits, conformados 2 bits de un registro ( estos son los bits de menor peso ) y 8 mas que tiene un registro CCPR1L siendo los de mayor peso este ultimo.
Ahora lo mejor es ver el diagrama del Timer y del CCP para entenderle como es que funcionan.
En el Timer 2 cargaste tu Periodo, el Timer 2 va a contar desde 0 a ese periodo y volver a 0. Es decir que el Timer2 se compara con ese registro y ante una coincidencia se activa la salida y ademas pone a 0 el TMR2.
Ahora el Duty funciona de una forma parecida. Nomas que son 10 bits, ¿como haces para comparar 10 bits contra 8?, bueno el micro genera esos 2 ultimos bits. Algo simple de hacer que no viene al caso y si estas interesado lo explico. En fin.. quedando algo asi:
TMR2:2bitsgenerados
Y formando los 10 bits. OK, ahora veamos que valores puede llegar a tener el duty.. en TMR2 pusiste un valor de periodo de 124 ( 0x7C ), pero deberiamos multiplicarlo por 4 ya que ahora estamos moviendolo a la izquierda 2 bits y poniendo bits nuevos. lo cual te deja en 496 + 0 a 3 de los ultimos 2 bits
Ahi tenes el por que podes variarlo solo desde 0 a 499 el duty. Y si queres la mayor resolucion posible tenes que intentar que el periodo sea lo mas proximo a 255. Lamentablemente Microchip decidio ponerlo pocas opciones de preescaler al TMR2.
Resumiendo:
El TMR2 es lo unico que cuenta, lo demas son valores que dan coincidencia y activan/desactivan la salida del PWM, luego hay una logica combinacional que maneja las 1/2/4 salidas.
Cuando coincide el valor del duty con el del (TMR2*4) + 0 a 3 , se apaga la salida
Cuando coincide el valor del duty con el periodo , la salida se enciende y se pone nuevamente a 0 el TMR2
Si el duty es muy grande, jamas habria una coincidencia por lo cual nunca se pondria a 0 la salida, y el TMR2 llegaria a coincidir con el periodo, lo cual volveria a 0 el contador y por ende jamas llegarias al valor del duty dejandote en 100% de duty.
La segunda cuestion es que el puente H, no esta funcionando, el PIC solo activa permanentemente la salida P1A, incluso cuando el PWM es 0 y aplica el PWM a la salida P1C. Las salidas P1B y P1D no se utilizan nunca, a pesar de estar declarado como puente H,
Si solo supiera cual es el codigo de setup_ccp1(), por eso odio CCS, al menos se lo que pongo en los registros. Ya que estoy mas que seguro que le estas errando en lo que pones dentro.
Por ejemplo:
CCP_PWM|CCP_PWM_FULL_BRIDGE
Es un problema... Deberias tener uno solo que deberia ser: CCP_PWM_FULL_BRIDGE , ya que tal ves CCP_PWM lo hace simple output, pero la combinacion de ambos (la OR) termina siendo como de 2 salidas.
Si no funciona asi, deberas esperar a alguno que sepa mas de CCS que yo, yo busque en el manual y trate de asimilarlo con el datasheet pero hay cosas que son imposibles.