55""" 
66`adafruit_ina260` 
77================================================================================ 
8- 
98CircuitPython driver for the TI INA260 current and power sensor 
10- 
11- 
129* Author(s): Bryan Siepert 
13- 
1410Implementation Notes 
1511-------------------- 
16- 
1712**Hardware:** 
18- 
1913* `INA260 Breakout <https://www.adafruit.com/products/4226>`_ 
20- 
2114**Software and Dependencies:** 
22- 
2315* Adafruit CircuitPython firmware for the supported boards: 
24-   https://github.com/adafruit/circuitpython/releases 
25- 
26-  * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice 
27-  * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register 
16+ * https://github.com/adafruit/circuitpython/releases 
17+ * Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice 
18+ * Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register 
2819""" 
2920
3021# imports 
3627import  adafruit_bus_device .i2c_device  as  i2cdevice 
3728
3829from  adafruit_register .i2c_struct  import  ROUnaryStruct 
39- from  adafruit_register .i2c_bits  import  RWBits 
40- from  adafruit_register .i2c_bit  import  ROBit 
30+ from  adafruit_register .i2c_bits  import  ROBits ,  RWBits 
31+ from  adafruit_register .i2c_bit  import  ROBit ,  RWBit 
4132
4233_REG_CONFIG  =  const (0x00 )  # CONFIGURATION REGISTER (R/W) 
4334_REG_CURRENT  =  const (0x01 )  # SHUNT VOLTAGE REGISTER (R) 
4839_REG_MFG_UID  =  const (0xFE )  # MANUFACTURER UNIQUE ID REGISTER (R) 
4940_REG_DIE_UID  =  const (0xFF )  # DIE UNIQUE ID REGISTER (R) 
5041
42+ 
5143# pylint: disable=too-few-public-methods 
5244class  Mode :
5345    """Modes avaible to be set 
@@ -108,6 +100,21 @@ class ConversionTime:
108100    TIME_4_156_ms  =  const (0x6 )
109101    TIME_8_244_ms  =  const (0x7 )
110102
103+     @staticmethod  
104+     def  get_seconds (time_enum ):
105+         """Retrieve the time in seconds giving value read from register""" 
106+         conv_dict  =  {
107+             0 : 140e-6 ,
108+             1 : 204e-6 ,
109+             2 : 332e-6 ,
110+             3 : 558e-6 ,
111+             4 : 1.1e-3 ,
112+             5 : 2.116e-3 ,
113+             6 : 4.156e-3 ,
114+             7 : 8.244e-3 ,
115+         }
116+         return  conv_dict [time_enum ]
117+ 
111118
112119class  AveragingCount :
113120    """Options for ``averaging_count`` 
@@ -143,6 +150,12 @@ class AveragingCount:
143150    COUNT_512  =  const (0x6 )
144151    COUNT_1024  =  const (0x7 )
145152
153+     @staticmethod  
154+     def  get_averaging_count (avg_count ):
155+         """Retrieve the number of measurements giving value read from register""" 
156+         conv_dict  =  {0 : 1 , 1 : 4 , 2 : 16 , 3 : 64 , 4 : 128 , 5 : 256 , 6 : 512 , 7 : 1024 }
157+         return  conv_dict [avg_count ]
158+ 
146159
147160# pylint: enable=too-few-public-methods 
148161
@@ -158,12 +171,80 @@ class INA260:
158171    def  __init__ (self , i2c_bus , address = 0x40 ):
159172        self .i2c_device  =  i2cdevice .I2CDevice (i2c_bus , address )
160173
174+         if  self ._manufacturer_id  !=  self .TEXAS_INSTRUMENT_ID :
175+             raise  RuntimeError (
176+                 "Failed to find Texas Instrument ID, read {} while expected {}" 
177+                 " - check your wiring!" .format (
178+                     self ._manufacturer_id , self .TEXAS_INSTRUMENT_ID 
179+                 )
180+             )
181+ 
182+         if  self ._device_id  !=  self .INA260_ID :
183+             raise  RuntimeError (
184+                 "Failed to find INA260 ID, read {} while expected {}" 
185+                 " - check your wiring!" .format (self ._device_id , self .INA260_ID )
186+             )
187+ 
161188    _raw_current  =  ROUnaryStruct (_REG_CURRENT , ">h" )
162189    _raw_voltage  =  ROUnaryStruct (_REG_BUSVOLTAGE , ">H" )
163190    _raw_power  =  ROUnaryStruct (_REG_POWER , ">H" )
164191
165-     _conversion_ready  =  ROBit (_REG_MASK_ENABLE , 3 , 2 , False )
192+     # MASK_ENABLE fields 
193+     overcurrent_limit  =  RWBit (_REG_MASK_ENABLE , 15 , 2 , False )
194+     """Setting this bit high configures the ALERT pin to be asserted if the current measurement 
195+        following a conversion exceeds the value programmed in the Alert Limit Register. 
196+     """ 
197+     under_current_limit  =  RWBit (_REG_MASK_ENABLE , 14 , 2 , False )
198+     """Setting this bit high configures the ALERT pin to be asserted if the current measurement 
199+        following a conversion drops below the value programmed in the Alert Limit Register. 
200+     """ 
201+     bus_voltage_over_voltage  =  RWBit (_REG_MASK_ENABLE , 13 , 2 , False )
202+     """Setting this bit high configures the ALERT pin to be asserted if the bus voltage measurement 
203+        following a conversion exceeds the value programmed in the Alert Limit Register. 
204+     """ 
205+     bus_voltage_under_voltage  =  RWBit (_REG_MASK_ENABLE , 12 , 2 , False )
206+     """Setting this bit high configures the ALERT pin to be asserted if the bus voltage measurement 
207+        following a conversion drops below the value programmed in the Alert Limit Register. 
208+     """ 
209+     power_over_limit  =  RWBit (_REG_MASK_ENABLE , 11 , 2 , False )
210+     """Setting this bit high configures the ALERT pin to be asserted if the Power calculation 
211+        made following a bus voltage measurement exceeds the value programmed in the 
212+        Alert Limit Register. 
213+     """ 
214+     conversion_ready  =  RWBit (_REG_MASK_ENABLE , 10 , 2 , False )
215+     """Setting this bit high configures the ALERT pin to be asserted when the Conversion Ready Flag, 
216+         Bit 3, is asserted indicating that the device is ready for the next conversion. 
217+     """ 
218+     # from 5 to 9 are not used 
219+     alert_function_flag  =  ROBit (_REG_MASK_ENABLE , 4 , 2 , False )
220+     """While only one Alert Function can be monitored at the ALERT pin at time, the 
221+        Conversion Ready can also be enabled to assert the ALERT pin. 
222+        Reading the Alert Function Flag following an alert allows the user to determine if the Alert 
223+        Function was the source of the Alert. 
224+ 
225+        When the Alert Latch Enable bit is set to Latch mode, the Alert Function Flag bit 
226+        clears only when the Mask/Enable Register is read. 
227+        When the Alert Latch Enable bit is set to Transparent mode, the Alert Function Flag bit 
228+        is cleared following the next conversion that does not result in an Alert condition. 
229+     """ 
230+     _conversion_ready_flag  =  ROBit (_REG_MASK_ENABLE , 3 , 2 , False )
231+     """Bit to help coordinate one-shot or triggered conversion. This bit is set after all 
232+         conversion, averaging, and multiplication are complete. 
233+         Conversion Ready flag bit clears when writing the configuration register or 
234+         reading the Mask/Enable register. 
235+     """ 
236+     math_overflow_flag  =  ROBit (_REG_MASK_ENABLE , 2 , 2 , False )
237+     """This bit is set to 1 if an arithmetic operation resulted in an overflow error. 
238+     """ 
239+     alert_polarity_bit  =  RWBit (_REG_MASK_ENABLE , 1 , 2 , False )
240+     """Active-high open collector when True, Active-low open collector when false (default). 
241+     """ 
242+     alert_latch_enable  =  RWBit (_REG_MASK_ENABLE , 0 , 2 , False )
243+     """Configures the latching feature of the ALERT pin and Alert Flag Bits. 
244+     """ 
166245
246+     reset_bit  =  RWBit (_REG_CONFIG , 15 , 2 , False )
247+     """Setting this bit t 1 generates a system reset. Reset all registers to default values.""" 
167248    averaging_count  =  RWBits (3 , _REG_CONFIG , 9 , 2 , False )
168249    """The window size of the rolling average used in continuous mode""" 
169250    voltage_conversion_time  =  RWBits (3 , _REG_CONFIG , 6 , 2 , False )
@@ -177,28 +258,47 @@ def __init__(self, i2c_bus, address=0x40):
177258    """ 
178259
179260    mask_enable  =  RWBits (16 , _REG_MASK_ENABLE , 0 , 2 , False )
261+     """The Mask/Enable Register selects the function that is enabled to control the ALERT pin as 
262+         well as how that pin functions. 
263+         If multiple functions are enabled, the highest significant bit 
264+         position Alert Function (D15-D11) takes priority and responds to the Alert Limit Register. 
265+     """ 
180266    alert_limit  =  RWBits (16 , _REG_ALERT_LIMIT , 0 , 2 , False )
267+     """The Alert Limit Register contains the value used to compare to the register selected in the 
268+         Mask/Enable Register to determine if a limit has been exceeded. 
269+         The format for this register will match the format of the register that is selected for 
270+         comparison. 
271+     """ 
272+ 
273+     TEXAS_INSTRUMENT_ID  =  const (0x5449 )
274+     INA260_ID  =  const (0x227 )
275+     _manufacturer_id  =  ROUnaryStruct (_REG_MFG_UID , ">H" )
276+     """Manufacturer identification bits""" 
277+     _device_id  =  ROBits (12 , _REG_DIE_UID , 4 , 2 , False )
278+     """Device identification bits""" 
279+     revision_id  =  ROBits (4 , _REG_DIE_UID , 0 , 2 , False )
280+     """Device revision identification bits""" 
181281
182282    @property  
183283    def  current (self ):
184284        """The current (between V+ and V-) in mA""" 
185285        if  self .mode  ==  Mode .TRIGGERED :
186-             while  self ._conversion_ready  ==  0 :
286+             while  self ._conversion_ready_flag  ==  0 :
187287                pass 
188288        return  self ._raw_current  *  1.25 
189289
190290    @property  
191291    def  voltage (self ):
192292        """The bus voltage in V""" 
193293        if  self .mode  ==  Mode .TRIGGERED :
194-             while  self ._conversion_ready  ==  0 :
294+             while  self ._conversion_ready_flag  ==  0 :
195295                pass 
196296        return  self ._raw_voltage  *  0.00125 
197297
198298    @property  
199299    def  power (self ):
200300        """The power being delivered to the load in mW""" 
201301        if  self .mode  ==  Mode .TRIGGERED :
202-             while  self ._conversion_ready  ==  0 :
302+             while  self ._conversion_ready_flag  ==  0 :
203303                pass 
204304        return  self ._raw_power  *  10 
0 commit comments