Estoy usando un fotosensor que da salida como una onda cuadrada. La frecuencia de esta onda cuadrada se mide usando Atmega32A con un reloj de 1MHz. La salida a escala completa del sensor es de 500 kHz.
La salida del fotosensor está conectada al pin T1 y estoy usando el reloj timer1 como referencia para determinar la frecuencia. Tengo un retraso de 100 ms usando el bucle de software, después de lo cual leo el valor del temporizador y lo multiplico por 10 para obtener la frecuencia de salida del fotosensor.
Los valores de frecuencia que se obtienen usando el osciloscopio son de alrededor de 50-100kHz. Sin embargo, los valores de frecuencia que devuelve este código son aproximadamente 80Hz mayores que el valor medido con un ocilloscopio en una configuración. Si cambio la ubicación de toda la configuración, este valor adicional constante está cambiando a otra constante. ¿Qué estoy haciendo mal?
uint32_t MeasureFrequency()
{
uint32_t freq=0;
DDRB &= ~(1<<PINB1);uint32_t count=0;
TCCR1B |=(1<<CS12);
TCCR1B |=(1<<CS11);
TCCR1B &=~(1<<CS10); //0.Initalize
TCNT1=0x0000; //1.Clear timer 0 contents
TIFR &=~(1<<TOV1); //2.Clear timer 0 flag
//count=TCNT1;
while(TCNT1<1)
{;}//count=TCNT1;}
if(TCNT1>=1) //3.Check if timer has incremented once
{_delay_ms(100);} //4.100ms delay
TCCR1B &=~(1<<CS12);
TCCR1B &=~(1<<CS11);
TCCR1B &=~(1<<CS10); //5.Disconnect timer clock from input
uint8_t i=TIFR;
i = i&(0b00000100);
if(i==4)
{Send_A_Character('v');}
count=TCNT1; //6.Read Timer
return freq=count*10; //7.Freq=timer*10
}