summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/ads1x15/ads1015.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/ads1x15/ads1015.cxx')
-rw-r--r--peripheral/libupm/src/ads1x15/ads1015.cxx68
1 files changed, 66 insertions, 2 deletions
diff --git a/peripheral/libupm/src/ads1x15/ads1015.cxx b/peripheral/libupm/src/ads1x15/ads1015.cxx
index 1beef3d..d49b83d 100644
--- a/peripheral/libupm/src/ads1x15/ads1015.cxx
+++ b/peripheral/libupm/src/ads1x15/ads1015.cxx
@@ -21,7 +21,7 @@
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#include "ads1015.h"
+#include "ads1015.hpp"
using namespace upm;
@@ -30,15 +30,63 @@ ADS1015::setSPS(ADSSAMPLERATE rate){
updateConfigRegister((m_config_reg & ~ADS1X15_DR_MASK) | rate);
}
-ADS1015::ADS1015(int bus, uint8_t address) : ADS1X15(bus, address) {
+ADS1015::ADS1015(int bus, uint8_t address, float vref) : ADS1X15(bus, address) {
m_name = "ADS1015";
m_conversionDelay = ADS1015_CONVERSIONDELAY;
m_bitShift = 4;
ADS1X15::getCurrentConfig();
+ if (vref < 0.0 || vref > 6.144)
+ UPM_THROW("vref out of range");
+ else if (vref > 4.096)
+ setGain(GAIN_TWOTHIRDS);
+ else if (vref > 2.048)
+ setGain(GAIN_ONE);
+ else if (vref > 1.024)
+ setGain(GAIN_TWO);
+ else if (vref > 0.512)
+ setGain(GAIN_FOUR);
+ else if (vref > 0.256)
+ setGain(GAIN_EIGHT);
+ else
+ setGain(GAIN_SIXTEEN);
}
ADS1015::~ADS1015(){};
+const char*
+ADS1015::getModuleName() {
+ return m_name.c_str();
+}
+
+
+unsigned int
+ADS1015::getNumInputs() {
+ return 4;
+}
+
+unsigned int
+ADS1015::getResolutionInBits() {
+ return 12;
+}
+
+uint16_t
+ADS1015::getRawValue(unsigned int input) {
+ ADS1X15::ADSMUXMODE mode = getMuxMode(input);
+ updateConfigRegister((m_config_reg & ~ADS1X15_MUX_MASK) | mode, true);
+ usleep(m_conversionDelay);
+ uint16_t value = i2c->readWordReg(ADS1X15_REG_POINTER_CONVERT);
+ value = value >> m_bitShift;
+ return swapWord(value);
+}
+
+float
+ADS1015::getVoltage(unsigned int input) {
+ ADSMUXMODE mode = getMuxMode(input);
+ return getSample(mode);
+}
+
+
+
//Private functions
float
ADS1015::getMultiplier(void){
@@ -99,4 +147,20 @@ ADS1015::setDelay(){
}
}
+ADS1X15::ADSMUXMODE
+ADS1015::getMuxMode(unsigned int input) {
+ ADS1X15::ADSMUXMODE mode;
+ switch (input) {
+ case 0:
+ return SINGLE_0;
+ case 1:
+ return SINGLE_1;
+ case 2:
+ return SINGLE_2;
+ case 3:
+ return SINGLE_3;
+ default:
+ UPM_THROW("Invalid input");
+ }
+}