En el anterior post os mostré un contador de vueltas completas (cada 360º una vuelta). En este post os presento un encoder con toda la resolución que da el encoder más los números de vueltas (cada 360º se va sumando 4096 posiciones).
En este ejemplo, para tener toda la resolución (32 bits) lo hago funcionar a través del serial. Os dejo con una imagen de cómo se ve el ejemplo que adjunto.
Cada pin hace lo siguiente:
SDA y SCL se conecta al AS5600 para obtener los datos. Cada vez que tenga un dato lo sacará por la salida sin nombre [31:0] y se validará con un tic de "done".
"Hz" es la frecuencia I2C, que como ya expliqué en el anterior post, se puede elevar la frecuencia hasta 1MHz si así lo deseas (según el datasheet). Si el AS5600 va colocado en el eje de un motor, conviene que el muestreo sea lo más rápido posible. Has de pensar que a máxima velocidad del eje del motor se ha de conseguir al menos 3 puntos de muestra de cada giro completo.
La constante offset nos puede servir para ajustar un punto 0 concreto. Este punto 0 no tiene en cuenta la cantidad de vueltas que haya dado, esto es importante entenderlo. Aquí estamos usando un encoder absoluto como si fuese un pseudo-encoder incremental. Esto significa que dentro de los 360º tenemos un encoder absoluto, pero si das más vueltas, entonces es como tener un encoder incremental, pero con una parte absoluta. Si has de tocar esta parte, con la experiencia te irás dando cuenta de la funcionalidad del offset. Los valores posibles son de -4095 a 4095. Otros valores, mayores o menores, no tienen sentido (al menos en principio).
Un tic en "rst" pondrá a cero el número de vueltas, pero no pone a cero el encoder absoluto, para ello te has de hacer servir del offset.
Dejo un gif animado de lo que muestra en el terminal serie. Estoy moviendo el encoder con un dedo, por eso se ve que se mueve los números y para, se mueve los números y para.
Debido a que el conversor es "Uint32" (todavía no he creado otro módulo de 32 bits con signo) no salen números negativos, pero si consideras el bit 31 como signo, verías números negativos.
El terminal serie de Icestudio al comienzo tiene problemas para mostrar los números, se queda la pantalla negra sin salir nada. Lo resuelvo dándole al botón "Disconnect" y vuelvo a darle al botón "Connect", entonces aparece lo que véis en el gif de arriba. Este problema (creo que) es debido a que se envía datos al terminal serie con una frecuencia más alta de la que puede soportar y se satura. En realidad este circuito no está pensado para un terminal serie y aquí hace que el serial vaya muy forzado. Parece ser que el terminal serie de Arduino no tiene este problema, o al menos en este caso da los datos desde que conectamos al terminal serie.
He hecho unos cálculos para saber el número total de vueltas máxima que puede dar con 32 bits.
Cada vuelta son 4096 puntos.
360º / 4096 = 0.087890625º en cada paso (de un punto al siguiente).
0.087890625º x 2^32 = 377487360 pasos en total.
377487360 / 360º = 1048576 vueltas posibles. Como comienza de 0, en realidad son 1048575 vueltas posibles.
Eso son muchas vueltas! Quizás las ruedas del
Perseverance de la NASA, dé ese número de vueltas a lo largo de su vida útil.
Adjunto ICE.
Saludos.