在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取

问题描述 投票:0回答:1

我对这个领域完全陌生,真的不知道自己在做什么并且需要帮助。我正在尝试使用 MT6816 14 位磁性编码器通过 SPI 连接与 Raspberry Pi 读取绝对角度。

我有以下问题:

  1. 在硬件方面,是否只是简单地连接必要的连接(3.3V,MOSI,MISO,SCK,GND,CE01)?

  2. 对于编码部分,我使用的是 Thonny,似乎 spidev 库已预先安装为“Raspberry Pi SPI 环回测试代码”(https://gist.github.com/fnishio/b2063941b82f2cf1b935) 运行没有任何错误。因此,我假设除了在 raspi-config 中启用 SPI 之外不需要其他设置。我对吗?或者有什么方法可以测试SPI连接是否有效?

  3. 根据MT6816数据表(https://www.compel.ru/item-pdf/c51a62edcf72a97fdb3c3d9108c3c3d5/pn/magntek~mt6816ct-std.pdf:第23页),我的理解是,我需要什么(即14)位角度数据)存储在寄存器地址0x03和0x04[7:2]中。我不知道如何访问所述地址并读取这些值。

我连接了 6 根电线并尝试了代码(再次不知道我在做什么)。我在传感器周围移动磁铁,期望值的摆动范围,输出只是在 [0, 0, 0] 和 [255, 255, 255] 之间来回切换。

import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0)
spi.threewire = False
spi.mode = 3

def BytesToHex(Bytes):
    return ''.join(["0x%02X " % x for x in Bytes]).strip()

try:
    while True:
        resp = spi.xfer2([0x8300, 0x8400, 0x8500])
        #print(BytesToHex(resp))
        print(resp)
        time.sleep(0.1)

except KeyboardInterrupt:
    spi.close()
    print("Ctrl-C pressed")

我渴望学习很多东西!我将不胜感激您提供的任何帮助。

python spi raspberry-pi4
1个回答
0
投票

我用 Arduino 尝试了同样的想法,结果或多或少是一样的。

读取数据我得到0或16383。

#include <SPI.h>

const int CS_PIN = 10; // Chip Select pin
const byte READ_COMMAND = 0x83; // Read command with register address, assuming 0x03

void setup() {
  // Initialize serial communication
  Serial.begin(9600);
  
  // Set CS pin as output and deselect the sensor
  pinMode(CS_PIN, OUTPUT);
  digitalWrite(CS_PIN, HIGH);
  
  // Initialize SPI communication
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV16);  // Set SPI clock speed
  SPI.setDataMode(SPI_MODE3);            // Set SPI mode (CPOL=1, CPHA=1)
  SPI.setBitOrder(MSBFIRST);             // Set bit order (Most Significant Bit First)
}

void loop() {
  // Read sensor data over SPI
  uint16_t angleData = readAngleData();
  
  // Print the sensor data to serial console
  Serial.print("Angle: ");
  Serial.println(angleData);
  
  // Wait for a bit before the next read
  delay(1000);
}

uint16_t readAngleData() {
  // Select the sensor
  digitalWrite(CS_PIN, LOW);
  
  // Send read command for register 0x03 and 0x04
  SPI.transfer(READ_COMMAND);
  
  // Read two bytes of data from the sensor
  uint8_t highByte = SPI.transfer(0x00);
  uint8_t lowByte = SPI.transfer(0x00);
  
  // Deselect the sensor
  digitalWrite(CS_PIN, HIGH);
  
  // Combine the two bytes into a single 16-bit value
  uint16_t result = (highByte << 8) | lowByte;
  
  // Extract angle data
  uint16_t angle = (result & 0x3FFF); // 14-bit angle data
  
  return angle;
}
© www.soinside.com 2019 - 2024. All rights reserved.