1ªmente registre-se que nunca usei este mc.
Perdão por não analisar com a profundidade que você merece mas tentei sim por alguns instantes amigo e vi só a superfície. Seguinte...
-você parece usar rotinas prontas e mastigadas pra controlar a o pwm e afins. Isto não é totalmente ruim mas te priva de um controle mais absoluto. Por gentileza, consulte o d.s. e atue diretamente nos registradores, entendendo-os e etc
-não consegui ver onde e como você configura dutty cicle pwm na interrupt. Vi apenas uma variável mudando de estado. Em algum momento escondido ela deve atuar no pwm né?
-informe(-se) o quê , quando, onde, porquê ocorre e o quê achas que devia ocorrer. Ou seja responda-se melhor "não funciona" e "começa a travar"
-se usas o proteus ou mplab tem um recurso bem legal que é o break point que podes parar e ver as variáveis e registros p.ex.
-Va por partes. P.ex. desabilite alguma coisa pra fazer outra e veja que está zoando quem.
-Entenda/domine melhor o pwm deste mc. p.ex. fazendo-o gerar uma onda senoidal com um filtro rc.
-Seu programa-sistema-projeto parece estar muito grande. Apesar de eu não conhecer detalhes, penso que pode ser otimizado em tamanho e eficiência
-etc
E finalmente, desculpe antecipadamente pelo desabafo, se estiveres apenas copiando e colando da net, só pra ficar livre do trabalho e sem querer entender nada, sinto mas teremos alguma dificuldade. Sim... tem pessoas com estas características e claro, não teu caso...
abç