GY-63_MS5611/libraries/AD520X/AD520X.cpp

347 lines
6.4 KiB
C++
Raw Normal View History

2021-01-29 06:31:58 -05:00
//
// FILE: AD520X.cpp
// AUTHOR: Rob Tillaart
// DATE: 2020-07-24
2023-01-10 14:37:57 -05:00
// VERSION: 0.3.1
2022-10-15 13:46:24 -04:00
// PURPOSE: Arduino library for AD5204 and AD5206 digital potentiometers
// (+ AD8400, AD8402, AD8403)
2021-01-29 06:31:58 -05:00
// URL: https://github.com/RobTillaart/AD520X
2023-01-10 14:37:57 -05:00
2021-01-29 06:31:58 -05:00
#include "AD520X.h"
AD520X::AD520X(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
{
_pmCount = 6;
_select = select;
2021-08-22 04:47:15 -04:00
_dataOut = dataOut;
2021-01-29 06:31:58 -05:00
_clock = clock;
_reset = reset;
_shutdown = shutdown;
_hwSPI = (dataOut == 255) && (clock == 255);
}
2021-08-22 04:47:15 -04:00
2021-10-16 14:58:54 -04:00
// initializes the pins and starts SPI in case of hardware SPI
2021-01-29 06:31:58 -05:00
void AD520X::begin(uint8_t value)
{
pinMode(_select, OUTPUT);
digitalWrite(_select, HIGH);
pinMode(_reset, OUTPUT);
2022-10-15 13:46:24 -04:00
digitalWrite(_reset, HIGH);
2021-01-29 06:31:58 -05:00
pinMode(_shutdown, OUTPUT);
2022-10-15 13:46:24 -04:00
digitalWrite(_shutdown, HIGH);
2021-01-29 06:31:58 -05:00
2022-10-15 13:46:24 -04:00
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE0);
2021-08-22 04:47:15 -04:00
2021-01-29 06:31:58 -05:00
if(_hwSPI)
{
2021-08-22 04:47:15 -04:00
#if defined(ESP32)
2021-10-16 14:58:54 -04:00
if (_useHSPI) // HSPI
2021-08-22 04:47:15 -04:00
{
mySPI = new SPIClass(HSPI);
mySPI->end();
2021-10-16 14:58:54 -04:00
mySPI->begin(14, 12, 13, _select); // CLK=14 MISO=12 MOSI=13
2021-08-22 04:47:15 -04:00
}
2021-10-16 14:58:54 -04:00
else // VSPI
2021-08-22 04:47:15 -04:00
{
mySPI = new SPIClass(VSPI);
mySPI->end();
2021-10-16 14:58:54 -04:00
mySPI->begin(18, 19, 23, _select); // CLK=18 MISO=19 MOSI=23
2021-08-22 04:47:15 -04:00
}
2021-10-16 14:58:54 -04:00
#else // generic hardware SPI
2021-08-22 04:47:15 -04:00
mySPI = &SPI;
mySPI->end();
mySPI->begin();
#endif
2021-01-29 06:31:58 -05:00
delay(1);
}
else
{
2021-08-22 04:47:15 -04:00
pinMode(_dataOut, OUTPUT);
pinMode(_clock, OUTPUT);
digitalWrite(_dataOut, LOW);
digitalWrite(_clock, LOW);
2021-01-29 06:31:58 -05:00
}
setAll(value);
}
2021-08-22 04:47:15 -04:00
2023-01-10 14:37:57 -05:00
/////////////////////////////////////////////////////////////////////////////
//
// SET VALUE
//
2021-10-16 14:58:54 -04:00
bool AD520X::setValue(uint8_t pm, uint8_t value)
2021-01-29 06:31:58 -05:00
{
2021-10-16 14:58:54 -04:00
if (pm >= _pmCount) return false;
2021-01-29 06:31:58 -05:00
_value[pm] = value;
2022-09-19 04:24:53 -04:00
updateDevice(pm, value);
return true;
}
2023-01-10 14:37:57 -05:00
uint8_t AD520X::getValue(uint8_t pm)
{
if (pm >= _pmCount) return 0;
return _value[pm];
}
2022-09-19 04:24:53 -04:00
// STEREO same value
bool AD520X::setValue(uint8_t pmA, uint8_t pmB, uint8_t value)
{
if ((pmA >= _pmCount) || (pmB >= _pmCount)) return false;
_value[pmA] = value;
updateDevice(pmA, value);
_value[pmB] = value;
updateDevice(pmB, value);
2021-10-16 14:58:54 -04:00
return true;
2021-01-29 06:31:58 -05:00
}
2021-08-22 04:47:15 -04:00
2021-01-29 06:31:58 -05:00
void AD520X::setAll(uint8_t value)
{
2022-09-19 04:24:53 -04:00
for (uint8_t pm = 0; pm < _pmCount; pm++ )
2021-01-29 06:31:58 -05:00
{
2022-09-19 04:24:53 -04:00
_value[pm] = value;
updateDevice(pm, value);
2021-01-29 06:31:58 -05:00
}
}
2021-08-22 04:47:15 -04:00
2023-01-10 14:37:57 -05:00
void AD520X::setGroupValue(uint8_t mask, uint8_t value)
2021-01-29 06:31:58 -05:00
{
2023-01-10 14:37:57 -05:00
uint8_t m = 0x01;
for (uint8_t pm = 0; pm < _pmCount; pm++ )
{
if (mask & m)
{
_value[pm] = value;
updateDevice(pm, value);
}
m <<= 1;
}
2021-01-29 06:31:58 -05:00
}
2021-08-22 04:47:15 -04:00
2023-01-10 14:37:57 -05:00
/////////////////////////////////////////////////////////////////////////////
//
// SET PERCENTAGE
//
2021-10-16 14:58:54 -04:00
bool AD520X::setPercentage(uint8_t pm, float percentage)
{
if ((percentage < 0) || (percentage > 100.0)) return false;
return setValue(pm, round(percentage * (255.0 / 100.0)));
}
2023-01-10 14:37:57 -05:00
float AD520X::getPercentage(uint8_t pm)
{
if (pm >= _pmCount) return 0;
uint8_t v = _value[pm];
if (v == 0) return 0.0;
return (100.0 / 255.0) * v;
}
2022-09-19 04:24:53 -04:00
// STEREO same percentage
bool AD520X::setPercentage(uint8_t pmA, uint8_t pmB, float percentage)
{
if ((percentage < 0) || (percentage > 100.0)) return false;
return setValue(pmA, pmB, round(percentage * (255.0 / 100.0)));
}
2023-01-10 14:37:57 -05:00
void AD520X::setGroupPercentage(uint8_t mask, float percentage)
2021-10-16 14:58:54 -04:00
{
2023-01-10 14:37:57 -05:00
uint8_t m = 0x01;
for (uint8_t pm = 0; pm < _pmCount; pm++ )
{
if (mask & m)
{
setValue(pm, round(percentage * (255.0 / 100.0)));
}
m <<= 1;
}
2021-10-16 14:58:54 -04:00
}
2023-01-10 14:37:57 -05:00
/////////////////////////////////////////////////////////////////////////////
//
// OTHER
//
2021-01-29 06:31:58 -05:00
void AD520X::reset(uint8_t value)
{
digitalWrite(_reset, LOW);
2022-10-15 13:46:24 -04:00
digitalWrite(_reset, HIGH);
2021-01-29 06:31:58 -05:00
setAll(value);
}
2021-08-22 04:47:15 -04:00
2023-01-10 14:37:57 -05:00
uint8_t AD520X::pmCount()
{
return _pmCount;
}
void AD520X::powerOn()
{
digitalWrite(_shutdown, HIGH);
}
void AD520X::powerOff()
{
digitalWrite(_shutdown, LOW);
}
bool AD520X::isPowerOn()
{
return digitalRead(_shutdown) == HIGH;
}
/////////////////////////////////////////////////////////////////////////////
//
// SPI
//
2021-08-22 04:47:15 -04:00
void AD520X::setSPIspeed(uint32_t speed)
{
_SPIspeed = speed;
2022-10-15 13:46:24 -04:00
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE0);
2021-08-22 04:47:15 -04:00
};
2023-01-10 14:37:57 -05:00
uint32_t AD520X::getSPIspeed()
{
return _SPIspeed;
}
bool AD520X::usesHWSPI()
{
return _hwSPI;
};
#if defined(ESP32)
void AD520X::selectHSPI()
{
_useHSPI = true;
}
void AD520X::selectVSPI()
{
_useHSPI = false;
}
bool AD520X::usesHSPI()
{
return _useHSPI;
}
bool AD520X::usesVSPI()
{
return !_useHSPI;
}
void AD520X::setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select)
{
_clock = clk;
_dataOut = mosi;
_select = select;
pinMode(_select, OUTPUT);
digitalWrite(_select, HIGH);
mySPI->end(); // disable SPI and restart
mySPI->begin(clk, miso, mosi, select);
}
#endif
2021-08-22 04:47:15 -04:00
/////////////////////////////////////////////////////////////////////////////
//
2023-01-10 14:37:57 -05:00
// PROTECTED
2021-08-22 04:47:15 -04:00
//
2022-09-19 04:24:53 -04:00
void AD520X::updateDevice(uint8_t pm, uint8_t value)
2021-01-29 06:31:58 -05:00
{
2021-08-22 04:47:15 -04:00
digitalWrite(_select, LOW);
2021-01-29 06:31:58 -05:00
if (_hwSPI)
{
2021-08-22 04:47:15 -04:00
mySPI->beginTransaction(_spi_settings);
mySPI->transfer(pm);
2022-09-19 04:24:53 -04:00
mySPI->transfer(value);
2021-08-22 04:47:15 -04:00
mySPI->endTransaction();
2021-01-29 06:31:58 -05:00
}
2021-10-16 14:58:54 -04:00
else // Software SPI
2021-01-29 06:31:58 -05:00
{
swSPI_transfer(pm);
2022-09-19 04:24:53 -04:00
swSPI_transfer(value);
2021-01-29 06:31:58 -05:00
}
2021-08-22 04:47:15 -04:00
digitalWrite(_select, HIGH);
2021-01-29 06:31:58 -05:00
}
2021-08-22 04:47:15 -04:00
2021-10-16 14:58:54 -04:00
// simple one mode version
2021-08-22 04:47:15 -04:00
void AD520X::swSPI_transfer(uint8_t val)
2021-01-29 06:31:58 -05:00
{
2021-08-22 04:47:15 -04:00
uint8_t clk = _clock;
uint8_t dao = _dataOut;
2021-01-29 06:31:58 -05:00
for (uint8_t mask = 0x80; mask; mask >>= 1)
{
2021-08-22 04:47:15 -04:00
digitalWrite(dao,(val & mask));
digitalWrite(clk, HIGH);
digitalWrite(clk, LOW);
2021-01-29 06:31:58 -05:00
}
}
/////////////////////////////////////////////////////////////////////////////
2021-08-22 04:47:15 -04:00
//
2021-10-16 14:58:54 -04:00
// DERIVED CLASSES
2021-08-22 04:47:15 -04:00
//
2021-01-29 06:31:58 -05:00
AD5206::AD5206(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
: AD520X(select, reset, shutdown, dataOut, clock)
{
_pmCount = 6;
}
2021-08-22 04:47:15 -04:00
2021-01-29 06:31:58 -05:00
AD5204::AD5204(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
: AD520X(select, reset, shutdown, dataOut, clock)
{
_pmCount = 4;
}
2021-08-22 04:47:15 -04:00
2021-01-29 06:31:58 -05:00
AD8403::AD8403(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
: AD520X(select, reset, shutdown, dataOut, clock)
{
_pmCount = 4;
}
2021-08-22 04:47:15 -04:00
2021-01-29 06:31:58 -05:00
AD8402::AD8402(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
: AD520X(select, reset, shutdown, dataOut, clock)
{
_pmCount = 2;
}
2021-08-22 04:47:15 -04:00
2021-01-29 06:31:58 -05:00
AD8400::AD8400(uint8_t select, uint8_t reset, uint8_t shutdown, uint8_t dataOut, uint8_t clock)
: AD520X(select, reset, shutdown, dataOut, clock)
{
_pmCount = 1;
}
// -- END OF FILE --