#include "LTC2497.h" #include #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() { }