Estoy tratando de medir la frecuencia de dos fuentes de CA con atmega32, ambas estarán alrededor de 50Hz. Ya construí el circuito de zerocross usando LM358, todo lo que tengo que hacer con mi atmega32 es usar el temporizador para leer la onda cuadrada. el pin no es cero, y detenga el temporizador cuando el voltaje llegue a 0, luego multiplique el resultado con 2. Tengo problemas (preguntas) sobre esto. Primero, no es realmente preciso, pero es realmente sensible. Siempre obtuve 52Hz en lugar de 50, pero puede detectar cambios de hasta 0.05Hz. ¿Hay una mejor manera de leer la baja frecuencia usando atmega32? En segundo lugar, tengo problemas para leer la frecuencia de las señales a la vez. ¿Alguna sugerencia?
int main(void)
{
while(1)
{
zerocrossingA();
freA = frecalculationA();
_delay_ms(20);
zerocrossingB();
freB = frecalculationB();
}
}
void zerocrossingA(void)
{
while(1)
{
if ((PINA&(1<<7)) ==0 )
{
TCNT1=0;
TCCR1B=0x01;
break;
}
else
{
continue;
}
}
while(1)
{
if ((PINA&(1<<7)) !=0 )
{
TCCR1B=0x00;
g1=TCNT1;
break;
}
else
{
continue;
}
}
}
void zerocrossingB(void)
{
while(1)
{
if ((PINC&(1<<0)) ==0 )
{
TCNT1=0;
TCCR1B=0x01;
break;
}
else
{
continue;
}
}
while(1)
{
if ((PINC&(1<<0)) !=0 )
{
TCCR1B=0x00;
g2=TCNT1;
break;
}
else
{
continue;
}
}
}
double frecalculationA()
{
k1=1000000/(g1);
w1=k1/2;
return w1;
}
double frecalculationB()
{
k2=1000000/(g2+1);
w2=k2/2;
return w2;
}