2017-09-15 5 views
1

J'ai un problème de fonctionnement de l'AD5272 en utilisant Python 3 sur Raspberry Pi 3 B +. AD5272 est le rhéostat à commande numérique avec interface I2C (ma pièce a une résistance de 20 kOhm).Utilisation de l'AD5272 avec Python 3 et smbus2 sur Raspberry Pi 3 B +

Le problème est le suivant:

La résistance entre bornes A et W ne change pas la position que je suis en train de mettre en place et reste autour 10KOhm. (Par défaut, lorsque AD5272 est activé, la moitié de la résistance complète y est définie). Quand je lis la résistance de RDAC - est lu zéro résistance.

Voici mon code:

#!/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() 

La sortie est:

Binary representation of position for RDAC : 0b1111111111 
MSB : 0b1011 
LSB : 0b11111111 
All Bytes : 0b101111111111 
Value : 20000.0 
4096 
0 

Ordinateur: Rapberry Pi 3, modèle B +

OS: Raspbian 9

Version Python: 3.5.3

package I2C: smbus2

Référence: AD5272BRMZ-20

Fiche technique: http://www.farnell.com/datasheets/1706490.pdf

lien produit: http://www.newark.com/webapp/wcs/stores/servlet/ProductDisplay?catalogId=10001&langId=-1&urlRequestType=Base&partNumber=52R8114&storeId=10194

Qu'est-ce que je fais mal et comment y remédier?

Le câblage de la pièce a été vérifié trois fois. Les lectures de RDAC sont toujours les mêmes, quelle que soit la valeur que j'essaie d'écrire ici. J'ai essayé deux commandes:

self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB]) 

et

self.bus.write_byte (self.address, MSB) 
self.bus.write_byte (self.address, LSB) 

résultat était toujours le même: la résistance ne change pas. La résistance a été vérifiée avec un ohmmètre externe.

S'il vous plaît, aidez!

Répondre

0

Je viens de frapper le même problème. Je n'ai pas encore cherché à m'interfacer avec Python, mais cela peut néanmoins aider.

Dans mon circuit, l'AD5272 I2C est adressé avec GND et j'ai la borne A connectée à VDD (5V) et W en série avec une résistance de 100K à GND.

D'abord je me suis assuré que le périphérique était opérationnel via le pilote Linux, les modules devraient déjà être intégrés. En tant que root:

$ echo ad5272 0x2f > /sys/bus/i2c/devices/i2c-1/new_device 
$ dmesg | tail -n 2 
[ 711.195428] i2c i2c-1: new_device: Instantiated device ad5272 at 0x2f 
[ 711.242537] ad_dpot 1-002f: ad5272 1024-Position Digital Potentiometer registered 
$ cat /sys/bus/i2c/devices/1-002f/rdac0 
511 
$ echo 0 > /sys/bus/i2c/devices/1-002f/rdac0 
$ cat /sys/bus/i2c/devices/1-002f/rdac0 
0 
$ echo 1023 > /sys/bus/i2c/devices/1-002f/rdac0 
$ cat /sys/bus/i2c/devices/1-002f/rdac0 
1023 

Mesure de la tension de W à la masse a donné ~ 5 V à 0 et ~ 2,5V à 1023.

I ensuite répété avec un analyseur logique connecté au bus I2C.Les commandes pour les écritures sont les suivantes:

0x5e 0x1c 0x03 0x5e 0x04 0x00 
0x5e 0x1c 0x03 0x5e 0x07 0xff 

Cela devrait permettre de fournir une indication, relisez les sections dans la fiche technique sur « protection en écriture » et « registre de contrôle Description ». Dans ma configuration je veux seulement utiliser l'interface numérique et pas la mémoire stockée pour le contrôle, donc j'ai répliqué à partir de l'espace utilisateur avec une légère modification:

sudo i2cset 1 0x2f 0x1c 0x02 b 
sudo i2cset 1 0x2f 0x04 0x00 b 
sudo i2cset 1 0x2f 0x07 0xff b 
+0

Je vais essayer de faire cela. Maintenant, je pense que le problème pourrait être dans l'implémentation python de l'interface I2C. J'ai remarqué que certains composants requièrent une vitesse d'horloge I2C spécifique. – Iegor