projet3_temperature/lib/I2CDeviceLib/LTC2497.cpp
2020-05-14 16:15:09 +02:00

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()
{
}