RPM de motor con pic18

Que tal, tengo una pequeña duda, quiero medir las rpm de un motor y ya tengo el encoder y ya recibo los pulsos, ahora con el pic tomo esos pulsos externos con el timer1 como contador a 8 bits y con el tmr0 como temporizador a 16 bits para obtener un segundo y que salte a la interrupcion cada segundo y toma los pulsos del tmr1 y los multiplica por 60 mi pregunta es si esta forma de hacerlo es la correcta para medir las rpm o tengo que tomar algo mas en cuenta para la programacion del pic18? y como puedo simular en proteus para checar si lo estoy haciendo bien ya vi que hay un motor con encoder en proteus pero no se como comprobar las rpm que me da mi programa con lo que me muestra ese motor en la simulacion
 
Última edición:
ya que nadie me respondio aprovecho esto para preguntar como mando un valor de una variable por UART a la hyperterminal del proteus si puedo mandar caracteres asi por ejemplo mandar('a') y si los visualizo en la hyperterminal pero cuando mando el valor de una variable por ejemplo mandar(contador) no lo visualizo en la hyperterminal solo se me ocurre es que hay que convertir ese valor o algo
 
Hola. Sobre lo del proteus no te puedo ayudar porque no lo se. Lo del motor: ¿gira muy rápido o para cuantas rpm lo quieres? de cuantos pulsos es el encoder? No tienes porque medir un segundo completo. Sabiendo de cuantos pulsos es el encoder, puedes medir el tiempo entre 2 pulsos y ya sabes a que velocidad va. Y si quieres más precisión, mide el tiempo entre más pulsos, pero no necesitas llegar a 1 segundo.

Un saludo
 
pues ya lo hize midiendo los pulsos por segundo en una interrupcion dividiendolo entre el numero de ranuras del encoder que son 72 por 60 y si me da las rpm pero no tiene una gran precision, aunque si funciona, entonces el encoder es de 72 pulsos como se mide el tiempo entre pulsos?
 
Mira, cuando tengas un pulso, cargas el Timer, activas la interrupción y vas midiendo las veces que entra la interrupción, y cuando tengas otro pulso, haces el cálculo del tiempo sumando las veces que ha entrado en la interrupción y teniendo en cuenta el valor del Timer. De esta forma debería ser bástante preciso.
 
entonces checo el primer pulso con el TMR1 y el TMR0 con cuanto lo cargo? y con la interrupcion del TMR1 de flanco de subida o la de desborde del TMR0? o lo entendi mal tal vez, no tienes un ejemplo para poder guiarme mejor?
 
Me has entendido mal. Del Timer1 olvidate, sólo con el 0. No tengo ningún ejemplo porque lo que te estoy diciendo son ideas que se me ocurren. Primero, calcula una configuración de Timer0 para que se desborde cada x tiempo, el que te venga bien a ti. Si el motor gira a 1500rpm, con un encoder de 72 pulsos tendrás un pulso cada 500us más o menos, así que configura un Timer0 para que desborde cada 400us por ejemplo. Cuando tengas un flanco en el encoder, siempre el mismo, de subida o bajada, tienes que decidirte, por ejemplo el de subida, cargas el timer0 con el valor adecuado y activas las interrupciones.
Cada vez que entres en la interrupción, incrementas un contador para saber cuantos "400us" has tenido. Cuando te llegue el siguiente flanco de subida del encoder, paras las interrupciones, miras a cuanto ha llegado el contador, lo multiplicas por 400us, y además compruebas el valor del Timer para añadirselo al tiempo.

Espero que ahora lo entiendas mejor. Un saludo
 
Hola, miguelfgp.
Creo que tu primer algoritmo es el más acertado, y sencillo de programar.

Respecto del segundo algoritmo, medir el tiempo entre pulsos es difícil salvo que se trate de un giro muy lento (no sé si será el caso). A frecuencias altas estás condicionado por la frecuencia de reloj del PIC. Para el ejemplo que habéis comentado (1500 rpm) tendrías 1800 pulsos por segundo (555 microsegundos entre pulsos). Para obtener una precisión del 10% por este sistema (sobre un motor que sabes previamente que ronda las 1500 rpm) yo haría saltar el timer a 55 microsegundos y contaría, como muy bien dice rachelies, cuántos "55 microsegundos" has tenido entre pulso y pulso. La precisión de la medida va a disminuir cuando aumente la frecuencia de giro del motor.

El primer algoritmo que comentabas me parece mejor y más preciso (y más lento, pero no sé para qué emplearás la medición). Si es para visualizarlo en un display, por ejemplo, yo contaría durante 1 décima de segundo cuántos impulsos se han recibido, los multiplicaría por 600/72 (o mejor 25/3) y creo que debería ser bastante preciso.

En cuanto a qué necesitas tener en cuenta para la programación del PIC18, creo que el algoritmo es independiente del micro que utilices. El PIC18 está perfectamente capacitado para la tarea que comentas.

Espero haberte ayudado.
 
Si, se puede medir el tiempo entre 1 decima, o en vez de entre un pulso y otro, entre 5 o 10 pulsos. Con un reloj de 4Mhz tienes 1 us entre instrucciones, y con uno de 20Mhz, 50ns, que es más que suficiente para tener buena precisión. Lo que me parece mucho es medir un segundo.
Lo importante es el concepto, probar, y adaptarlo a lo que se necesite.
Un saludo
 
Atrás
Arriba