我对这个领域完全陌生,真的不知道自己在做什么并且需要帮助。我正在尝试使用 MT6816 14 位磁性编码器通过 SPI 连接与 Raspberry Pi 读取绝对角度。
我有以下问题:
在硬件方面,是否只是简单地连接必要的连接(3.3V,MOSI,MISO,SCK,GND,CE01)?
对于编码部分,我使用的是 Thonny,似乎 spidev 库已预先安装为“Raspberry Pi SPI 环回测试代码”(https://gist.github.com/fnishio/b2063941b82f2cf1b935) 运行没有任何错误。因此,我假设除了在 raspi-config 中启用 SPI 之外不需要其他设置。我对吗?或者有什么方法可以测试SPI连接是否有效?
根据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")
我渴望学习很多东西!我将不胜感激您提供的任何帮助。
我用 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;
}