66
66
DEFAULT_SHUNT_RESISTANCE = 0.05
67
67
68
68
# Precision (LSB) of bus-voltage and shunt-voltage
69
- BUS_V_LSB = 0.008 # 8mV
70
- SHUNT_V_LSB = 0.000040 # 40µV
69
+ BUS_V_LSB = 0.008 # 8mV
70
+ SHUNT_V_LSB = 0.000040 # 40µV
71
+
72
+
73
+ def _mask (offset , len , read = True ):
74
+ """return mask for reading or writing"""
75
+ if read :
76
+ return ((1 << len ) - 1 ) << offset
77
+ else :
78
+ return ~ (((1 << len ) - 1 ) << offset ) & 0xFFFF
71
79
72
- def _mask (offset ,len ,read = True ):
73
- """ return mask for reading or writing """
74
- if read :
75
- return ((1 << len )- 1 )<< offset
76
- else :
77
- return ~ (((1 << len )- 1 )<< offset ) & 0xFFFF
78
80
79
81
def _to_signed (val : int , shift : int , bits : int ):
80
- """ convert value to signed int and shift result """
82
+ """convert value to signed int and shift result"""
81
83
if val & (1 << (bits - 1 )):
82
- val -= 1 << (bits - 1 ) # remove sign
83
- val = (1 << bits - 1 ) - 1 - val # bitwise not
84
- return - (val >> shift )
84
+ val -= 1 << (bits - 1 ) # remove sign
85
+ val = (1 << bits - 1 ) - 1 - val # bitwise not
86
+ return - (val >> shift )
85
87
return val >> shift
86
88
89
+
87
90
def _to_2comp (val : int , shift : int , bits : int ):
88
- """ convert value to twos complement, shifting as necessary """
89
- if val > 0 :
90
- return val << shift
91
- val = (- val ) << shift
92
- val = (1 << bits - 1 ) - val # bitwise not plus 1
93
- return val + (1 << (bits - 1 ))
91
+ """convert value to twos complement, shifting as necessary"""
92
+ if val > 0 :
93
+ return val << shift
94
+ val = (- val ) << shift
95
+ val = (1 << bits - 1 ) - val # bitwise not plus 1
96
+ return val + (1 << (bits - 1 ))
97
+
94
98
95
99
class AVG_MODE :
96
100
"""Enumeration for the averaging mode options in INA3221.
@@ -181,29 +185,28 @@ def __init__(self, device: Any, channel: int) -> None:
181
185
def enable (self , flag : bool = True ) -> None :
182
186
"""Enable/disable this channel"""
183
187
# enable bits in the configuration-register: 14-12
184
- self ._device ._set_register_bits (CONFIGURATION ,
185
- 14 - self ._channel ,1 ,int (flag ))
188
+ self ._device ._set_register_bits (CONFIGURATION , 14 - self ._channel , 1 , int (flag ))
186
189
self ._enabled = flag
187
190
188
191
@property
189
192
def enabled (self ) -> bool :
190
- """return buffered enable-state """
193
+ """return buffered enable-state"""
191
194
return self ._enabled
192
195
193
196
@property
194
197
def bus_voltage (self ) -> float :
195
198
"""Bus voltage in volts."""
196
199
reg_addr = BUSVOLTAGE_REGS [self ._channel ]
197
- raw_value = self ._device ._get_register_bits (reg_addr ,0 , 16 )
198
- raw_value = _to_signed (raw_value ,3 , 16 )
200
+ raw_value = self ._device ._get_register_bits (reg_addr , 0 , 16 )
201
+ raw_value = _to_signed (raw_value , 3 , 16 )
199
202
return raw_value * BUS_V_LSB
200
203
201
204
@property
202
205
def shunt_voltage (self ) -> float :
203
206
"""Shunt voltage in millivolts."""
204
207
reg_addr = SHUNTVOLTAGE_REGS [self ._channel ]
205
- raw_value = self ._device ._get_register_bits (reg_addr ,0 , 16 )
206
- raw_value = _to_signed (raw_value ,3 , 16 )
208
+ raw_value = self ._device ._get_register_bits (reg_addr , 0 , 16 )
209
+ raw_value = _to_signed (raw_value , 3 , 16 )
207
210
return raw_value * SHUNT_V_LSB * 1000
208
211
209
212
@property
@@ -235,14 +238,14 @@ def critical_alert_threshold(self) -> float:
235
238
float: The current critical alert threshold in amperes.
236
239
"""
237
240
reg_addr = CRITICAL_ALERT_LIMIT_REGS [self ._channel ]
238
- threshold = self ._device ._get_register_bits (reg_addr ,3 , 13 )
241
+ threshold = self ._device ._get_register_bits (reg_addr , 3 , 13 )
239
242
return threshold * SHUNT_V_LSB / self ._shunt_resistance
240
243
241
244
@critical_alert_threshold .setter
242
245
def critical_alert_threshold (self , current : float ) -> None :
243
246
threshold = int (current * self ._shunt_resistance / SHUNT_V_LSB )
244
247
reg_addr = CRITICAL_ALERT_LIMIT_REGS [self ._channel ]
245
- self ._device ._set_register_bits (reg_addr ,3 , 13 ,threshold )
248
+ self ._device ._set_register_bits (reg_addr , 3 , 13 , threshold )
246
249
247
250
@property
248
251
def warning_alert_threshold (self ) -> float :
@@ -252,24 +255,25 @@ def warning_alert_threshold(self) -> float:
252
255
float: The current warning alert threshold in amperes.
253
256
"""
254
257
reg_addr = WARNING_ALERT_LIMIT_REGS [self ._channel ]
255
- threshold = self ._device ._get_register_bits (reg_addr ,3 , 13 )
258
+ threshold = self ._device ._get_register_bits (reg_addr , 3 , 13 )
256
259
return threshold / self ._shunt_resistance
257
260
258
261
@warning_alert_threshold .setter
259
262
def warning_alert_threshold (self , current : float ) -> None :
260
263
threshold = int (current * self ._shunt_resistance )
261
264
reg_addr = WARNING_ALERT_LIMIT_REGS [self ._channel ]
262
- self ._device ._set_register_bits (reg_addr ,3 , 13 ,threshold )
265
+ self ._device ._set_register_bits (reg_addr , 3 , 13 , threshold )
263
266
264
267
@property
265
268
def summation_channel (self ) -> bool :
266
- """Status of summation channel """
267
- return self ._device ._get_register_bits (MASK_ENABLE ,14 - self ._channel ,1 )
269
+ """Status of summation channel"""
270
+ return self ._device ._get_register_bits (MASK_ENABLE , 14 - self ._channel , 1 )
268
271
269
272
@summation_channel .setter
270
273
def summation_channel (self , value : bool ) -> None :
271
- """ set value of summation control """
272
- self ._device ._set_register_bits (MASK_ENABLE ,14 - self ._channel ,1 ,int (value ))
274
+ """set value of summation control"""
275
+ self ._device ._set_register_bits (MASK_ENABLE , 14 - self ._channel , 1 , int (value ))
276
+
273
277
274
278
class INA3221 :
275
279
"""Driver for the INA3221 device with three channels."""
@@ -311,7 +315,7 @@ def reset(self) -> None:
311
315
Returns:
312
316
None
313
317
"""
314
- self ._set_register_bits (CONFIGURATION ,15 ,1 , 1 )
318
+ self ._set_register_bits (CONFIGURATION , 15 , 1 , 1 )
315
319
316
320
@property
317
321
def die_id (self ) -> int :
@@ -342,13 +346,13 @@ def mode(self) -> int:
342
346
4: Alternate power down mode, 5: Continuous shunt voltage measurement,
343
347
6: Continuous bus voltage measurement, 7: Continuous shunt and bus voltage measurements
344
348
"""
345
- return self ._get_register_bits (CONFIGURATION ,0 , 3 )
349
+ return self ._get_register_bits (CONFIGURATION , 0 , 3 )
346
350
347
351
@mode .setter
348
352
def mode (self , value : int ) -> None :
349
353
if not 0 <= value <= 7 :
350
354
raise ValueError ("Mode must be a 3-bit value (0-7)." )
351
- self ._set_register_bits (CONFIGURATION ,0 , 3 , value )
355
+ self ._set_register_bits (CONFIGURATION , 0 , 3 , value )
352
356
353
357
@property
354
358
def shunt_voltage_conv_time (self ) -> int :
@@ -359,13 +363,13 @@ def shunt_voltage_conv_time(self) -> int:
359
363
0: 140µs, 1: 204µs, 2: 332µs, 3: 588µs,
360
364
4: 1ms, 5: 2ms, 6: 4ms, 7: 8ms
361
365
"""
362
- return self ._get_register_bits (CONFIGURATION ,3 , 3 )
366
+ return self ._get_register_bits (CONFIGURATION , 3 , 3 )
363
367
364
368
@shunt_voltage_conv_time .setter
365
369
def shunt_voltage_conv_time (self , conv_time : int ) -> None :
366
370
if conv_time < 0 or conv_time > 7 :
367
371
raise ValueError ("Conversion time must be between 0 and 7" )
368
- self ._set_register_bits (CONFIGURATION ,3 , 3 , int (conv_time ))
372
+ self ._set_register_bits (CONFIGURATION , 3 , 3 , int (conv_time ))
369
373
370
374
@property
371
375
def bus_voltage_conv_time (self ) -> int :
@@ -376,13 +380,13 @@ def bus_voltage_conv_time(self) -> int:
376
380
0: 140µs, 1: 204µs, 2: 332µs, 3: 588µs,
377
381
4: 1ms, 5: 2ms, 6: 4ms, 7: 8ms
378
382
"""
379
- return self ._get_register_bits (CONFIGURATION ,6 , 3 )
383
+ return self ._get_register_bits (CONFIGURATION , 6 , 3 )
380
384
381
385
@bus_voltage_conv_time .setter
382
386
def bus_voltage_conv_time (self , conv_time : int ) -> None :
383
387
if conv_time < 0 or conv_time > 7 :
384
388
raise ValueError ("Conversion time must be between 0 and 7" )
385
- self ._set_register_bits (CONFIGURATION ,6 , 3 , int (conv_time ))
389
+ self ._set_register_bits (CONFIGURATION , 6 , 3 , int (conv_time ))
386
390
387
391
@property
388
392
def averaging_mode (self ) -> int :
@@ -394,13 +398,13 @@ def averaging_mode(self) -> int:
394
398
3: 64_SAMPLES, 4: 128_SAMPLES, 5: 256_SAMPLES,
395
399
6: 512_SAMPLES, 7: 1024_SAMPLES
396
400
"""
397
- return self ._get_register_bits (CONFIGURATION ,9 , 3 )
401
+ return self ._get_register_bits (CONFIGURATION , 9 , 3 )
398
402
399
403
@averaging_mode .setter
400
404
def averaging_mode (self , mode : int ) -> None :
401
405
if mode < 0 or mode > 7 :
402
406
raise ValueError ("Averaging mode must be between 0 and 7" )
403
- self ._set_register_bits (CONFIGURATION ,9 , 3 , int (mode ))
407
+ self ._set_register_bits (CONFIGURATION , 9 , 3 , int (mode ))
404
408
405
409
@property
406
410
def flags (self ) -> int :
@@ -410,7 +414,7 @@ def flags(self) -> int:
410
414
int: The current flag indicators from the Mask/Enable register,
411
415
masked for relevant flag bits.
412
416
"""
413
- return self ._read_register_bits (MASK_ENABLE ,0 , 10 )
417
+ return self ._read_register_bits (MASK_ENABLE , 0 , 10 )
414
418
415
419
@property
416
420
def power_valid_limits (self ) -> tuple :
@@ -420,37 +424,37 @@ def power_valid_limits(self) -> tuple:
420
424
tuple: A tuple containing the lower and upper voltage limits
421
425
in volts as (lower_limit, upper_limit).
422
426
"""
423
- raw_value = self ._device ._get_register_bits (POWERVALID_LOWERLIMIT ,0 , 16 )
424
- lower_limit = _to_signed (raw_value ,3 , 16 ) * 8e-3
425
- raw_value = self ._device ._get_register_bits (POWERVALID_UPPERLIMIT ,0 , 16 )
426
- upper_limit = _to_signed (raw_value ,3 , 16 ) * 8e-3
427
+ raw_value = self ._device ._get_register_bits (POWERVALID_LOWERLIMIT , 0 , 16 )
428
+ lower_limit = _to_signed (raw_value , 3 , 16 ) * 8e-3
429
+ raw_value = self ._device ._get_register_bits (POWERVALID_UPPERLIMIT , 0 , 16 )
430
+ upper_limit = _to_signed (raw_value , 3 , 16 ) * 8e-3
427
431
return lower_limit , upper_limit
428
432
429
433
@power_valid_limits .setter
430
434
def power_valid_limits (self , limits : tuple ) -> None :
431
435
if len (limits ) != 2 :
432
436
raise ValueError ("Must provide both lower and upper voltage limits." )
433
437
# convert to mV and twos-complement
434
- lower_limit = _to_2comp (int (limits [0 ] * 1000 ),3 , 16 )
435
- upper_limit = _to_2comp (int (limits [1 ] * 1000 ),3 , 16 )
436
- self ._device ._set_register_bits (POWERVALID_LOWERLIMIT ,0 , 16 ,lower_limit )
437
- self ._device ._set_register_bits (POWERVALID_UPPERLIMIT ,0 , 16 ,upper_limit )
438
+ lower_limit = _to_2comp (int (limits [0 ] * 1000 ), 3 , 16 )
439
+ upper_limit = _to_2comp (int (limits [1 ] * 1000 ), 3 , 16 )
440
+ self ._device ._set_register_bits (POWERVALID_LOWERLIMIT , 0 , 16 , lower_limit )
441
+ self ._device ._set_register_bits (POWERVALID_UPPERLIMIT , 0 , 16 , upper_limit )
438
442
439
- def _get_register_bits (self ,reg ,offset ,len ):
440
- """ return given bits from register """
443
+ def _get_register_bits (self , reg , offset , len ):
444
+ """return given bits from register"""
441
445
value = self ._read_register (reg , 2 )
442
446
value = (value [0 ] << 8 ) | value [1 ] # swap bytes
443
- mask = _mask (offset ,len ,read = True )
447
+ mask = _mask (offset , len , read = True )
444
448
return (value & mask ) >> offset
445
449
446
- def _set_register_bits (self ,reg ,offset ,len ,value ):
447
- """ set given bits of register """
450
+ def _set_register_bits (self , reg , offset , len , value ):
451
+ """set given bits of register"""
448
452
old = self ._read_register (reg , 2 )
449
453
old = (old [0 ] << 8 ) | old [1 ] # swap bytes
450
- mask = _mask (offset ,len ,read = False )
454
+ mask = _mask (offset , len , read = False )
451
455
new = (old & mask ) | value << offset
452
456
high_byte = (new >> 8 ) & 0xFF
453
- low_byte = new & 0xFF
457
+ low_byte = new & 0xFF
454
458
self ._write_register (reg , bytes ([high_byte , low_byte ]))
455
459
456
460
def _write_register (self , reg , data ):
0 commit comments