AD5270带Python的SPI电位计
我尝试使用AD5270,20KOhm SPI电位计,用于我的树莓Pi 3B+个人项目。我将一些Arduino库代码翻译成Python语言,但它看起来不起作用。我无法测试电位计是否配置了良好的值,因此我读取电阻器值,并始终从SPI寄存器中获取0 问题:我不知道我的书写是否很好,因为我不能探测电阻。为了知道它是否有效,我读取寄存器并始终接收0x00。写作和/或阅读不起作用 期望:读我写的东西 硬件设置:AD5270带Python的SPI电位计,python,raspberry-pi,spi,sensors,Python,Raspberry Pi,Spi,Sensors,我尝试使用AD5270,20KOhm SPI电位计,用于我的树莓Pi 3B+个人项目。我将一些Arduino库代码翻译成Python语言,但它看起来不起作用。我无法测试电位计是否配置了良好的值,因此我读取电阻器值,并始终从SPI寄存器中获取0 问题:我不知道我的书写是否很好,因为我不能探测电阻。为了知道它是否有效,我读取寄存器并始终接收0x00。写作和/或阅读不起作用 期望:读我写的东西 硬件设置: !!SYNC=CE0=PIN24 DIN=MISO=PIN19 SDO=MOSI=PIN21
- !!SYNC=CE0=PIN24
- DIN=MISO=PIN19
- SDO=MOSI=PIN21
- SLCK=SCLK=PIN23
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)
从硬件设置:
- DIN=MISO=PIN21(通过10欧姆电阻器)
- SDO=MOSI=PIN19(通过10欧姆电阻器)
DIN是AD5270的输入,因此是RPI的输出,所以应该是MOSI。SDO也有同样的问题。我终于掌握了窍门。不要忘记在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()
AD5270BRMZ-20的SPI测试代码
导入时间
导入spidev
spi_总线=0#SPI0
spi_设备_选择=0#CE0
spi=spidev.spidev()
spi.open(spi_总线、spi_设备选择)
spi.max_速度_hz=50000#数据表p7
spi.mode=1#CPOL=0,CPHA=1(数据表p7)
spi.lsbfirst=False#数据表p18
最大电阻=20000.0
写入\u CTRL\u REG=0x1C
读取\u CTRL\u REG=0x20
写入_RDAC=0x04
读取\u RDAC=0x08
RDAC_WRITE_PROTECT=0x02
def AD5270_CalcRDAC(电阻):
返回整数((电阻/最大电阻)*1024.0)
def AD5270_ReadReg(命令):
数据=[(命令&0x3C),0]
r=spi.xfer2(数据)
数据=[0x00,0x00]
r2=spi.xfer2(数据)
结果=r2[0]
结果=(结果8)和0xFF,UI16命令和0xFF]
spi.xfer2(数据)
def AD5270_ReadRDAC():
RDAC_val=AD5270_ReadReg(读取RDAC)
RDAC_val&=0x03FF
返回值((RDAC值)*最大电阻)/1024.0
def AD5270_WriteRDAC(电阻):
RDAC_val=AD5270_CalcRDAC(电阻)
spi.xfer2([WRITE\u CTRL\u REG,RDAC\u WRITE\u PROTECT])
AD5270_WriteReg(WRITE_RDAC,RDAC_val);
返回((RDAC值*最大电阻)/1024.0)
而(一):
AD5270_WriteRDAC(10000.0)#写入10欧姆
打印(AD5270_ReadRDAC())
时间。睡眠(1)
spi.close()
初学者的错误。我改了,但还是不行。我按照数据表编写了最简单的代码。并始终收到[0x00,0x00]。请使用固定pin布局更新您的问题。极简主义的代码很棒,我可能会删除长代码,因为它不会增加问题。如果你将味噌直接连接到MOSI,消除AD5270,它是否能像预期的那样工作(你得到你所发送的)?我在RPi上跳转味噌和MOSI,并将其作为输出:[14,1],[2,0],[4,0],[96,0],我预期[xx,xx],[28,3],[5,0],[8,0]。我用
wiringpi.wiringPiSPIDataRW()尝试了相同的代码
而不是SpiDev并获取我发送的内容,但仍然无法使用AD5270。这不是它的工作方式。你应该得到“[28,3]…”,在开始时没有垃圾。发送和接收同时发生。你得到的值似乎移动了一位,但在其他方面是正确的。