TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Chenao en 20 de Agosto de 2008, 23:22:59
-
Bueno muchachos hace tiempo que no entraba en el foro debido a que estaba en parciales finales, pero ya me desocupe y me puse a trabajar en un nuevo proyecto que me tiene muy motivado.
Quiero hacer un velocímetro digital con un pic16f877, la idea es la siguiente capturar el numero de vueltas por segundo (Frecuencia F) por medio de un lata magnética y un micro después pasar a velocidad angular y por último a velocidad en KM/H recordando que en movimiento circular uniforme V = r*W Donde r es el radio de la circunferencía y W velocidad angular
Las dudas: si a una velocidad máxima de 80Km/H la frecuencia me dio 7Hz tomando como radio 0.5m quisiera que alguién me ayude con los calculos por que estoy confundido "que pena" debido a que las cifras me son algo raras
Espero que me contesten
Un abrazo desde pereira la ciudad de las puertas abiertas
-
Tus cálculos son correctos, Chenao.
Para medir frecuencias tan bajas, creo que lo más recomendable es:
- leer muchos más pulsos por vuelta, colocando más puntos de sensado en la rueda
- medir el tiempo de cada vuelta, en lugar del nº de vueltas por segundo, y hacer el cálculo de la frecuencia teniendo el periodo (F = 1/T)
-
Compañero tengo otra duda debido a que programo con en el esamblador y para hacer todas estás operaciones se vuelve algo tedioso ¿ Que me recomiendas para hacer el programa ?
Un saludo desde Pereira
-
¡Con la iglesia hemos topado! :mrgreen:
Sin duda si me preguntas a mí te recomendaré que lo hagas en C.
-
!Claro que he chocado con la iglesia ¡ pero de todas maneras voy aceptar tu sugerencia profesional y "Sarcastica" :mrgreen:. Un abrazo
-
Hola.
Pregunto: No hay manera de conectar la salida del velocimetro analogico al PIC?, es de aguja y me supongo que debe haber 2 cablecillos por ahi??? como ven no se de carros!!!
Saludos
-
Chenao, estoy trabajando en un proyecto parecido. Los carros modernos tienen sensores de velocidad que te dan pulsos deacuerdo a la velocidad que esta corriendo el carro, podrias usar eso enves del 'lata magnetica y micro', que no entiendo ni que son xD y que suenan interesantes dicho sea de paso, haber si me explicas eso :mrgreen:
MLO__, el velocimetro no tiene salida que yo sepa, sino entrada para conectar dicho sensor de velocidad (en carros modernos) y un tipo de cable metalico o algo asi (nose como definirlo) en carros antiguos.
Suerte.
Salu2.
-
Hola.
Creo que no me exprese bien. Lo que quise decir es que si es de aguja el indicador, puede ser que use el metodo de D'Arsonval y se puede usar ese voltaje directamente haciendo el respectivo acople.
El metodo de la "lata magnetica" es con un iman y un sensor de efecto hall (yo y mis sensores de efecto Hall :o ), el cual detecta la presencia de campo magnetico y envia un 1 si lo hay y cuando no lo hay envia un 0, de esta manera tenemos pulsos relacionados con la frecuencia angular.
Saludos
-
Hola a todos!!
El año pasado presentamos un proyecto para un ramo de la universidad (sensores y transductores industriales), en el cual nos planteamos hacer un tacómetro digital para motores de inducción. Para este proyecto ocupamos un PIC16F648A corriendo a 8MHz, y la salida de datos la desplegabamos en un lcd de un nokia que pasó a mejor vida.... :) asi nos quedó un instrumento portatil, y una nota muy buena :lol:
La parte mecánica del tacómetro nos daba un pulso por revolución, asi que en el pic medíamos el tiempo entre pulsos, y dividíamos una costante por el tiempo medido para obtener las rpm del motor (RPM = K / T).
A la hora de hacer las pruebas, obtuvimos muy buenos resultados, pero había un pequeño problema con la resolución, ya que ésta varía según el tiempo medido. Era cosa de ver la curva f(x)=K/x, la cual no tiene nada de lineal. Así que decidimos establecer un criterio de resolución esperada para cierta cantidad de rpm.
Pero.... como predecir la resolución esperada?? fácil, desempolvando las lecciones de cálculo diferencial. La derivada de una recta nos dá una constante, y una curva se puede considerar lineal para un vecindario muy pequeño de un punto en el dominio de la función, así que nuestra función la consideramos arbitrariamente lineal para un intervalo pequeño, así que podemos considerar su derivada como una constante dentro de ese mismo intervalo, pero.... cuanto vale esa constante?? esa es nuestra incognita que debemos despejar para obtener nuestro valor de K para el intervalo de rpm que buscamos mejor resolución. En nuestro caso, la dejamos cerca de las 1500 rpm, el cual es un valor típico dentro de los motores que buscabamos medir.
Bueno, tengo que salir ahora, pero estaré al pendiente porque igual me interesa mucho el proyecto (para mi autito.... :) )
Saludos a quienes nos leen.
-
Un saludo a todo el foro, que pena no haber respondido antes pero tuve problemas al acceder al la página del foro. Bueno muchachos veo que algunos están motivados en el proyecto al igual que yo. En estos dias estuve manejando el compilador de C para los microcontroladores PIC y pude hacer un programita sencillo pero funciona muy bien.
La idea del programa es medir el ancho de un pulso que viene "de la lata metálica" esta induce un campo magnético, por lo tanto, por ley de inducción de Faraday induce un voltaje que es pequeño pero si lo pasamos por disparador 74LS14 "Scmitt Trigger" creo que podemos obtener 5 y 0V que es la lógica que maneja el micro.
Bueno voy a publicar el programita no lo hice el ensamblador porque tenia que hacer muchas vueltas.
Conexiones
lcd Pic
RS d0
RW d1
RE d2
D4 d4
D5 d5
D6 d6
D7 d7
vss 0V
vdd 5v
pic entrada
B1 Genrador de señales (Onda cuadrada) ó tren de pulsos
C6 Terminal de serial
#if defined(__PCM__)
#include <16f877.h>
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define use_portd_lcd TRUE // Definir puerto de la lcd
#byte puerto_b=06
#include <lcd.c> // librería de la lcd
long desbor,de;
#int_rtcc
void desborde()
{
desbor= desbor + 1;
de = desbor;
set_timer0(0);
}
void espera_arriba()
{
while(input(PIN_B0)); // si está en alto espero a que este en nivel bajo
delay_us(3);
while(!input(PIN_B0)); // espero un alto
}
void ancho_pulso()
{
delay_us(3);
while(input(PIN_B0)); // Espero un 0 lógico
delay_us(3);
while(!input(PIN_B0)); // Espero un 1 Lógico y esta medido el pulso
}
main()
{
int tiempo,medida;
long total_t,velocidad;
lcd_init();
lcd_gotoxy(5,1);
printf(lcd_putc,"0 Km");
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_counters(rtcc_internal, rtcc_div_256);
do
{
espera_arriba();
desbor = 0;
de = 0;
set_timer0(0);
ancho_pulso();
tiempo = get_timer0();
total_t= (de*255) + tiempo;
velocidad = (44179/total_t);
lcd_init(); // inicializa lcd
lcd_gotoxy(5,1);
if (velocidad<3)
{
printf(lcd_putc,"0 Km");
}
else
{
printf("\r %lu Km/H", velocidad);
printf(lcd_putc,"%lu Km/H", velocidad); // pongo el valor el la lcd
}
desbor = 0;
set_timer0(0);
delay_ms(100);
} while(true);
}
Bueno muchachos en el momento estoý trabajando en desarrollo del circuito estare publicando avances y complementando el trabajo con las sugerencias que resulten en el foro.
Un Saludo desde Pereira- Colombia
-
Bueno como lo prometido es deuda, voy a publicar los avances del proyecto que me tienen muy motivado espero que le guste.
Funcionamiento:
el interruptor de laminas REED se cierra al entrar en contacto con el campo magnético de un imán, cerrando el circuito por el interruptor REED, C1 y R1, y descargando el condensador C1, cuando la entrada pin 1 del inversor trigger-schmitt llega a la tensión de basculamiento 0,9v su salida pin 2 pasa a nivel alto y es enviada al conector por el pin 9 para que la pueda recibir el micro. Cuando se abra el interruptor REED el condensador se cargara de nuevo a través de R1 y R2 y cuando su tensión alcance los 1,7v la salida pin 2 pasara a nivel bajo. Los rebotes son eliminados por la carga o descarga del condensador C1 a travesde R1 y R2, al no superar la constante de tiempo no son capaces de hacer bascular el inversor trigger-schmitt y por lo tanto la salida permanece inalterable.
Bueno muchachos dejo los diagramas de los circuitos, espero que los observen y los analicen.
Un saludo desde Pereira - Colombia
-
Hola chenao.
Me parece muy interesante tu proyecto y mas que nada la forma como obtienes los pulsos a travez de una "lata magnetica" que sigo sin entender :D Pdrias poner el archivo de Proteus?
Por otro lado, veo que no usas interrupcion por cambio de flanco con ese PIC, nose si lo tendra integrado o si aun no sabes como hacerlo por CCS pero seria mucho mejor hacerlo asi que a usar delay's. Es solo una critica constructiva :mrgreen:
Espero mas avances de tu proyecto que deverdad me interesa mucho.
Suerte.
Salu2.
-
Hola Chenao
No has pensado en cambiar la parte de sensado de los pulsos? mira AQUI (http://www.instronics.com/sensoronix_hall_effect_proximity_switch_sensor.html). Tiene todo lo que estas haciendo con R1, R2 y C :-/ :-/ y responde hasta los 200kHz.
Saludos
-
MLO voy analizar el sensor para determinar la viabilidad del dispositivo te agradesco la colaboración, un abrazo.
Un saludo desde Pereira-Colombia
-
Bueno compañeros voy a publicar los avances, en el momento estoy trabajando en la sujerencias de MLO y JEREMYLF les dejo el documento para que lo analicen. Un abrazo.
Un saludo desde Pereira - Colombia
-
OBJETIVO
Diseñar un velocímetro utilizando un PIC16F877 con las siguientes características:
1. Económico
2. Preciso
3. Liviano
4. Versátil
5. Flexible
Movimiento Circular
El movimiento circular uniforme es la aplicación más importante de la noción general de la aceleración centrípeta. De esta aplicación proviene un resultado cuantitativo que tiene relación directa con el movimiento de cuerpos tales como los satélites naturales y artificiales, las partículas nucleares en aceleradores, los cuerpos que giran atados al extremo de una cuerda y las ruedas que están montadas sobre ejes.
El movimiento circular es otro ejemplo importante del movimiento en un plano. Sin embargo, en este caso el vector aceleración ya no es constante. Para calcular la velocidad lineal de la partícula debe evaluarse la derivada respecto del tiempo del vector desplazamiento r.
Donde r = xi(x) + yi(y) = (rcosθ)i(x) + (rsenθ)i(y)
i(θ) = (-senθ)i(x) + (cosθ)i(y)
Pero r = ri(r)
Se obtiene el siguiente resultado
V = (r dθ/dt)i(θ) = (rw)i(θ)
En esta ecuación se ve que la magnitud de la velocidad lineal está dada por
V = rw (1.0)
Donde w es la rapidez instantánea de la variación del ángulo θ, el cual expresa el desplazamiento angular de la partícula respecto de su punto de partida, se llama velocidad de la partícula y siempre se expresa en radianes por segundo.
w = 2*pi*F (1.1)
Donde F = 1/T siendo F = Frecuencia; T = Periodo (1.2)
Reemplazando (1.1) y (1.2) en (1.0)
V = (2*pi*r) / (T) (1.3)
Esta es la ecuación general que se va a utilizar para calcular la velocidad en proyecto
TMR0 (Timer 0)
El microcontrolador PIC16F877 tiene en su arquitectura 3 temporizadores, que son el TIMER0, TIMER1 y TIMER2. El TMR0 es un temporizador de 8 bits, es decir, sólo cuenta de 0-255, después que sobrepasa el umbral de los 255 se desborda y ocurre la famosa interrupción por desbordamiento del TMR0. Para calcular los tiempos a controlar con TMR0 se utiliza la siguiente fórmula práctica:
Temporización = 4*Tosc*(256 – Valor cargado del TMR0)*(Rango del divisor) (1.4)
Donde = Tocs = (1) / (Fosc)
Rango del divisor es también conocido como el predivisor de frecuencia puede varia desde 1:2 hasta 1:256
Unas de las características más útiles del TMR0, es que se puede leer en cualquier momento el valor que contiene, sin detener el contaje.
De la formula (1.4) podemos hacer las siguientes aproximaciones:
Fosc = 4 MHz
Rango del divisor = 1:256
Valor cargado = 0
Con estos valores la Temporización = 65.536 ms
El anterior valor me da la siguiente conclusión: que cada 65.536 ms el TMR0 se desborda y ocurre una interrupción (si está activa la interrupción GLOBAL), y además, que nuestro programa tendrá que trabajar con la interrupción del TMR0, debido a que medimos ciclos por segundo.
Para medir tiempo se utiliza la siguiente fórmula:
T = 4*Tosc*(Rango de divisor)*(255*#desbordes + Valor del TMR0 actual)
Para Tosc = 0.25us y Rango de divisor = 256
T = 0.000256*(255*desbordes + Valor del TMR0 actual) (1.5)
Remplazando (1.5) en (1.3) se obtiene
V = (2*pi*r)/( 0.000256*(255*desbordes + Valor del TMR0 actual)) (1.6)
Resolviendo con pi = 3.1416
V = (24544*r) / (255*desbordes + Valor del TMR0 actual) m/s (1.7)
Pasando a Km/H, ósea, Multiplicando por 3.6 se obtiene
V = (88358*r) / (255*desbordes + Valor del TMR0 actual) (1.8)
Interrupción por flanco externo en el Terminal RBO
Está interrupción es una de la más utilizadas debido a su fácil manejo y programación, la filosofía es la siguiente. El Terminal RBO del microcontrolador PIC16F877 puede ser utilizado para detectar cambios de flancos utilizando la interrupción por cambio flanco.
La idea consiste, que en el momento en que se detecta un “1” ó “0” lógico (dependiendo de la configuración), el TMR0 empieza a contar. Esta interrupción se utiliza para medir el ancho de un pulso, cambios en el estado de sensores etc.
Metodología de Trabajo
La metodología para el desarrollo del velocímetro es la siguiente:
1. Medir el ancho del pulso proveniente del sensor tipo hall, utilizando el TMR0, la interrupción por desborde del TMR0 y la interrupción por cambio de flanco en el Terminal RBO.
2. Hacer el cálculo utilizando la fórmula (1.8), tomando en cuenta el radio de la llanta en metros
3. Mostrar el valor en Km/H en una pantalla LCD
Bueno muchachos espero haber sido conciso en el planteamiento del problema, y espero recibir las diferentes sugerencias, críticas y dudas con respecto al proyecto.
Un saludo desde Pereira - Colombia
-
Saludos
Después de muchos quemones, pruebas y demás cosas ya tengo la primera implementación del velocímetro con el PIC16F877
El velocímetro tiene las siguientes características:
Diámetro programable (13' A 23') "de la rueda de auto, moto e.t.c"
Velocímetro de (0 - 255 KM/H)
La única parte que me tienesdando vueltas es la parte del sensado ya que la "lata magnética" no me responde cuando pasa por pantano espero conseguir otro dispositivo.
Bueno muchaschos dejo las fotos para que le den una ojeada.
Un saludo desde Pereira - Colombia
-
Como que cuando pasa por pantano? :S
Que bueno que vayas por buen camino xD
Salu2.
-
Saludos
Después de muchos quemones, pruebas y demás cosas ya tengo la primera implementación del velocímetro con el PIC16F877
El velocímetro tiene las siguientes características:
Diámetro programable (13' A 23') "de la rueda de auto, moto e.t.c"
Velocímetro de (0 - 255 KM/H)
La única parte que me tienesdando vueltas es la parte del sensado ya que la "lata magnética" no me responde cuando pasa por pantano espero conseguir otro dispositivo.
Bueno muchaschos dejo las fotos para que le den una ojeada.
Un saludo desde Pereira - Colombia
hola que simulador usas ?
-
Saludos
hola que simulador usas ?
Que pena por no constestar antes. El proyecto inicialmente fue simulado en el Proteus 6.0 con un PIC16f877, el sensor fue simulado con un generador de señales y la velocidad era visualizada en una LCD, después de mucha pruebas, se decidio cambiar de microcontrolador y se paso a un PIC16F628, además, se utilizo el módulo CCP1 que viene incorporado en este microcontrolador, además el código fue realizado en lenguaje de máquina y como dispositivo de visualización se utilizo un display de 7 segmentos. El motivo de cambio de microcontrolador y del elemento visualizador fue por un aspecto económico, este dispositivo se probó en una KMX (150 ó 175) y funcionaba perfectamente, igualmente fue simulado en el Proteus 6.0.
Eso fue todo lo del velocímetro saludos.
-
Yo también me quedé colgado en la parte "no me responde cuando pasa por pantano". :shock:
-
Saludos
Yo también me quedé colgado en la parte "no me responde cuando pasa por pantano".
El problema era el siguiente, inicialmente el velicímetro fue probado en una bicicleta y cuando la llanta pasaba por lugares donde se empatanaba la llanta el velocímetro no funcionaba bien, el problema se solucionó poniendo esas tapas contra agua y enchaquetando el cable que viene desde el sensor "como la guaya de las motos"y con estos arreglos soluciono en mucha parte el problema.
Saludos.
-
Felicidades por tu proyecto me ha gustado mucho y me va venir muy bien para modificar mi anterior proyecto:
sin duda te lo has currado, gracias por compartirlo.
-
Saludos
Felicidades por tu proyecto me ha gustado mucho y me va venir muy bien para modificar mi anterior proyecto:
sin duda te lo has currado, gracias por compartirlo.
Que bueno que te gusto amigo joliva68, este fue mi primer proyecto con los microcontroladores, fue todo un reto por la modificaciones que se hicieron, y el cambio de lenguaje atrazo mucho el desarrollo, según mal no recuerdo se llevo 1300 líneas de código y se utilizaron 6 interrupciones, además el velocímetro se le incorporó un odómetro y quedo muy cachaco :D.
Cualquier inquietud solo es que comentes
-
Hola.
Revivo el hilo para mostrar mi Velocímetro :mrgreen:
(http://img839.imageshack.us/img839/227/s4010248.jpg)
Un videillo de las pruebas que hice con un motor:
Para sensar los pulsos uso un sensor Hall.
Saludos
-
Muy bien acabado, MLO. Felicidades.
-
Gracias ;-)
PD// Una fotillo en su caja:
(http://img406.imageshack.us/img406/4131/s4010250.jpg)
-
Saludos
MLO te felicito por el proyecto te quedó muy chulo sería bueno que documentaras como lo hiciste, es decir, que técnica utilizaste, la verdad como ese fue mi primer trabajo mucha de la información con la que hizo el proyecto se quedó en la empresa ya que prefiri estudiar, de todas maneras me parece que el mio es más elegante :D :D :D.
-
:D :D :D
Ok Ok ... si tu lo dices :D :D :D
Pues, use una interrupción (CCP) para la medición de la frecuencia de la señal de pulsos que provienen del sensor Hall, otra para la multiplexación de los display de 7 segmentos (Timer0) y otra (USART) para la configuración de los parámetros de calibración y programar el modo de contador.
Use el 16F628A ya que tenia los pines suficientes para hacer lo que quería y quedaba lo suficientemente pequeño para alcanzar en la caja (6.5cm x 4.7cm x 2cm). La ventaja de usar un Sensor Hall es que el campo magnetico es inmune al polvo, barro, etc. y por tanto se tiene una muy buena señal:
(http://img534.imageshack.us/img534/480/tramapulsos.png)
Saludos
-
Totalmente de acuerdo con todo, excepto por la cuenta:
V = (2*pi*r)/( 0.000256*(255*desbordes + Valor del TMR0 actual)) (1.6)
yo creo que ahí te confundiste y como mensionaste anteriormente en tiempo el timer se desborda cada 65.536 ms, por lo que la cuenta yo creo que deberia ser si la estas trabajando en segundos
V = (2*pi*r)/( 0.000256*(desbordes*0.065536 + Valor del TMR0 actual))
-
Saludos marco_zappia
Totalmente de acuerdo con todo, excepto por la cuenta:
V = (2*pi*r)/( 0.000256*(255*desbordes + Valor del TMR0 actual)) (1.6)
yo creo que ahí te confundiste y como mensionaste anteriormente en tiempo el timer se desborda cada 65.536 ms, por lo que la cuenta yo creo que deberia ser si la estas trabajando en segundos
V = (2*pi*r)/( 0.000256*(desbordes*0.065536 + Valor del TMR0 actual))
Creo que como esta la ecuación 1.6 esta bien, nota la constante 0.000256 que posee implicitamente el valor de prescaler del timer, pero el timer se sigue desbordando cada 256 conteos. La única diferencia es que cada conteo esta dividido (en este caso) en 255 ciclos del timer. Por tal razón la constante 0.000256 esta por fuera del producto y la variable desbordes se multiplica por 255.
-
Chenao te felicito por la iniciativa y muy buen proyecto.
Ahora opinando sobre tu desarrollo, lo que no entiendo es a la hora de que realiza el overflow donde llama la interrupción??? ya que hay un método q creaste llamado "void desborde()" que es q te cuenta los pulsos y renicia el tmr0, pero el mismo nunca interviene.
Te agredeceria mucho tu respuesta.
Saludos.
-
Hola alechivo
Que pena no responder antes. Con respecto a la consulta el microcontrolador necesariamente tiene que ejecutar la rutina de interrupción para así medir el período de la señal de entrada, la parte del código que se encarga de realizar dicha tarea se muestra acontinuación, ten en cuenta que como la rutina es una función de interrupción no hay necesidad de llamarla desde el main() si no que se ejecuta una vez ocurra el evento que la generá pero es deber del programador habilitarla y especificar el procedimiento de trabajo una vez ocurra. No sé si quedo clara la duda cualquier cosa pregunta que si puedo con mucho gusto contesto ;-).
#int_rtcc
void desborde()
{
desbor= desbor + 1;
de = desbor;
set_timer0(0);
}
-
Hola que tal, soy nuevo en el foro y quisiera saber algo referente al tema planteado del velocímetro, lo que yo quiero hacer es contar el número de vueltas realizado por una rueda en un segundo y multiplicarlo por 60 para obtener las rpm, bien esto lo estoy haciendo con el TIMER0 usando el pin RA4, el código que uso es el siguiente:
#include <16F877a.h>
#use delay (clock=4000000)
#byte timer0=0x01// REGISTRO DEL TIMER 0
#byte port_b=0x06// REGISTRO DEL PUERTO B
#byte port_c=0x07 /*REGISTRO DEL PUERTO C*/
/* BITS DEL OPTION_REG*/
#bit rbpu =0x81.7
#bit intedg=0x81.6
#bit tocs=0x81.5
#bit tose=0x81.4
#bit psa=0x81.3
#bit ps2=0x81.2
#bit ps1=0x81.1
#bit ps0=0x81.0
#include <lcd.c>
/*VARIABLES*/
int rps, x=0;
char velocidad;
void main()
{
lcd_init(); // Inicia LCD
lcd_putc(" RPM = \n");
delay_us(100);
rbpu=1;//
intedg=0;//
tocs=1; // TRANSICIÓN EN EL PIN T0CKI ES DECIR COMO CONTADOR
tose=1;// INCREMENTO EN BAJO A ALTO POR EL PIN T0CKI
psa=1; // EL PREESCALER ES ASIGNADO POR EL MODULO DEL TIMER 0
/* VALOR DE LA TASA DE BIT PARA EL PRESCALER 111 = 1:256 */
ps2=1;
ps1=1;
ps0=1;
while(1){
/*CONTEO DE PULSOS ENTRADA RAB*/
timer0=0;
delay_ms(1000); // LEE LOS PULSOS EN UN SEGUNDO
x=timer0; // VARIABLE QUE CONTIENE LOS PULSOS
/* PASO LOS PULSOS EN FUNCIÓN DE KM/H */
velocidad=60*x;
lcd_gotoxy(7,2); //posicion en el LCD
printf(lcd_putc,"%u",velocidad);
delay_ms (500);
}
}
efectivamente me cuenta los pulsos generados y los visualizo en la lcd como se muestra en las imágenes, pero si estos pulsos pasan de cuatro no me visualiza el valor que quiero, es decir para los cuatro pulsos me enseña el valor de 240 lo cual es correcto y para cinco me enseña el valor de 44, supongo debido a que 256 + 44 = 300 lo cual es correcto también pero quiero que me enseñe el valor "300", no el valor de "44"
Agradezco la ayuda prestada, un fuerte abrazo y mil bendiciones
-
El error es que estas trabajando con variables de 8bits y solo llegas a poder mostrar el numero 255, todo numero superior te lo trunca y acomoda como decis vos, y te muestra el 44 para 300 rpm.
Tienes que usar una variable de 16 bits porque char es para 8 bits.
Y cuando usas el printf creo que debes usar %d en ves de %u.
El TMR0 te llega a contar 4 vueltas por segundo? No vas a tener problema por ese lado, el tema es que dejas el micro ocupado durante 1 segundo para que cuente los pulsos y esto te da que solo puedes refrescar el valor de velocidad cada 1 segundo.
Yo cambiaría la idea del programa para que midiera el tiempo entre pulsos y así puedes tener mayor refresco del valor de velocidad. Para eso vas a tener que usar la interrupción por RA4.
Por ahí en el programa pones KM/H, creo te refieres a RPM, no?
-
muchas gracias por tú respuesta willynovi, he de hacer caso a lo que dices, me parece de mayor utilidad como lo propones... después te cuento como me fue ... buen día, buena semana, buen mes, buen año y muy pero muy buena vida :)
-
Ola chenao,, interesante tu proyecto lo simule pero tengo una duda, el auto en el que pretendo instalar el velocimetro tiene un radio 0.375m por lo que modifique ami proposito la formula: velocidad = (33134/total_t); hasta ahi bn, el carro ya posee un sensor: el cual con un osciloscopio medi y con la ayuda del gps de mi celular vi que por 10km/h tenia una frecuencia de 9 hz, a 20km/h -- 18hz y asi sucesivamente.. en la simulacion le ingrese 9hz por el pin B0 pero me da 59km/h.. ?
-
Hola jairosaw
velocidad = (33134/total_t)
La verdad no entiendo de donde sacas el valor de 33134.
Para poder ayudarte debes poner más información, es decir, el predivisor de frecuencias que esta utilizando, la frecuencia de oscilador etc. Debido a que el modelo matemático describe la velocidad se encuentra en función de estos parámetros. Por otro lado, que sensor estas utilizando para medir el tiempo de cada revolución.
-
Gracias por responder chenao,, yo utilizo la formula que planteaste "V = (88358*r) / (255*desbordes + Valor del TMR0 actual) (1.Cool " como mi radio es 0.375metros, lo que hice fue "V = (88358*0.375) / (255*desbordes + Valor del TMR0 actual) " eso me queda = "V = (33134) / (255*desbordes + Valor del TMR0 actual)" por eso velocidad = (33134/total_t); es decir lo unico que hice fue tocar esa formula puesto q ahi va implicito lo del radio de la llanta y mi radio es distinto por eso queda asi, el sensor que utlizo es propio del auto,, lo unico que se es q por 10 km/h (utlizando gps de mi celular) me da una frecuencia de 9hz (utilizando un osciloscopio) el radio de la de llanta es de 0.375 mt.
-
Gracias por responder chenao,, yo utilizo la formula que planteaste "V = (88358*r) / (255*desbordes + Valor del TMR0 actual) (1.Cool
" como mi radio es 0.375metros, lo que hice fue "V = (88358*0.375) / (255*desbordes + Valor del TMR0 actual) " eso me queda = "V = (33134) / (255*desbordes + Valor del TMR0 actual)" por eso velocidad = (33134/total_t); es decir lo unico que hice fue tocar esa formula puesto q ahi va implicito lo del radio de la llanta y mi radio es distinto por eso queda asi, el sensor que utlizo es propio del auto,, lo unico que se es q por 10 km/h (utlizando gps de mi celular) me da una frecuencia de 9hz (utilizando un osciloscopio) el radio de la de llanta es de 0.375 mt.
-
Recuerda que la expresión V = (88358*r) / (255*desbordes + Valor del TMR0 actual) fue desarrollada para un frecuencia de oscilador de 4MHz, seria bueno que pusieras el soft, Ahora con respecto al sensor me parece raro la medida que entrega porque más o menos a 7Hz se debe mover el auto a unos 60 - 80 Km.
Lo recomendable es que pongas el soft y como segundo investigues el sensor que estas utilizando.