-
Notifications
You must be signed in to change notification settings - Fork 60
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added Comparator functionality #98
Merged
Merged
Changes from all commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
017fb9f
Added Comparator functionality
RoaCode c84a39d
Improved Comments
RoaCode 7d98fde
Addressed PR comments
RoaCode 0aa1cd7
Moved threshold writes to setters
RoaCode 29ee801
Fixed ads1x15 init comment
RoaCode a730639
Corrected Pylint issues
RoaCode f74e4f9
Correcting pylint issues
RoaCode 4ba6144
Moved 2's complement calculation to threshold setters
RoaCode 8ddd81c
Moved threshold defaults to subclass
RoaCode 657b768
Updated comments with threshold register info
RoaCode f7fd261
Removed 2s Complement calculations
RoaCode 3e31097
Removed bit truncation warning
RoaCode File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -33,9 +33,17 @@ | |||||
_ADS1X15_DEFAULT_ADDRESS = const(0x48) | ||||||
_ADS1X15_POINTER_CONVERSION = const(0x00) | ||||||
_ADS1X15_POINTER_CONFIG = const(0x01) | ||||||
_ADS1X15_POINTER_LO_THRES = const(0x02) | ||||||
_ADS1X15_POINTER_HI_THRES = const(0x03) | ||||||
|
||||||
_ADS1X15_CONFIG_OS_SINGLE = const(0x8000) | ||||||
_ADS1X15_CONFIG_MUX_OFFSET = const(12) | ||||||
_ADS1X15_CONFIG_COMP_QUE_DISABLE = const(0x0003) | ||||||
_ADS1X15_CONFIG_COMP_QUEUE = { | ||||||
0: 0x0003, | ||||||
1: 0x0000, | ||||||
2: 0x0001, | ||||||
4: 0x0002, | ||||||
} | ||||||
_ADS1X15_CONFIG_GAIN = { | ||||||
2 / 3: 0x0000, | ||||||
1: 0x0200, | ||||||
|
@@ -66,15 +74,28 @@ class ADS1x15: | |||||
:param int data_rate: The data rate for ADC conversion in samples per second. | ||||||
Default value depends on the device. | ||||||
:param Mode mode: The conversion mode, defaults to `Mode.SINGLE`. | ||||||
:param int comparator_queue_length: The number of successive conversions exceeding | ||||||
the comparator threshold before asserting ALERT/RDY pin. | ||||||
Defaults to 0 (comparator function disabled). | ||||||
:param int comparator_low_threshold: Voltage limit under which comparator de-asserts | ||||||
ALERT/RDY pin. Must be lower than high threshold to use comparator | ||||||
function. See subclass for value range and default. | ||||||
:param int comparator_high_threshold: Voltage limit over which comparator asserts | ||||||
ALERT/RDY pin. Must be higher than low threshold to use comparator | ||||||
function. See subclass for value range and default. | ||||||
:param int address: The I2C address of the device. | ||||||
""" | ||||||
|
||||||
# pylint: disable=too-many-instance-attributes | ||||||
def __init__( | ||||||
self, | ||||||
i2c: I2C, | ||||||
gain: float = 1, | ||||||
data_rate: Optional[int] = None, | ||||||
mode: int = Mode.SINGLE, | ||||||
comparator_queue_length: int = 0, | ||||||
comparator_low_threshold: int = -32768, | ||||||
comparator_high_threshold: int = 32767, | ||||||
address: int = _ADS1X15_DEFAULT_ADDRESS, | ||||||
): | ||||||
# pylint: disable=too-many-arguments | ||||||
|
@@ -83,7 +104,10 @@ def __init__( | |||||
self.gain = gain | ||||||
self.data_rate = self._data_rate_default() if data_rate is None else data_rate | ||||||
self.mode = mode | ||||||
self.comparator_queue_length = comparator_queue_length | ||||||
self.i2c_device = I2CDevice(i2c, address) | ||||||
self.comparator_low_threshold = comparator_low_threshold | ||||||
self.comparator_high_threshold = comparator_high_threshold | ||||||
|
||||||
@property | ||||||
def bits(self) -> int: | ||||||
|
@@ -131,6 +155,67 @@ def gains(self) -> List[float]: | |||||
g.sort() | ||||||
return g | ||||||
|
||||||
@property | ||||||
def comparator_queue_length(self) -> int: | ||||||
"""The ADC comparator queue length.""" | ||||||
return self._comparator_queue_length | ||||||
|
||||||
@comparator_queue_length.setter | ||||||
def comparator_queue_length(self, comparator_queue_length: int) -> None: | ||||||
possible_comp_queue_lengths = self.comparator_queue_lengths | ||||||
if comparator_queue_length not in possible_comp_queue_lengths: | ||||||
raise ValueError( | ||||||
"Comparator Queue must be one of: {}".format( | ||||||
possible_comp_queue_lengths | ||||||
) | ||||||
) | ||||||
self._comparator_queue_length = comparator_queue_length | ||||||
|
||||||
@property | ||||||
def comparator_queue_lengths(self) -> List[int]: | ||||||
"""Possible comparator queue length settings.""" | ||||||
g = list(_ADS1X15_CONFIG_COMP_QUEUE.keys()) | ||||||
g.sort() | ||||||
return g | ||||||
|
||||||
@property | ||||||
def comparator_low_threshold(self) -> int: | ||||||
"""The ADC Comparator Lower Limit Threshold.""" | ||||||
return self._comparator_low_threshold | ||||||
|
||||||
@property | ||||||
def comparator_high_threshold(self) -> int: | ||||||
"""The ADC Comparator Higher Limit Threshold.""" | ||||||
return self._comparator_high_threshold | ||||||
|
||||||
@comparator_low_threshold.setter | ||||||
def comparator_low_threshold(self, value: int) -> None: | ||||||
"""Set comparator low threshold value for ADS1x15 ADC | ||||||
|
||||||
:param int value: 16-bit signed integer to write to register | ||||||
""" | ||||||
if value < -32768 or value > 32767: | ||||||
raise ValueError( | ||||||
"Comparator Threshold value must be between -32768 and 32767" | ||||||
) | ||||||
|
||||||
self._comparator_low_threshold = value | ||||||
self._write_register(_ADS1X15_POINTER_LO_THRES, self.comparator_low_threshold) | ||||||
|
||||||
@comparator_high_threshold.setter | ||||||
def comparator_high_threshold(self, value: int) -> None: | ||||||
"""Set comparator high threshold value for ADS1x15 ADC | ||||||
|
||||||
:param int value: 16-bit signed integer to write to register | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
""" | ||||||
if value < -32768 or value > 32767: | ||||||
raise ValueError( | ||||||
"Comparator Threshold value must be between -32768 and 32767" | ||||||
) | ||||||
|
||||||
self._comparator_high_threshold = value | ||||||
self._write_register(_ADS1X15_POINTER_HI_THRES, self.comparator_high_threshold) | ||||||
|
||||||
@property | ||||||
def mode(self) -> int: | ||||||
"""The ADC conversion mode.""" | ||||||
|
@@ -183,7 +268,7 @@ def _read(self, pin: Pin) -> int: | |||||
config |= _ADS1X15_CONFIG_GAIN[self.gain] | ||||||
config |= self.mode | ||||||
config |= self.rate_config[self.data_rate] | ||||||
config |= _ADS1X15_CONFIG_COMP_QUE_DISABLE | ||||||
config |= _ADS1X15_CONFIG_COMP_QUEUE[self.comparator_queue_length] | ||||||
self._write_register(_ADS1X15_POINTER_CONFIG, config) | ||||||
|
||||||
# Wait for conversion to complete | ||||||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries | ||
# SPDX-License-Identifier: MIT | ||
|
||
import time | ||
import board | ||
import busio | ||
import countio | ||
|
||
import adafruit_ads1x15.ads1015 as ADS | ||
|
||
# import adafruit_ads1x15.ads1115 as ADS | ||
from adafruit_ads1x15.analog_in import AnalogIn | ||
|
||
# Create the I2C bus | ||
i2c = busio.I2C(board.SCL, board.SDA) | ||
|
||
# Create the ADS object | ||
ads = ADS.ADS1015(i2c) | ||
# ads = ADS.ADS1115(i2c) | ||
|
||
# Create a single-ended channel on Pin 0 | ||
# Max counts for ADS1015 = 2047 | ||
# ADS1115 = 32767 | ||
chan = AnalogIn(ads, ADS.P0) | ||
|
||
# Create Interrupt-driven input to track comparator changes | ||
int_pin = countio.Counter(board.GP9, edge=countio.Edge.RISE) | ||
|
||
# Set comparator to assert after 1 ADC conversion | ||
ads.comparator_queue_length = 1 | ||
|
||
# Set comparator low threshold to 2V | ||
ads.comparator_low_threshold = chan.convert_to_value(2.000) | ||
# Set comparator high threshold to 2.002V. High threshold must be above low threshold | ||
ads.comparator_high_threshold = chan.convert_to_value(2.002) | ||
|
||
count = 0 | ||
while True: | ||
print(chan.value, chan.voltage) # This initiates new ADC reading | ||
if int_pin.count > count: | ||
print("Comparator Triggered") | ||
count = int_pin.count | ||
time.sleep(2) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't change this. You'll change how
read()
works otherwise. Only.value
needs to be the 16bit standard.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the ads1015 flow, I believe there are 2 unnecessary bit shifts. This is the right bit shift, which is immediately cancelled out by the left bit shift in the value property of analog_in.py. I removed both of these. There is no need to take in a 16-bit number, convert to 12, convert back to 16, and then report as 16. Removing both keeps .value at 16-bits for both ads1015 and ads1115.