Autor Tema: convertir el contenido de timer1 a frecuencia en Hz  (Leído 9919 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado CapBlack

  • PIC10
  • *
  • Mensajes: 17
convertir el contenido de timer1 a frecuencia en Hz
« en: 17 de Mayo de 2007, 16:36:56 »
Hola a todos , estoy haciendo un frecuencimetro con el timer 1 , y me gustaria sacar el resultado
por LCD en Hz , el calculo me parece muy complejo para el pic 16F873 que estoy usando , dado que la frecuencia es la inversa del periodo , alguna idea .... gracias por adelantado

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #1 en: 17 de Mayo de 2007, 17:15:58 »
Bueno a mi se me ocurre una que talvez de sirva , si bien f=1/T tambien es cierto que f es la cantidad de pulsos por segudo, entonces inicializas el TMR1 como un contador externo asincrono e y configuras el TMR0 para generar una base de tiempo de 1 seg , cuando introduces la señal comienza el conteo del TMR0 y cuando tienes 1 seg lees el TMR1 y el valor que tengas sera la frecuencia y no necesitas realizar ningun calculo , con esto podrias medir frecuencias de hasta 65535 o un poco menos talvez y controlando los desbordes del TMR1 podrias medir valores mayores, espero y te sirva

Saludos.
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #2 en: 17 de Mayo de 2007, 18:21:34 »
m.... sander podrias colocar un ejemplo con los valores en los registros, no me queda claro lo del tmr1 con el tmr0  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #3 en: 17 de Mayo de 2007, 19:40:23 »
Bueno , tratare de explicarlo mejor , el tmr0 puede configurarse como temporizador haciendo OPTION_REG= b'11010111' y asignandole tambien el preescaler (256) al TMR0 , ahora si tenemos un cristal de 4 MHz el TMR0 desbordara cada 65,5 ms aproximadamente, con una variable cont_int_t0 controlamos cuando se hayan producido 16 desbordes del tmr0 y tenemos 1,024 seg. asi generamos la base de tiempo de 1 seg aproximadamente.

el tmr1 puede configurarse como contador asincrono , haciendo T1CON=b'00000111' esto hara que tmr1 se incremente con una señal externa introducida por T1CKI (RC0 en el 16f877a).

Una vez hecho esto la idea es la siguiente cuando quieras medir frecuencia inicializas los registros (TMR1H, TMR1L) TMR0 cuando tengas que cont_int_t0 = .16 tendras el valor de la frecuencia en TMR1H y TMR1L si es que la frecuencia es menor a 65535, y si se controlan los desbordes de TMR1 podrias medir frecuencias mayores.

Espero haber aclarado las dudas

saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #4 en: 18 de Mayo de 2007, 01:27:00 »
añap buena explicacion jejeje la anterior tenia mucho level pess  :mrgreen:
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado CapBlack

  • PIC10
  • *
  • Mensajes: 17
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #5 en: 18 de Mayo de 2007, 04:37:53 »
Gracias Sender por tu respuesta , pero lo que estoy tratando de hacer es un frecuencimetro con el criterio mas avanzado , es decir mediante el timer 1 sin prescaler tomo 8 muestras de la frecuencia desconocida durante ese periodo cuento los ciclos de maquina , ejemplo :
x= (tmr1L + (tmr1H*256)/8)
f=1/(tosc*x)

ventajas de este metodo son : mayor presicion y rapides
desventaja : calculo un poco complejo , bueno para un pic de 8 bits

Saludos.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #6 en: 18 de Mayo de 2007, 10:37:48 »
bueno a ve esa formula como todos son numeros pares hay una gran ventaja

registro*256 = registro * (2^8) = lo que implica que a " registro " le aplicaremos 8 veces una rotación a la izquierda, pero teniendo en cuenta el carry, ese " registro " que es de 8 bits puede terminar siendo de 16bits por la multiplicación.

registro / 8 = registro / (2^3) = lo que implica que a " registro " le aplicaremos 3 veces una rotación a la derecha, no tener en cuenta el carry.

para hallar f sugiero un crystal multiplo de 2 como 4Mhz u 8 MHz etc . tosc se refiere al osiclador de crystal no?
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #7 en: 18 de Mayo de 2007, 12:05:13 »
Citar
Gracias Sender por tu respuesta , pero lo que estoy tratando de hacer es un frecuencimetro con el criterio mas avanzado , es decir mediante el timer 1 sin prescaler tomo 8 muestras de la frecuencia desconocida durante ese periodo cuento los ciclos de maquina , ejemplo :
x= (tmr1L + (tmr1H*256)/8)
f=1/(tosc*x)

ventajas de este metodo son : mayor presicion y rapides
desventaja : calculo un poco complejo , bueno para un pic de 8 bits

Saludos.


Es cierto que el metodo que describi no tiene mucha presicion porque en realidad tendrias 1,024 seg pero esto lo puedes mejorar colocando un cristal de 3.2768 MHz y configurando el TMR0 con un preescaler de 32, esto hara que el TMR0 desborde cada 10 ms entonces cuando cont_int_t0 llegue a 100 , tienes 1 seg , entonces si colocas una señal de 10346 HZ este valor aparecera en TMR1H y TMR1L creo que mas precision no le puedes pedir , llegaria a ser impreciso para señales menores a 1Hz,

Puedes mejorar la rapidez , pero disminuir la presicion , disminuyendo la base de tiempo, es decir, cada vez que tengas 10 ms lees el  valor de TMR1H y TMR1L  y al momento de desplegar multiplicas por 100 lo cual seria muy facil, por ejemplo en el caso anterior a los 10 ms tendrias en TMR1 103 , al momento de desplegar lo multiplicas por 100 y despliegas 10300 , pero ojo no tendrias que hacer ningun calculo solo aumentar los ceros,  entonces tendrias rapidez pero no tanta presicion.

Lo del tema de la presicion es un poco amplio , ya que no se que tan preciso sea lo que pretendes hacer , pero dejame decirte que en la ultima ecuacion que planteas f=1/(tosc*x) vas a perder presicion debido al manejo de decimales, Microchip tiene rutinas hechas para operaciones con punto flotante y operaciones de doble presicion , tendrias que probar con estas para ver si no te disminuye demasiado la presicion que deseas.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado CapBlack

  • PIC10
  • *
  • Mensajes: 17
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #8 en: 18 de Mayo de 2007, 18:51:48 »
Es cierto lo que me comentas de la perdida de decimales me produce errores de 25Hz o saltos.
la precicion que estoy buscando tiene que estar en 0.01% a 40000Hz y el tiempo de proceso no
ser mas de 2.8 ms , por eso es que parti por el metodo de contar los ciclos de reloj y utilizar la frecuencia desconocida como periodo de medida.
tendria que probar esas rutinas de punto flotante de microchip pero creo que solo dejan el resto
de decimales como resultado , pero las operaciones solo ingresan enteros .
la otra opcion seria pasar a la gama de DSP o eliminar el LCD y quedarme solo con los pulsos
contados ya que si cambio el 16f873 por uno de 50Mhz podria estar facilmente en el 0.01%


Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #9 en: 18 de Mayo de 2007, 19:26:26 »
Vamos a ver, si utilizas C para la programación no veo ningún problema para sacar las cuentas. No importa que el procesador sea de 8 bits. Yo saco cuentas de ese tipo con un PIC de 8 bits, sin problemas.

Citar
lo que estoy tratando de hacer es un frecuencimetro con el criterio mas avanzado , es decir mediante el timer 1 sin prescaler tomo 8 muestras de la frecuencia desconocida durante ese periodo cuento los ciclos de maquina , ejemplo

Esto no me queda claro, porque según tengo entendido un frecuencímetro tendrá una entrada a la cual conectaremos la señal que queremos medir para saber su frecuencia:

Tienes una señal X, de la que deseas saber la frecuencia, supongamos que la señal es una sinusiode, como la de la red de AC de cualquier casa.

Lo primero sería acondicionar la señal adecuadamente para poder medirla, una forma sencilla conistte en tomar una muestra de bajo nivel de esa tensión, es decir mediante un circuito tomamos una muestra digamos que entre -5 y 5V de alterna

Después pasamos por un rectificador de una sola etapa para obtener uno de los dos ciclos de la señal, el otro se desprecia

Después esa señal "pulsante" la pasmos por un SmitchTrigger, para que nos de un bonito tren de pulsos que es lo que le conectamos a nuestro temporizador, configurado como contador.

Ahora, tenemos que usar otro contador, uno que permita el modo captura, para poder hacer el muestreo de la señal a la entrada de nuestro frecuencímetro

Configuramos nuestros temporizadores:
  • El que tiene a su entrada la señal a medir, lo configuramos como contador, es decir que cuenta los pulsos que le llegan desde afuera
  • El otro lo configuramos como temporizador en modo captura

Los PIC suelen tener este tipo de configuraciones para hacer precisamente eso que deseas, así que estudiar un poco el datasheet de tu PIC.

Resetamos el contador que muestrea los pulsos y hechamos a andar el contador que lleva el tiempo en que se va muestrear la señal.

Cuando el temporizador se desborda, hace la captura, POR HARDWARE, de los pulsos contados por el contador al que tenemos conectada la señal a muestrear.

Ahora tienes una muestra de frecuencia, si quieres hacer un filtrado tendrás que muestrear tantas veces como necesites para hacer el muestreo y luego procesas las señales.


Citar
la otra opcion seria pasar a la gama de DSP
Eso que quieres con un PIC sale de maravillas, claro si dominas bien como es que trabajan los Timers/Counters y los CC modules (Capture/Compare), debes estudiar bien como es que funcionan y luego darte un saltico por aquí.

Ese tema creo que ya lo han tratado en el Foro, así que puedes comenzar por leer lo que hay por aquí, utiliza el buscador para ello.

Un saludo Reinier

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #10 en: 18 de Mayo de 2007, 19:35:00 »
Se me olvidaba

La frecuencia solo se le puede sacar a señales períodicas, es decir Sinusiodes, trenes de pulso y otro tipo de señales que se repiten en el tiempo.

A las señales que no son periódicas, también se les puede sacar la frecuencia, pero para ello hay que utilizar la TRF (Transformada Rápida de Fourier), Y eso si que es un lío de cuatro pares.

Un saludo

Desconectado CapBlack

  • PIC10
  • *
  • Mensajes: 17
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #11 en: 18 de Mayo de 2007, 20:47:42 »
hola reiniertl gracias por tu respuesta , pero creo que no as entendido de lo que se trata primero
te comento que hay varias formas de verificar la frecuencia de un tren de pulsos o lo que sea
y no nesesariamente tiene que ser periodico ni simetrico un solo pulso alcanza para saber su duracion esto es claro . y si tu revisas bien el datasheet de todos los pics veras que los timers se
incrementan de dos maneras en modo timer con cada ciclo de maquina en modo counter con cada
transicion descendete de la entrada . este ultimo se puede aplicar si tenes mucho tiempo y tu entrada de pulsos es estable . lo segundo es que desconosco el "C" , pero supongo que si se puede realizar este calculo tardaria demasiado .

ahora la transformada rápida de fourier (FFT) es un algoritmo eficiente O(NlogN) para calcular la DFT me podrias decir como aplicar esto mas exactamente ?

Gracias saludos .

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #12 en: 18 de Mayo de 2007, 20:56:26 »
Soy yo el que se va a meter con los datasheet, para ver de que forma te puedo ayudar. Dame un time y veremos

Si no conoces el C y no hay limitación en usarlo, para lo que haces, entonces no pierdas tiempo y ponte a la tarea

Yo no tengo nada en contra del ASM, me da igual ASm que C, pero para hacer las cosas a la velocidad que hoy en día se necesita, el C es una muy buena opción.

Un saludo Reinier

Desconectado CapBlack

  • PIC10
  • *
  • Mensajes: 17
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #13 en: 19 de Mayo de 2007, 04:38:32 »
Bueno por alli la opcion del "C" podria ser nunca lo he probado , creo que voy a mirar que tal se porta el pic si le escribo algo como   f=1/(tosc*x) por alli debo tener el compiler de HITECH (mientras no le tarde un par de horitas en hacer el calculo ) jeje...

Saludos .

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: convertir el contenido de timer1 a frecuencia en Hz
« Respuesta #14 en: 20 de Mayo de 2007, 19:05:47 »
Verás que le bastan algunos us, vale la pena utilizar lenguajes de alto nivel en los uC, no por gusto a estos tarecos los hacen hoy en día con tanta memoria de programas