AD5270带Python的SPI电位计

2024-06-06 13:49:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用AD5270,20KOhm SPI电位计,用于我的树莓Pi 3B+个人项目。我将一些Arduino库代码翻译成Python语言,但它看起来不起作用。我无法测试电位计是否配置了良好的值,因此我读取电阻器值,并始终从SPI寄存器中获取0

问题:我不知道我的书写是否很好,因为我不能探测电阻。为了知道它是否有效,我读取寄存器并始终接收0x00。写作和/或阅读不起作用

期望:读我写的东西

硬件设置:

  • !!SYNC=CE0=PIN24
  • DIN=MISO=PIN19
  • SDO=MOSI=PIN21
  • SLCK=SCLK=PIN23

带有1uF外部电容器和3V3电源(来自Raspberry)

AD5270的数据表可从here获得

数据表后面的最低限度代码不起作用:

spi = spidev.SpiDev()
spi.open(spi_bus, spi_device_select)
spi.max_speed_hz = 50000                                # Datasheet p7
spi.mode = 1                                            # CPOL = 0, CPHA = 1 (Datasheet p7)
# Datasheet example
data = [0x1C, 0x03]
r = spi.xfer(data)
print(r)
data = [0x05, 0x00]
r = spi.xfer(data)
print(r)
data = [0x08, 0x00]
r = spi.xfer(data)
print(r)
data = [0xC0, 0x00]
r = spi.xfer(data)
print(r)

Tags: 项目代码spidatapi寄存器树莓数据表
2条回答

我终于掌握了窍门。不要忘记在SDO线上添加一个上拉,并为AD5270配置Spidev。这段代码运行得很好:

# SPI test code for AD5270BRMZ-20
import time
import spidev

spi_bus = 0                                              # SPI0
spi_device_select = 0                                    # CE0

spi = spidev.SpiDev()
spi.open(spi_bus, spi_device_select)
spi.max_speed_hz = 50000                                # Datasheet p7
spi.mode = 1                                            # CPOL = 0, CPHA = 1 (Datasheet p7)
spi.lsbfirst = False                                    # Datasheet p18

MAX_RESISTANCE      = 20000.0
WRITE_CTRL_REG      = 0x1C
READ_CTRL_REG       = 0x20
WRITE_RDAC          = 0x04
READ_RDAC           = 0x08
RDAC_WRITE_PROTECT  = 0x02

def AD5270_CalcRDAC(resistance):
    return int((resistance / MAX_RESISTANCE) * 1024.0)

def AD5270_ReadReg(command):
    data = [(command & 0x3C), 0]
    r = spi.xfer2(data)
    data = [0x00, 0x00]
    r2 = spi.xfer2(data)
    result = r2[0]
    result = (result << 8) | r2[1]
    return result

def AD5270_WriteReg(command, value):
    ui16Command = (command & 0x3C) << 8 | (value & 0x3FF)
    data = [(ui16Command >> 8) & 0xFF, ui16Command & 0xFF]
    spi.xfer2(data)

def AD5270_ReadRDAC():
    RDAC_val = AD5270_ReadReg(READ_RDAC)
    RDAC_val &= 0x03FF
    return ((RDAC_val) * MAX_RESISTANCE) / 1024.0

def AD5270_WriteRDAC(resistance):
    RDAC_val = AD5270_CalcRDAC(resistance)
    spi.xfer2([WRITE_CTRL_REG, RDAC_WRITE_PROTECT])
    AD5270_WriteReg(WRITE_RDAC, RDAC_val);
    return ((RDAC_val * MAX_RESISTANCE) / 1024.0)

while(1):
    AD5270_WriteRDAC(10000.0) # Write 10KOhm
    print(AD5270_ReadRDAC())
    time.sleep(1)

spi.close()

从硬件设置:

  • DIN=MISO=PIN21(通过10欧姆电阻器)
  • SDO=MOSI=PIN19(通过10欧姆电阻器)

DIN是AD5270的输入,因此是RPI的输出,所以应该是MOSI。SDO也有同样的问题

相关问题 更多 >