Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

Hace 3 Semanas #1

Avatar de ingeniero18

Tacómetro de baja velocidad con Arduino
Cómo andan? Ando necesitando diseñar un tacómetro con Arduino el cual pueda medir velocidad menores a 100rpm con una resolución de 1rpm. El tema es que estuve haciendo uno pero la resolución es malísima y no sé por qué. Paso al código:

Código:
int ledPin = 13; // IR LED conectado al pin 13
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;

void rpm_fun()
{
rpmcount++;
}

void setup()
{
//Interrupt 0 esta en el pin 2 del arduino, es donde esta conectado el detector de IR
//La interrupcion se activa por FALLING, cuando va de Alto a bajo
attachInterrupt(0, rpm_fun, FALLING);
pinMode(ledPin, OUTPUT);//se activa el led IR
digitalWrite(ledPin, HIGH);
rpmcount = 0;
rpm = 0;
timeold = 0;
}

void loop()
{
delay(1000);//se actualiza el RPM cada segundo
detachInterrupt(0);//no entrar en las interrupciones durante el calculo de RPM
rpm = 30*1000/(millis() – timeold)*rpmcount;
timeold = millis();
rpmcount = 0;
attachInterrupt(0, rpm_fun, FALLING);//Reinicia la funcion de Interrupcion
}
Estoy simulando el proyecto con un motor paso a paso en cuyo eje hay instalado un encoder de 10 ranuras que son detectadas con un sensor de ranura y lo qué hago es, mediante una interrupción, contar la cantidad de ranuras detectas en 1 segundo... aplico fórmula y obtengo el resultado en un display. La cosa es que el error es de como unas 10rpm por cada ranura y no lo puedo corregir.

¿El método para baja velocidad está bien aplicado o debería implementar otro?

Muchas gracias!!!!

p.d.: adjunto una foto del motor con el encoder
Hace 3 Semanas #2

Avatar de Nuyel

no me gusta tu método, deberías usar pulseIn() y leer el ancho del pulso, luego, la velocidad será proporcional al ancho, de esta forma la actualización no se realiza contando pulsos, si no leyendo cuanto tarda en pasar cada pulso.

Cual seria la formula? bueno, el ancho del puso suponiendo que entre abierto y cerrado tiene la misma longitud de arco, entonces deducimos que para 1RPM la duración del pulso seria 1s/(10ranuras+10paredes)= 50ms para 1RPM, ahora para X RPM seria cosa de dividir 50ms entre al ancho capturado, asi si se captura un pulso de 25ms entonces 50ms/25ms=2 RPM si se captura uno de 5ms seria 50/5=10 RPM, si se captura uno de 200ms 50/200=0,25 RPM, fácil , al menos en teoría

El método de hacerlo por cuenta no creo que te sea útil con tan baja velocidad, el problema es que necesitas muchas muestras para hacerlo con precisión.
Hace 3 Semanas #3

Avatar de TRILO-BYTE

y que tal contar el numero de pulsos en un tiempo determinado

digo dentro un timer y cuando el timer se acaba ver cuantos pulos, digo 1 segundo entre 4 son 250ms
contar el numero de pulsos en ese tiempo.


usar delays es un crimen y mas en un arduino que es la sopita maruchan de los microcontroladores
Hace 3 Semanas #4

Avatar de Scooter

Para medir bajas revoluciones, mide el periodo y saca la inversa.
Simplemente pones una interrupción del sensor de rpm y miras cuantos ticks han pasado. Son tres instrucciones.
Así sabes las rpm a cada vuelta y no a cada segundo. Luego decides si envías el dato o no.
Tienes que poner un comprobador de desborde de tiempo porque si se para el motor no te das cuenta, piensas que las rpm son las últimas que viste.

Y sobre todo y para todo borra de tu mente la instrucción delay. Lo estropea TODO.

Enviado desde mi 5056D mediante Tapatalk
Hace 3 Semanas #5


Juazzz.... Casualmente por ésta situación fue que deje de lado el lenguaje/entorno del Arduino, programando un velocímetro no pude controlar decentemente el tiempo de barrido de unos led display siete segmentos, aun menos leer el módulo ICP y programar el TIMER1 por desborde.

Termine aprendiendo Avr-gcc, que me fue mucho más útil, porque tengo control pleno sobre el microcontrolador, o sea las placas Arduino las continuo empleando, pero las programo directamente en "C".

El asunto está hartamente explicado en diversos sitios, pone en el buscador
"avr-gcc + speedometer" o
"avr + tachometer + digital"
y yerbas así, aparecen hasta códigos para que los estudies.

El problema con el Arduino es que su "lenguaje/entorno" solo te da la posibilidad de emplear dos interrupciones las externas INT0 INT1 y ahí se termino... Dejando de lado el uso de las demás interrupciones y sus circuiteria/módulos asociados, por ejemplo el ICP.

En resumen el problema tuyo se puede resolver de la siguiente manera, programas el ICP su configuración seguramente con divisor de 1024, porque tus tiempos son grandes, capturas su disparo con su correspondiente interrupción y te fijas cuantas cuentas logró el timer1, por si hay desborde tambien hay que habilitar la interrupción por desborde del timer1, sumas el asunto en unos contadores que programaste y tenes el tiempo de giro de ese motor, porque al fin y al cabo lo que medís es el tiempo entre dos flancos.

Según vi se puede hacer mezclando un poco de código del avr-gcc con el lenguaje del arduino. Como sensores te recomiendo emplear uno de efecto hall completamente digital y con schmitt trigger.

También sería bueno que busques el código del velocímetro de Amanda Ghassaei, en Instructables, Ella hace un velocímetro para la bici con un Arduino, busca "bike speedometer + Amanda Agassaei" y lo tenés, conste que Ella encara el asunto con otro truco, pero al fin logra el cometido.

Un consejo, para cosas serias me iría olvidando del lenguaje del Arduino y empezaría a estudiar como programat en C los micros de Atmel, para seguir empleando la tremenda cantidad de sensores y placas que existen ahora.
Hace 3 Semanas #6

Avatar de Scooter

Pues yo lo he hecho usando los tics del sistema, cada vez que llega una interrupción del sensor resta medida anterior de medida actual y va bastante bien. hay de milisegundos y de microsegundos, a elegir.
Eso si, cada vez que desborda el contador de tics que es un int32, creo, hará una cosa rara, pero eso es una vez cada bastante tiempo. Se puede corregir por software pero no tenía ganas.

Hay librerías para el uso de los timers y sus interrupciones desde el entorno arduino, Antes había que poner un parche con un trozo de código gcc, pero ya no hace falta.
Lo raro/absurdo es que eso sea opcional y los delays "de serie"

Y si, con ganas y conocimientos es comprensible ignorar el entorno arduino que está lleno de atajos cutres.
Hace 2 Semanas #7
Suspendido


Tomado de
http://www.instructables.com/id/Meas...eter/?ALLSTEPS

lo bonito de su rutina es el uso de la función millis() ... Obten el tiempo actual
Para calcular las RPM actuales, necesitas el periodo de la señal de tu sensor.
la función (millis() - tiempo_anterior) nos da ese tiempo.

donde tiempo_anterior es una medida anterior de millis

En tu caso, Sea t = el periodo de la señal de entrada,
....................... REV = el número de pulsos recividos durante ese periodo

Así que el número total de revoluciones en 60sec ( 60* 1000 millisecond ) es :

....... rpm = 60*1000 / {(t)* REV} =>
....... rpm = 60*1000 / (millis() - tiempo_anterior ) * REV/(número de slots x revolución)
....... como tienes 10 ranuras en tu sensor
....... rpm = 6*1000 / (millis() - tiempo_anterior) * REV;

Este otro tutorial esta mejor y usa una arandela ranurada con 20 secciones
https://brainy-bits.com/tutorials/sp...-with-arduino/
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.