contador que da resultados erráticos para la medición de frecuencia usando Atmega32

2

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

     }
    
pregunta Samyuktha

1 respuesta

1

_delay_ms () es una función muy imprecisa, además de que el tiempo del precessor para llamarlo y devolverlo.

Hay muchas maneras en que podría usar los periféricos de atmega para medir la frecuencia. Si desea ir mediante la alimentación de la frecuencia de entrada a T1, sugeriría usar otro temporizador para medir el tiempo. Puede configurar e iniciar ambos temporizadores simultáneamente, luego detectar la interrupción por desbordamiento del "tiempo" que ocurrirá exactamente después de 256 * precalces del reloj del sistema de prescaler, luego hacer su cálculo matemático.

En otra nota, sugeriría que aumente la frecuencia de reloj de su procesador, ya que 500 KHz es solo 2 veces menos que 1MHz (teorema de Nyquist), eso es suficiente, pero no obtendrá mucha precisión en el extremo alto.

    
respondido por el miceuz

Lea otras preguntas en las etiquetas