Autor Tema: Uso de Timer para determinar frecuencia de una onda  (Leído 126 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 22
Uso de Timer para determinar frecuencia de una onda
« en: 12 de Febrero de 2018, 23:30:56 »
Hola comunidad,  estoy ingresando al mundo de atmel y micros de 8 bits, como primera parte se quiere saber cual es la frecuencia de una onda cuadrada por medio del uso de timers. He hecho la posible configuracion de TC0 y TC2 pero no se como llevarlo a cabo ya que no comprendo como puedo exportar el tiempo o el conteo del timer y usarlo para determinar dicha frecuencia y a su vez poder mostrarla en un lcd 2x16

agradezco puedan ayudarme ya que no existe mucha informacion para poder manejarlos de manera correcta.


#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
char variable = 0;

int main(void){
   CLKPR = 1 << CLKPCE; // Configuracion de prescaler bit 7
   CLKPR = 0; // Division del prescaler en 1
   TCCR0A = 0;
   TCCR0B = 0b00000101; //Determina conteo por flancos de subida
   TIMSK0 = (1<<TOIE0); //Habilitacion de la interrupcion
   TIFR0 = (1<<TOV0); // Flancos de voltaje
   TCNT0 = 0; // Timer reseteado en 0
   TCCR2A = 0;
   TCCR2B = 0b00000111; // Prescalizado 1024
   TIMSK2 = (1<<TOIE2); //Habilitacion de la interrupcion
   TCNT2 = 0; // Timer reseteado en 0
   sei();
   DDRA |= 1;
   DDRB = _BV(PB0);
   PORTB |= 0b00000000;
   PORTA |= 0b00000001;
   lcd_init(LCD_DISP_ON);
   lcd_clrscr();
   lcd_home();
   lcd_gotoxy(0,0);
   lcd_puts("Frecuencia:");
   
    while (1) {
            
    }
}

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4476
    • Picuino
Re:Uso de Timer para determinar frecuencia de una onda
« Respuesta #1 en: 13 de Febrero de 2018, 07:02:12 »
¿Qué frecuencias quieres medir?
¿Con cuánta precisión?

¿Qué micro estás utilizando, un Atmega328?
« Última modificación: 13 de Febrero de 2018, 07:10:19 por Picuino »

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 22
Re:Uso de Timer para determinar frecuencia de una onda
« Respuesta #2 en: 13 de Febrero de 2018, 14:31:03 »
Se quiere medir la frecuencia de la toma de pared (60 Hz), ya se hizo la etapa de rectificación y cambio a señal cuadrada para que ingrese al puerto PB0 - T0 .. la precisión no sabria como manejar ya que hasta el momento estoy comprendiendo la prescalizacion del contador..

Gracias

*mi idea era usar TCNT0 para contar flancos de subida y TCNT2 para saber cuanto tiempo tardo entre flancos asi determinaría el periodo y por ende la frecuencia pero no se como lograrlo

** idealmente deberia mostrarme la frecuencia de cualquier señal
« Última modificación: 13 de Febrero de 2018, 14:45:04 por gioalex07 »

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 149
Re:Uso de Timer para determinar frecuencia de una onda
« Respuesta #3 en: 13 de Febrero de 2018, 14:50:04 »
....  mundo de Atmel...  ,  ya fue,  ahora es  AVR Microchip  (muy a mi pesar! )

La historia por la cual preguntás,  esta en rumbo,  pero no es el camino mejor.

Resulta ser que muchos AVR,  tienen un hardware llamado ICP,  en modo "capture event"  hace lo que estás preguntando.
Entonces,  se pone a correr el Tmr1,  la fuente es el oscilador del micro,  con o sin pre-escalador según tu necesidad, se activa la interrupción de éste hardware,  cuando se presenta un evento en el pin icp,  dispara la interrupción,  del Tmr1 copias el valor al momento de la interrupcion,  pones a cero el Tmr1,  tambien has activado la interrupcion por desborde del Tmr1 y obvio agendas su ocurrencia.
Ahora con esos números haces los cálculos y obtenés el tiempo ocurrido entre dos eventos que ocurren en el pin icp.

mira los enlaces que dejo,  Yo lo aprendi de allí,  hasta código tienen.

http://www.nerdkits.com/forum/thread/1273/

http://www.avrprojects.net/index.php/avr-learn/getting-started-with-avr/51-programming-the-timer-counter-1?showall=1


 

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4476
    • Picuino
Re:Uso de Timer para determinar frecuencia de una onda
« Respuesta #4 en: 13 de Febrero de 2018, 16:31:48 »
Algunos comentarios:

1º. Es muy importante que el detector de cruce por cero sea muy exacto para evitar jitter.
Intenta filtrar el ruido de alta frecuencia para que no te afecte.

2º La precisión de la frecuencia de red es bastante baja. Con 4 ó 5 decimales tendrás suficiente.
A la larga se ajusta la frecuencia para que el desfase sea pequeño y se pueda usar como base de los relojes, pero en tiempos cortos la frecuencia varía mucho.

Yo lo haría contando pulsos de reloj entre cruces por cero pares (uno de cada dos) de la señal de red.
Si lo haces con todos los cruces por cero no funcionará bien porque la onda no es simétrica.

Si utilizas un reloj de 10MHz, contarás unos 166666 ciclos cada dos cruces por cero (como te dijo AleSergi con el TMR1 y su desbordamiento).

Después la fórmula es:

   Frecuencia de red = Frecuencia de reloj / Ciclos contados =  10000000/166666 = 60.0000

Con numeros flotantes de simple precisión obtendrás 4 decimales con error de +-4 en el último decimal. De sobra para la frecuencia de red.


3º No pongas a cero el TMR1
Es preferible hacer 'continous timestamp' que significa que cuentas pulsos de reloj y desbordamiento con 32 bits y luego calculas la diferencia entre dos samples.
Eso compensa los errores sistemáticos de medida y si en una medida has contado de más, en la siguiente contarás de menos.
Además podrás hacer medias mucho más precisas durante un tiempo mayor.

Saludos.

Desconectado gioalex07

  • PIC10
  • *
  • Mensajes: 22
Re:Uso de Timer para determinar frecuencia de una onda
« Respuesta #5 en: 15 de Febrero de 2018, 13:51:46 »
Bueno intente las soluciones planteadas (gracias por todo ese apoyo) pero pues mi docente dijo que debia solo usar TCNT0 nada más. Que a medida que se subia la intensidad de la materia se usaban las diversas funciones pero como es el primer uso del timer solo debia usar ese puerto.


En resumen (Debo poder medir una señal que entre por cualquier puerto y en un display lcd mostrar la frecuencia a la cual opera dicha señal.) La meta era que con este manejo de timer se pudiera interpretar la señal de un control remoto con protocolo IR y mostrar el boton oprimido. Es por eso que no puedo dar uso de otros


 

anything