mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
218 lines
3.9 KiB
C++
218 lines
3.9 KiB
C++
//
|
|
// FILE: AD5263.cpp
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.1.3
|
|
// PURPOSE: Arduino library for I2C digital potentiometer AD5263 and compatibles.
|
|
// DATE: 2023-10-09
|
|
// URL: https://github.com/RobTillaart/AD5263
|
|
|
|
|
|
#include "AD5263.h"
|
|
|
|
|
|
#define AD5263_RDAC0 0x00
|
|
#define AD5263_RDAC1 0x20
|
|
#define AD5263_RDAC2 0x40
|
|
#define AD5263_RDAC3 0x60
|
|
#define AD5263_RESET 0x10
|
|
#define AD5263_SHUTDOWN 0x08
|
|
#define AD5263_O1_HIGH 0x04
|
|
#define AD5263_O2_HIGH 0x02
|
|
|
|
|
|
AD5263::AD5263(const uint8_t address, TwoWire *wire)
|
|
{
|
|
_address = address;
|
|
_wire = wire;
|
|
|
|
// power on reset => mid position
|
|
_pmCount = 4;
|
|
for (int i = 0; i < _pmCount; i++)
|
|
{
|
|
_lastValue[i] = AD5263_MIDPOINT;
|
|
}
|
|
_O1 = _O2 = 0;
|
|
}
|
|
|
|
|
|
bool AD5263::begin()
|
|
{
|
|
if (! isConnected()) return false;
|
|
reset();
|
|
return true;
|
|
}
|
|
|
|
|
|
bool AD5263::isConnected()
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
return ( _wire->endTransmission() == 0);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::getAddress()
|
|
{
|
|
return _address;
|
|
}
|
|
|
|
|
|
uint8_t AD5263::reset()
|
|
{
|
|
return setAll(AD5263_MIDPOINT);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::zeroAll()
|
|
{
|
|
return setAll(0);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::setAll(const uint8_t value)
|
|
{
|
|
for (int i = 1; i < _pmCount; i++)
|
|
{
|
|
write(i, value);
|
|
}
|
|
return write(0, value, LOW, LOW);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::write(const uint8_t rdac, const uint8_t value)
|
|
{
|
|
if (rdac >= _pmCount) return AD5263_ERROR;
|
|
|
|
// uint8_t cmd = rdac << 5; // saves 12 bytes UNO
|
|
uint8_t cmd = AD5263_RDAC0;
|
|
if (rdac == 1) cmd = AD5263_RDAC1;
|
|
if (rdac == 2) cmd = AD5263_RDAC2;
|
|
if (rdac == 3) cmd = AD5263_RDAC3;
|
|
|
|
// apply the output lines
|
|
cmd = cmd | _O1 | _O2;
|
|
_lastValue[rdac] = value;
|
|
return send(cmd, value);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::write(const uint8_t rdac, const uint8_t value, const uint8_t O1, const uint8_t O2)
|
|
{
|
|
if (rdac >= _pmCount) return AD5263_ERROR;
|
|
|
|
_O1 = (O1 == LOW) ? 0 : AD5263_O1_HIGH;
|
|
_O2 = (O2 == LOW) ? 0 : AD5263_O2_HIGH;
|
|
|
|
// uint8_t cmd = rdac << 5; // saves 12 bytes UNO
|
|
uint8_t cmd = AD5263_RDAC0;
|
|
if (rdac == 1) cmd = AD5263_RDAC1;
|
|
if (rdac == 2) cmd = AD5263_RDAC2;
|
|
if (rdac == 3) cmd = AD5263_RDAC3;
|
|
|
|
// apply the output lines
|
|
cmd = cmd | _O1 | _O2;
|
|
_lastValue[rdac] = value;
|
|
return send(cmd, value);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::setO1(const uint8_t value)
|
|
{
|
|
_O1 = (value == LOW) ? 0 : AD5263_O1_HIGH;
|
|
uint8_t cmd = AD5263_RDAC0 | _O1 | _O2;
|
|
return send(cmd, _lastValue[0]);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::setO2(const uint8_t value)
|
|
{
|
|
_O2 = (value == LOW) ? 0: AD5263_O2_HIGH;
|
|
uint8_t cmd = AD5263_RDAC0 | _O1 | _O2;
|
|
return send(cmd, _lastValue[0]);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::getO1()
|
|
{
|
|
return (_O1 > 0);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::getO2()
|
|
{
|
|
return (_O2 > 0);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::read(const uint8_t rdac)
|
|
{
|
|
if (rdac >= _pmCount) return 0x00;
|
|
return _lastValue[rdac];
|
|
}
|
|
|
|
|
|
uint8_t AD5263::readBackRegister()
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->endTransmission();
|
|
_wire->requestFrom(_address, (uint8_t)1);
|
|
return _wire->read();
|
|
}
|
|
|
|
|
|
uint8_t AD5263::midScaleReset(const uint8_t rdac)
|
|
{
|
|
if (rdac >= _pmCount) return AD5263_ERROR;
|
|
|
|
uint8_t cmd = AD5263_RDAC0;
|
|
if (rdac == 1) cmd = AD5263_RDAC1;
|
|
if (rdac == 2) cmd = AD5263_RDAC2;
|
|
if (rdac == 3) cmd = AD5263_RDAC3;
|
|
|
|
cmd |= AD5263_RESET;
|
|
|
|
// apply the output lines
|
|
cmd = cmd | _O1 | _O2;
|
|
_lastValue[rdac] = AD5263_MIDPOINT;
|
|
return send(cmd, AD5263_MIDPOINT);
|
|
}
|
|
|
|
|
|
// read datasheet P.20
|
|
uint8_t AD5263::shutDown()
|
|
{
|
|
uint8_t cmd = AD5263_SHUTDOWN; // TODO TEST & VERIFY
|
|
return send(cmd, 0);
|
|
}
|
|
|
|
|
|
uint8_t AD5263::pmCount()
|
|
{
|
|
return _pmCount;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////
|
|
//
|
|
// PROTECTED
|
|
//
|
|
uint8_t AD5263::send(const uint8_t cmd, const uint8_t value)
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(cmd);
|
|
_wire->write(value);
|
|
return _wire->endTransmission();
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////
|
|
//
|
|
// DERIVED CLASSES
|
|
//
|
|
// None known so far.
|
|
|
|
|
|
|
|
// -- END OF FILE --
|
|
|