Ajout du driver pour le LTC2439 avec méthodes asynchrones, les méthodes synchrones ne sont pas encore implémentées
This commit is contained in:
parent
3a3c01186c
commit
44e40b8ab3
98
lib/LTC2439Lib/LTC2439.cpp
Normal file
98
lib/LTC2439Lib/LTC2439.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
#include "LTC2439.h"
|
||||
#include <math.h>
|
||||
|
||||
#define DEBUG
|
||||
|
||||
LTC2439::LTC2439(uint8_t csPin, uint8_t sdoPin, double vref) :_csPin(csPin), _statusPin(sdoPin), _sampleTriggered(false), _vref(vref), _adcRes(16), _quantum(_vref / (pow(2, _adcRes)-1)),
|
||||
_channelMap{0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15},
|
||||
_SPIsettings(500000, MSBFIRST,SPI_MODE0)
|
||||
{
|
||||
pinMode(_csPin, OUTPUT);
|
||||
digitalWrite(_csPin, HIGH);
|
||||
SPI.begin();
|
||||
}
|
||||
|
||||
void LTC2439::setVref(double vref)
|
||||
{
|
||||
_vref = vref;
|
||||
_quantum = _vref / (pow(2, _adcRes) - 1);
|
||||
}
|
||||
|
||||
void LTC2439::startAsyncSample(uint8_t channel, boolean sgl, boolean force)
|
||||
{
|
||||
if(!_sampleTriggered || force)
|
||||
{
|
||||
//On envoie la demande de conversion
|
||||
//On sélectionne l'adc
|
||||
pinMode(_statusPin, INPUT);
|
||||
digitalWrite(_csPin, LOW);
|
||||
while(digitalRead(_statusPin));
|
||||
uint8_t commande = 0b10100000;
|
||||
commande |= sgl << 4;
|
||||
|
||||
SPI.beginTransaction(_SPIsettings);
|
||||
SPI.transfer(commande | _channelMap[channel]);
|
||||
SPI.endTransaction();
|
||||
|
||||
digitalWrite(_csPin, HIGH);
|
||||
_sampleTriggered = true;
|
||||
|
||||
//restoreRadioSpi();
|
||||
}
|
||||
}
|
||||
|
||||
boolean LTC2439::asyncResultAvailable()
|
||||
{
|
||||
//On désactive le bus SPI
|
||||
SPI.end();
|
||||
//On regarde si la valeur est prête à être lue:
|
||||
pinMode(_statusPin, INPUT);
|
||||
digitalWrite(_csPin, LOW);
|
||||
boolean ready = !digitalRead(_statusPin); //Si la pin sdo est à l'état haut, c'est que la conversion n'est pas terminée.
|
||||
digitalWrite(_csPin, HIGH);
|
||||
//On réactive le bus SPI
|
||||
SPI.begin();
|
||||
return ready;
|
||||
}
|
||||
|
||||
double LTC2439::convertToVoltage(int32_t value)
|
||||
{
|
||||
value += 32767;
|
||||
value *= _quantum;
|
||||
return value;
|
||||
}
|
||||
|
||||
int32_t LTC2439::getAsyncValue()
|
||||
{
|
||||
if(!_sampleTriggered)
|
||||
return -1;
|
||||
|
||||
digitalWrite(_csPin, LOW);
|
||||
|
||||
SPI.beginTransaction(_SPIsettings);
|
||||
int8_t bitsleft = 19;
|
||||
long result = 0;
|
||||
while(bitsleft > 0)
|
||||
{
|
||||
result <<= 8;
|
||||
result |= SPI.transfer(0);
|
||||
bitsleft -= 8;
|
||||
}
|
||||
SPI.endTransaction();
|
||||
|
||||
digitalWrite(_csPin, HIGH);
|
||||
|
||||
result >>= -bitsleft;
|
||||
int pos = (result & 0b10000000000000000)>> 16;
|
||||
unsigned long mask = 0b1111111111111111;
|
||||
result &= mask;
|
||||
|
||||
if(!pos && result != 0)
|
||||
{
|
||||
result = result | (~mask);
|
||||
}
|
||||
|
||||
_sampleTriggered = false;
|
||||
|
||||
return result;
|
||||
}
|
43
lib/LTC2439Lib/LTC2439.h
Normal file
43
lib/LTC2439Lib/LTC2439.h
Normal file
@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Anatole SCHRAMM-HENRY
|
||||
* Tim THUREL
|
||||
* Projet température de la ruche GROUPE 3
|
||||
* Driver pour le LTC2439 fonctionne avec l'ESP8266
|
||||
* Méthodes asynchrones disponibles
|
||||
*
|
||||
* Tout droits réservés
|
||||
*/
|
||||
|
||||
#ifndef LTC2439_H
|
||||
#define LTC2439_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
|
||||
class LTC2439
|
||||
{
|
||||
public:
|
||||
LTC2439(uint8_t csPin, uint8_t sdoPin, double vref = 3300);
|
||||
void setVref(double vref);
|
||||
double getVref(){return _vref;};
|
||||
int32_t sampleValue(uint8_t channel, boolean sgl = true);
|
||||
int32_t sampleValue();
|
||||
double sampleVoltage(uint8_t channel, boolean sgl = true);
|
||||
double sampleVoltage();
|
||||
//Methodes asynchrones
|
||||
void startAsyncSample(uint8_t channel, boolean sgl = true, boolean force = false);
|
||||
boolean asyncResultAvailable();
|
||||
double convertToVoltage(int32_t value);
|
||||
int32_t getAsyncValue();
|
||||
protected:
|
||||
private:
|
||||
uint8_t _csPin, _statusPin;
|
||||
boolean _sampleTriggered;
|
||||
double _vref; //Delta de tension de la plage : vref-gnd en mV
|
||||
uint8_t _adcRes;
|
||||
double _quantum;
|
||||
const uint8_t _channelMap[16];
|
||||
const SPISettings _SPIsettings;
|
||||
};
|
||||
|
||||
#endif //LTC2439_H
|
23
lib/LTC2439Lib/examples/LTC2439Lib/LTC2439Lib.ino
Normal file
23
lib/LTC2439Lib/examples/LTC2439Lib/LTC2439Lib.ino
Normal file
@ -0,0 +1,23 @@
|
||||
#include "LTC2439.h"
|
||||
|
||||
LTC2439 adc(2,12);
|
||||
uint8_t channel(0);
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println("Starting setup");
|
||||
Serial.println("End setup");
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
adc.startAsyncSample(channel);
|
||||
|
||||
if(adc.asyncResultAvailable())
|
||||
{
|
||||
int32_t raw = adc.getAsyncValue();
|
||||
Serial.printf("Conversion done, result for channel %u : %d, tension : %.2f\n", channel, raw, adc.convertToVoltage(raw));
|
||||
channel = channel == 15 ? 0 : channel + 1;
|
||||
}
|
||||
}
|
22
lib/LTC2439Lib/keywords.txt
Normal file
22
lib/LTC2439Lib/keywords.txt
Normal file
@ -0,0 +1,22 @@
|
||||
#######################################
|
||||
# Syntax Coloring Map LTC2439Lib
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# Datatypes (KEYWORD1)
|
||||
#######################################
|
||||
LTC2439 KEYWORD1
|
||||
|
||||
#######################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
#######################################
|
||||
setVref KEYWORD2
|
||||
startAsyncSample KEYWORD2
|
||||
asyncResultAvailable KEYWORD2
|
||||
convertToVoltage KEYWORD2
|
||||
getAsyncValue KEYWORD2
|
||||
getVref KEYWORD2
|
||||
#######################################
|
||||
# Constants (LITERAL1)
|
||||
#######################################
|
||||
|
Loading…
Reference in New Issue
Block a user