Ayuda para entender este código de marcación del temporizador del codificador

4

¿Podría alguien, por favor ayudarme a entender el siguiente código? Su funcionamiento en atmega128 @ 16 Mhz. Su lectura de un codificador de pulso. Utiliza timer3. El codificador CHA está conectado a PIND2 (INT2) que se activa cuando hay una interrupción de bajo a alto. El CHB del codificador está conectado a PINE7.

No entiendo por qué TCNT3 > > 3 en este caso.

SIGNAL(SIG_INTERRUPT2) 
{ 
   timer3_stop(); 
   Right_Odometer_Period = TCNT3>>3; 
   right_overflow_occurred = timer3_overflowed; 
   timer3_start(); 

   if ((PINE & 0x80) != 0) 
   { 
      right_odometer++; 
      right_up = 1; 

   } 
   else 
   { 
      right_odometer--; 
      right_up = 0; 
      Right_Odometer_Period = Right_Odometer_Period * -1; 
   } 
   Right_Velocity = Right_Odometer_Period; 
   averaging_array[array_ptr++] = Right_Odometer_Period; 
   if (array_ptr == 32) 
   { 
      arraysum = 0; 
      for (int i = 0; i<32; i++) 
      { 
       arraysum += averaging_array[i]; 
      } 
      average = arraysum>>5; 
      array_ptr = 0; 
   } 
} 

void timer3_init(void) 
{ 
   TCCR3A = 0x00; 
   TCNT3 = 0X0000; 
   ETIMSK = (ETIMSK | (1<<TOIE3)); 
   timer3_start(); 
} 

void timer3_start(void) 
{ 
   TCNT3 = 0X0000; 
   timer3_overflowed = 0; 
   TCCR3B = (1<<CS30)|(0<<CS31)|(0<<CS32); 
} 

void timer3_stop(void) 
{ 
   TCCR3B &= ~(1<<CS30)|(1<<CS31)|(1<<CS32); 
} 

SIGNAL(SIG_OVERFLOW3) 
{ 
   TCNT3 = 0X0000; 
        Right_Velocity = 0; 
   timer3_overflowed = 1;    
}
    
pregunta nixgadgets

1 respuesta

3

La mejor suposición que se me ocurre es que el >>3 (dividir por 8) es un intento de evitar ir más allá del tamaño de la variable arraysum . Dado que TCNT3 es un contador de 16 bits, si no hubiera algún tipo de factor de escala, fácilmente podría terminar con un valor de basura para arraysum .

Dicho esto, el >>3 probablemente no resolvería completamente este problema. Creo que dependería de la rapidez con la que se gira el codificador y la velocidad de reloj del mega128. Si ocurre que cada tick en D2 ocurre cuando TCNT3 es muy grande, este algoritmo para determinar la velocidad de rotación tendrá problemas.

    
respondido por el Dave

Lea otras preguntas en las etiquetas