Ayuda Proyecto PWMs desfasadas con el temporizador del Timer 1

Hola,

Estoy trabajando en un proyecto de desfase de PWMs, mediante un timer para asi variar el angulo de desfase entre 2 PWMs con el mismo ciclo de trabajo. El gran inconveniente es que esas PWMs deben ser de 15[KHz] y utilizando un contador dentro de la interrupcion Overflow mediante el ISR, y sacando los calculos solo me salen PWMs de 400[Hz] aprox.

mi consulta es si es que estoy empleando mal el codigo o es que el nivel de prosesos por segundos el arduino no los puede realizar.

el codigo es:

#define ledPin 13
int maxdesp=20;
int desp;
int cont_a, cont_b;
int botonA, botonB;

void setup(){
  
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  pinMode(12,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
 
  noInterrupts();           
  TCCR1A = 0;
  TCCR1B = 0;

  TCNT1 = 65535;            // preload timer 65536-16MHz/1/15000*90
  TCCR1B |= (1 << CS10);    // 256 prescaler 
  TIMSK1 |= (1 << TOIE1);   // Habilito el desbordamiento
  interrupts();             
}

ISR(TIMER1_OVF_vect){       
  
  TCNT1 = 65535;            
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);

   if(_BV(TOV1)){  
  cont_a++;

  desp=90;

  if (cont_a == 180){
		
		cont_a=0;
	}
	
	if (cont_a > 90){
		
		digitalWrite(12,HIGH);
	}
	
	if (cont_a < 90){
		
		digitalWrite(12,LOW);
		
	}
	
	cont_b = cont_a + desp;
	
	if(cont_b >= 180){
		
		cont_b=cont_b-180;
	}
	
	if (cont_b > 90){
		
		digitalWrite(9,HIGH);
	}
	
	if (cont_b < 90){
		
		digitalWrite(9,LOW);
	}	

	
   }

}

void loop(){
     
}

Mod2.ino (1013 Bytes)

Este tema de los timers siempre es para tener cuidado
No me acuerdo de memoria asi que voy a hacer un repaso a las ecuaciones

El registro de comparacion es
compare match register = [ 16,000,000Hz/ (prescaler * desired interrupt frequency) ] - 1
debemos recordar que cuando usamos los timers 0 y 2 el número debe ser menor a 256 y menor a 65536 cuando usamos el timer 1 como en este caso.
Si queremos una interrupción por segundo (frecuencia de 1Hz)

compare match register = [16,000,000 / (prescaler * 15000) ] -1
con un prescaler de 256 se obtiene

compare match register = [16,000,000 / (256 * 15000) ] -1 = 3.16 < 256 => usar timer1 sino timer0 o 2.

sin prescaler da o prescaler = 1

compare match register = [16,000,000 / (1 * 15000) ] - 1 = 1065.66 que esta entre
256 < 15,624 < 65,536 por lo tanto uso timer1

asi que aca va el programa

en lugar de interrupcion del timer x overflow va una interrupcion del comparador del timer1

ISR(TIMER1_COMPA_vect)

Mod2.ino (1.77 KB)