我在Raspberry Pi 3 B +上使用Python 3操作AD5272時出現問題。 AD5272是帶有I2C接口的數字控制變阻器(我的部件具有20 kOhm的電阻)。在Raspberry Pi 3 B +上使用Python 3和smbus2操作AD5272 B +
問題是以下幾點:
A和W端之間的電阻不改變任何位置我試圖建立和周圍爲10Mohm停留。 (默認情況下,當AD5272打開時,設置全部電阻的一半)。 當我讀取RDAC的阻力時 - 讀取零阻力。
這是我的代碼:
#!/usr/bin/python3
import smbus2
import time, os
class AD527x():
# command bits which are dependant on I2C address of device
def __init__ (self, bus=1, address=0x2E, resistance = 20000, positions = 1023, reset = False):
self.bus = smbus2.SMBus(bus)
self.positions = positions
self.address = address
self.resistance = resistance
def write_position (self, position):
# sets the rheostat to certain position
# if wiper position is higher than maximal
if position > self.positions:
position = self.positions
# approximate resistance of rheostat
resistance = self.resistance*position/self.positions
# for AD5274 needs to be shifted for 2 digits left
if self.positions == 256:
position = position << 2
print ("Binary representation of position for RDAC : " + bin (position))
# Writing position is sneding 2 bytes one by one
# MSB Data: 0 0 C3 C2 C1 C0 D9 D8
# For writing command bytes: C3 = 0; C2 = 0; C1 = 0; C0 = 1
# 0 0 0 0 0 1 ? ?
# ? ? - MSB of 10-digit binary representation of wiper position between 0 and 1023
# two first positions : D9_8 = (position & 0b1100000000) >> 8
MSB = (1 << 3) | ((position & 0b1100000000) >> 8)
print ("MSB : " + bin(MSB))
# take last 8 bits
LSB = position & 0b11111111
print ("LSB : " + bin(LSB))
print ("All Bytes : " + bin((MSB << 8) +LSB))
print ("Value : " + str(resistance))
self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB])
self.read_position()
def read_position (self):
# reads current position of rheostat
# prepare the circuit to send data
# MSB Data: 0 0 C3 C2 C1 C0 D9 D8
# For reading command bytes: C3 = 0; C2 = 0; C1 = 1; C0 = 0
# 0 0 0 0 1 0 ? ?
# ? ? - Doen't matter - Just use zeros
# LSB - doesn't matter, just using 0b00000000
MSB = 0b00001000
LSB = 0b00000000
self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB])
#read 2 bytes from RDAC
a = self.bus.read_byte(self.address)
time.sleep (0.005)
b = self.bus.read_byte(self.address)
value = ((a << 8) | b)
print (value)
# take 10 lats bits only
value = value & 0b1111111111
print (value)
def main():
device = AD527x()
device.write_position(1023)
if __name__ == "__main__":
main()
的輸出是:
Binary representation of position for RDAC : 0b1111111111
MSB : 0b1011
LSB : 0b11111111
All Bytes : 0b101111111111
Value : 20000.0
4096
0
計算機:Rapberry裨3,模型B +
OS:Raspbian 9
Python的版本: 3.5.3
I2C包:smbus2
型號:AD5272BRMZ-20
數據表:http://www.farnell.com/datasheets/1706490.pdf
什麼我做錯了,如何解決呢?
零件的接線是三重檢查的。從RDAC讀取的數據總是相同的,無論我試圖在那裏寫什麼值。我想這兩個命令:
self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB])
和
self.bus.write_byte (self.address, MSB)
self.bus.write_byte (self.address, LSB)
結果總是相同的:阻力不會改變。用外部歐姆表裝置檢查電阻。
請幫忙!
我會盡力做到這一點。現在我認爲這個問題可能是在I2C接口的Python實現中。我注意到一些組件重新調用特定的I2C時鐘速度。 – Iegor