151 lines
3.1 KiB
C++
151 lines
3.1 KiB
C++
#include "LTC2497.h"
|
|
#include <math.h>
|
|
|
|
#define DEBUG
|
|
|
|
LTC2497::LTC2497(const uint8_t address, double vref) : I2CDevice(address), _vref(vref), _adcRes(16), _quantum(_vref / (pow(2, _adcRes)-1))
|
|
{
|
|
for(uint8_t i = 0; i < 3; i++)
|
|
_dataBytes[i] = 0b00000000;
|
|
}
|
|
|
|
void LTC2497::setVref(double vref)
|
|
{
|
|
_vref = vref;
|
|
_quantum = _vref / (pow(2, _adcRes) - 1);
|
|
}
|
|
|
|
int32_t LTC2497::sampleValue(ADC_CHAN channel, boolean sgl)
|
|
{
|
|
//1) On commence par écrire un octet contenant des options et l'adresse du channel a sampler
|
|
//2) On lit la valeur samplée
|
|
|
|
if(!isPresent)
|
|
{
|
|
#ifdef DEBUG
|
|
Serial.println("Peripherique non present (penser à faire un begin)");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
uint8_t toBeWritten(0), retStatus(0), i(3);
|
|
uint32_t value(0);
|
|
|
|
toBeWritten |= 0b10100000;//On met les premiers bits à 101 afin de prendre en compte l'adresse du channel pour la mesure
|
|
toBeWritten |= 0b00010000;//On met l'adc en single ended line et pas en mode différentiel
|
|
toBeWritten |= channel;//On selectionne le channel
|
|
|
|
twi->beginTransmission(address);
|
|
twi->write(toBeWritten);
|
|
if(twi->endTransmission() != 0)
|
|
{
|
|
//Erreur lors de la transmission
|
|
#ifdef DEBUG
|
|
Serial.println("Erreur lors de la transmission");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
retStatus = (size_t) twi->requestFrom(address, (size_t)3/*, true*/);
|
|
|
|
if(retStatus == 0)
|
|
{
|
|
#ifdef DEBUG
|
|
Serial.println("Erreur lors de la reception du sample");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
while(twi->available())
|
|
{
|
|
_dataBytes[--i] = twi->read();
|
|
|
|
if(i == 0) //!i c'est ok aussi
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Traitement des données recues
|
|
value |= _dataBytes[2];
|
|
//On met à zero les deux derniers bits
|
|
value &= 0b00111111;
|
|
value << 8;
|
|
value |= _dataBytes[1];
|
|
_dataBytes[0] >> 6;
|
|
value << 2;
|
|
value |= _dataBytes[0];
|
|
|
|
return value;
|
|
}
|
|
|
|
int32_t LTC2497::sampleValue()
|
|
{
|
|
if(!isPresent)
|
|
{
|
|
#ifdef DEBUG
|
|
Serial.println("Peripherique non present (penser à faire un begin)");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
uint8_t toBeWritten(0), retStatus(0), i(3);
|
|
uint32_t value(0);
|
|
|
|
toBeWritten |= 0b10000000;//On met les premiers bits à 100 pour demander à resample le channel précédent
|
|
|
|
|
|
twi->beginTransmission(address);
|
|
twi->write(toBeWritten);
|
|
if(twi->endTransmission() != 0)
|
|
{
|
|
//Erreur lors de la transmission
|
|
#ifdef DEBUG
|
|
Serial.println("Erreur lors de la transmission");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
retStatus = (size_t) twi->requestFrom(address, (size_t)3/*, true*/);
|
|
|
|
if(retStatus == 0)
|
|
{
|
|
#ifdef DEBUG
|
|
Serial.println("Erreur lors de la reception du sample");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
while(twi->available())
|
|
{
|
|
_dataBytes[--i] = twi->read();
|
|
|
|
if(i == 0) //!i c'est ok aussi
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Traitement des données recues
|
|
value |= _dataBytes[2];
|
|
//On met à zero les deux derniers bits
|
|
value &= 0b00111111;
|
|
value << 8;
|
|
value |= _dataBytes[1];
|
|
_dataBytes[0] >> 6;
|
|
value << 2;
|
|
value |= _dataBytes[0];
|
|
|
|
return value;
|
|
}
|
|
|
|
double LTC2497::sampleVoltage(ADC_CHAN channel, boolean sgl)
|
|
{
|
|
|
|
}
|
|
|
|
double LTC2497::sampleVoltage()
|
|
{
|
|
|
|
}
|