Outils pour utilisateurs

Outils du site


encodeur_rotatif_a_effet_hall_pandauto_p3022_avec_puce_as5048a

Encodeur rotatif à Effet Hall Pandauto P3022 avec puce AS5048A

Avec Communication en SPI

AS5048A de AWS

  • 1 bit de parité
  • 1 bit error flag
  • 14 bits indiquant l'angle absolu sur 14 bits.

Lorsqu'on lit les données SPI dans les 2 octets, il y a donc les 6 derniers bits du premier octet à concaténé avec les 8 bits du second octet pour reconstituer le mot de 14 bits.

Ressources sur le SPI

Activation du SPI sur la Raspberry PI

Activation du SPI Aller dans Menu, Settings, Enable SPI, puis Vérifier si SPI est activé

Sketch Arduino pour AS5048A

Exemple pour Arduino UNO

#include <AS5048A.h>
AS5048A angleSensor(10);
void setup()
{       Serial.begin(115200);
	angleSensor.init();      }
void loop()
{       delay(10);
	word val = angleSensor.getRawRotation();
        Serial.println(val, DEC);                }

La lib a le cycle suivant

  • set à 0 du PIN Slave Select
  • envoi de 0b1111111111111111
  • lecture
  • set à 1 du PIN Slave Select

Récupération de l'angle sur la Pi

Sur une UNO, le SPI est utilisé pour le capteur, la Pi doit récupérer les datas en I2C. Compter 2 à 3 ms.

Capteur sur la Pi en SPI

Il est absolument nécessaire de brancher un adaptateur de tension entre la Pi (en 3.3V) et le capteur (en 5V).

"""
De Arduino en debug:
 
Read (0x3FFF) with command: 0b1111111111111111 avec un transfert16
Read returned: 1101110100001010
Setting error bit
3433
Read (0x3FFF) with command: 0b1111111111111111
Read returned: 101110100000111
Setting error bit
3432
 
"""
 
from time import time, sleep
import pigpio
 
CE = 8
 
pi = pigpio.pi()
sensor = pi.spi_open(0, 1000000, 1)
 
dt = 0.00001
 
pi.write(CE, 1)
sleep(dt)
 
t0 = time()
n = -1
nbr = 1000
tempo = 0.03
while n < nbr:
    n += 1
    pi.write(CE, 0)
    sleep(dt)
 
    c, d = pi.spi_xfer(sensor, int.to_bytes(65535, 2, 'big'))
    if c == 2:
        val = (d[0] & 0b00111111) << 8 | d[1]
        angle = int(val/4)
 
    # #if n % 20 == 0:
        # #print(angle)
 
    pi.write(CE, 1)
 
    sleep(tempo)
 
pi.stop()
 
periode = (((time() - t0) / nbr) - tempo)*1000  # ms
print("periode =", round(periode, 2), "ms")
sleep(1)
 
"""
periode = 1.9 ms
il y a quelques incohérences dans les valeurs
 
sans print
periode = 1.3 ms
periode = 1.19 ms
 
"""

Sans print, le temps de récupération de la valeur est de 1.3 ms à 1 MHz et 1.2 ms à 3 MHz.

encodeur_rotatif_a_effet_hall_pandauto_p3022_avec_puce_as5048a.txt · Dernière modification : 2022/09/07 11:33 de serge