Voy a suponer un PWM de 500 posiciones, aproximadamente 9bits ( no llega ). Para 1s necesitaria: 1s/500 = 2ms
Es decir cada 2ms debo revisar si corresponde o no activar o no la salida.
Supongo que poseo 2 salidas llamadas PWMOutA y PWMOutB, cada una va a tener su propia varaible que mantiene un valor entre 0 a 499 que vamos a llamar PWMVarA y PWMVarB
Creo una interrupcion de un timer cualquiera ( 0,1 o 2) cada 2ms. Dentro de la interrupcion del timer simplemente pregunto...
funcionInterrupcion timer(void)
{
si(contador >= 499)
{
contador = 0;
PWMOutA = 1;
PWMOutB = 1;
}
si(PWMVarA == contador) { PWMOutA = 0;}
si(PWMVarB == contador) { PWMOutB = 0;}
contador++;
}
Entonces... Suponete que inicia el programa, pones las salidas a 1. Y PWMVarA en 100, cada 2ms va a entrar, y hasta que contador no sea 100, va a seguir en 1 la salida, cuando sea 100 la va a poner en 0. Y no va a volver a 1 hasta que contador no llegue a los 499. Volviendo a comenzar todo de nuevo.
En resumen al poner un 99 en PWMVarA, simplemente creaste un PWM con un duty (el 0 cuenta tambien) de 100/500 = 0.2 o 20% ( o si lo queres en tiempo 100*2ms = 200ms en 1) y con un periodo de 1s.
PD:
El codigo ademas de usar mala sintaxis y posiblemente los valores tambien, tiene un pequeño problema que hace que la salida varie si esta en 0 el duty momentaneamente. Esto queda en vos arreglarlo.