Total de pulsos en 1 vuelta de un motor DC

Hola a todos. Resulta que estoy realizando un proyecto para una materia con Raspberry Pi y necesito saber como imprimir la cantidad de pulsos de un motor DC en 1 vuelta. Estoy usando un motor de referencia Faulhaber 1524B009SR (en pocas palabras a 9V) que contiene un Encoder de cuadratura. Según mi instructor, en 1 giro la cantidad total de pulsos es de 38912 aproximadamente, pero aunque estoy trabajando por interrupciones al configurar los pines GPIO de la Raspberry, no logro que me imprima esa cantidad de pulsos, por el contrario me muestra una cantidad mucho menor que varía de acuerdo a la velocidad del motor dada por el PWM (cosa que no debería pasar).

El error debe estar en la forma de almacenar los datos, o no se si me haga falta alguna función o configuración especial. De verdad que agradecería cualquier ayuda. Aquí les muestro el código en Python:

Código:
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)                                  #para las interrupciones del GPIO

can_a=36
can_b=38
GPIO.setup(can_a, GPIO.IN)
GPIO.setup(can_b, GPIO.IN)
GPIO.add_event_detect(can_a, GPIO.BOTH)        #BOTH: deteccion por interrupcion de 0-1 o 1-0 de acuerdo al sentido de giro
GPIO.setup(35, GPIO.OUT)
GPIO.setup(33, GPIO.OUT)
GPIO.output(33, GPIO.LOW)
p=GPIO.PWM(35, 50)                                      #pin GPIO35 con frecuencia al 50%

cont=0
vuelta=1
p.start(3)                                                      #inicia variable "p" con PWM del 3%
num=vuelta*17500                                         #17500: cantidad aprox de pulsos por vuelta con PWM del 3%
while True:
    if (cont==num):
        p.stop()
    else:
        if GPIO.event_detected(can_a):                 #Deteccion de interrupcion
            if (GPIO.input(can_a)==GPIO.input(can_b)):
                 cont=cont+1
                 print cont
            else:
                 cont=cont-1
                 print cont

p.stop()                                                        #detiene variable "p"
GPIO.cleanup()                                              #limpia los pines GPIO ...
 
Última edición por un moderador:
Sabes como declarar la variable como Long? En un tutorial ví que solo es poner la letra 'L' al final del numero de inicialización (cont = 0L) pero tampoco me funciona.
 
Hola NOVOUP de un ex rolo, o casi rolo! Viví de 1970 a 1976 en Bogotá, donde complete el bachillerato antes de irme a estudiar a Alemania! Me he ocupado algo en la materia de codificadores de cuadratura, y allí en especial con sensores angulares magnéticos de la empresa AMS, Austria Microsystems, probablemente una de las empresas mas avanzadas en materia de sensores angulares. La mas alta resolución que ofrecen los productos de esta empresa y de los que son disponibles por los 3 PWMs, "A", "B" e "I" la codifiación de cuadratura es de 2048 pulsos por giro de 360°. De allí la resolución que dices te han dado esta fuera de norma en este universo!

2048 pulsos significa que 2048 veces por revolución de 360° aparecen los pulsos "A" y "B". Según si viene primero el impulso "A" y luego el "B", entonces el motor gira en una dirección. Si al contrario primero viene el pulso "B" y luega el "A", entonces la dirección de giro es inversa al primer ejemplo.

El pulso "I", llamado Ìndice, aparece una vez por revolución , osea una vez cada 360°

Este tipo de reporte de giro de cuadratura y para el cual el LPC1769 de NXP por ejemplo tiene una periferia que decodifica los pulsos de cuadratura, también se llama decodificador angular incremental. Porque lo que informa es el incremento o decremento, dependiendo de la dirección de giro de las hasta 2048 posiciones angulares en 360°. Es tarea de la software y en conjunto con las periferias correspondientes disponibles en algunos microcontroladores, pero también lo puedes hacer usando 3 GPIOs que ejecuten una interrupción, el llevar cuentas en una variable que así es incrementada o decrementada. Cada vez que el pulso "I" se repite, la software sabe que un nuevo giro ha empezado. por eso se denomina incremental encoder!

Sensores angulares también pueden poseer la posibilidad de reporte de posición angular absoluto. Esta por lo general tiene una resolución mayor a la incremental de 2 bits.

15801971481_f612383575_c.jpg
 
...Según mi instructor, en 1 giro la cantidad total de pulsos es de 38912 aproximadamente, pero aunque estoy trabajando por interrupciones al configurar los pines GPIO de la Raspberry, no logro que me imprima esa cantidad de pulsos, por el contrario me muestra una cantidad mucho menor que varía de acuerdo a la velocidad del motor dada por el PWM (cosa que no debería pasar).
El manejo de interrupciones nunca alcanza para leer un codificador óptico a velocidad normal de giro del motor!!!
Te debes estar comiendo muchos pulsos del encoder mientras estás en la ISR... y por otra parte esa no es la forma correcta de hacerlo. Tenés que usar alguno de los timers internos, calcular la diferencia entre lecturas y así saber la cantidad de pulsos contada.

Imaginate vos mismo el resto... y no copiés lo qie ves en la web, por que los que leen encoders por interrupciones no tienen ni la más palida idea de lo que están haciendo.
 
Cuando dices usar un timer interno, supongo que te refieres a que se use la lectura del codificador óptico como señal de reloj, para que el timer esté contando los pulsos que recibe. Y otro timer interno para ir leyendo esa cuenta en periodos fijos.
 
@Dr. Zoidberg: para poder evaluar si tu respuesta es adecuada deberíamos saber que tan rápido gira el motor? Así de forma general tu respuesta creo que es inadecuada!

Lo que a mí me parece mas raro, es el número de pulsos que disque el sensor óptico puede proveer durante un giro de 360°! Habría que saber mas al respecto. El número de pulsos ni siquiera es una potencia de 2!
 
Cuando dices usar un timer interno, supongo que te refieres a que se use la lectura del codificador óptico como señal de reloj, para que el timer esté contando los pulsos que recibe.
Exactamente, por que de esa forma no hay ninguna sobrecarga del procesador para estar viendo en cual flanco del pulso está y contarlo.

Y otro timer interno para ir leyendo esa cuenta en periodos fijos.
Eso ya no lo sé...
Si el codificador óptico tiene pulso índice, puede mandarse ese pulso a la línea de interrupción para que la ISR lea el valor del timer en cada vuelta y sepa la cantidad de pulsos. Si no lo tiene... estamos complicados... y hay que inventar otra cosa.

@Dr. Zoidberg: para poder evaluar si tu respuesta es adecuada deberíamos saber que tan rápido gira el motor? Así de forma general tu respuesta creo que es inadecuada!
No deberíamos saber nada, a menos que el motor de una vuelta por hora :cool:
Es un tema puramente conceptual, y si los conceptos está errados no podemos esperar nada del desarrollo que resta hacer.

Lo que a mí me parece mas raro, es el número de pulsos que disque el sensor óptico puede proveer durante un giro de 360°! Habría que saber mas al respecto. El número de pulsos ni siquiera es una potencia de 2!
No es potencia de 2 ni tiene por que serlo. Todo depende de la resolución que se pretenda lograr con ese sensor. Lo unico importante es saber si tiene pulso índice o nó.
 
Hay algunas cosas que no se han echo, lo cual hace que se especule much sin resultados a la vista
Por lado alguién se tomo la molestia de hubicar ese motor? no es un motor chino ni nada que se le paresca, por el contrario es de un fabricante de peso en el mercado que cubre cosas como el aeroespacio y otras
Todos los años recibo el catalogo de esa firma y otras, de igual modo se puede ver en la red
se trata de un motor que en vacio gira a 10000 RPM
Lamentablemente nadie pido por el tipo de enconder que esta utilzando, es decir saber marca y modelo, para saber si es incremental o absoluto
Este tipo de encoders que para esas RPM es óptico, los pulsos que entrega son potencia de 2 (512-1024-2048-4096) y porque potencias de dos? porque normalmente se entrega esta señal a un micro o circiuito digital, no olvidarse que es un producto industrial y por lo tannto cumple con esos standares
Sus salida son A, B, Z y hay modelos que trae adicionalmente A, B, Z negados, el primer grupo se utilza para el control del motor y el segundo para referencias de poscionamiento(DRO)

Por otro lado se sigue especulando y el interesado no aparecio más....... obvio no le interesan estas especulaciones, quiere una solución ya!!!
Si el interesaso lee esto por favor postee marca y modelo de enconder, sin eso no se puede ayudar
 
Otro detalle: el hacer el programa en Python también influye. Aunque la ejecución puede ser rápida, es mucho mejor que la programación se haga con un C o C++, ya que será aún más rápido.

A no ser que compile el programa en Python, la diferencia de prestaciones entre los dos lenguajes puede ser muy alta.
 
Atrás
Arriba