Bonjour,
Je viens demander secours à propos d'un problème avec un Convertisseur A/D 16 bits ADS 1115 qui ne fonctionne pas comme je l'attendais.
Voici au tout début de mon programme arduino l'initialisation d'un objet ads
#include <Adafruit_ADS1015.h> //ADC 16 bits
// ****** Pour ADC 16 bits *****
Adafruit_ADS1115 ads;
Je pensais, par ce procédé avoir initialisé une instance ads de Adafruit_ADS1115
La suite du programme utilise cette instance pour mesurer une tension en mode 16 bits et ensuite afficher le résultat.
Tout parait fonctionner correctement, mais en surveillant les résultats pour des tensions faibles (quelques dizaines de mV), je me suis aperçu que sur le résultat de la conversion sur 16 bits, les 4 bits de poids faible étaient systématiquement écrasés (forcés à 0)
Comme si j'avais un convertisseur 12 bits (ADS 1015)
J'ai un peu regardé le contenu de la bibliothèque Adafruit :
-- Dans ADS1015.h j'ai repéré ce qui est pour moi accessible
public:
Adafruit_ADS1015(uint8_t i2cAddress = ADS1015_ADDRESS);
void begin(void);
uint16_t readADC_SingleEnded(uint8_t channel);
int16_t readADC_Differential_0_1(void);
int16_t readADC_Differential_2_3(void);
void startComparator_SingleEnded(uint8_t channel, int16_t threshold);
int16_t getLastConversionResults();
void setGain(adsGain_t gain);
adsGain_t getGain(void);
// Derive from ADS1105 & override construction to set properties
class Adafruit_ADS1115 : public Adafruit_ADS1015
{
public:
Adafruit_ADS1115(uint8_t i2cAddress = ADS1015_ADDRESS);
private:
};
Dans mon programme arduino je lis le résultat de la convertion de la façon suivante :
lcd.print("afficher CAD");
while (!TOUCHE(BpSuite))
{lcd.setCursor(0,1);
lcd.print(ads.readADC_SingleEnded(0));
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(ads.getLastConversionResults());
lcd.print(" ");
delay(250);
}
Donc , logiquement, cela devrait fonctionner en 16 bits et pas en 12 bits
J'ai ensuite un peu plus regardé dans le fichier Adafruit_ADS1015.ccp :
/**************************************************************************/
/*!
@brief Instantiates a new ADS1015 class w/appropriate properties
*/
/**************************************************************************/
Adafruit_ADS1015::Adafruit_ADS1015(uint8_t i2cAddress)
{
m_i2cAddress = i2cAddress;
m_conversionDelay = ADS1015_CONVERSIONDELAY;
m_bitShift = 4;
m_gain = GAIN_TWOTHIRDS; /* +/- 6.144V range (limited to VDD +0.3V max!) */
}
/**************************************************************************/
/*!
@brief Instantiates a new ADS1115 class w/appropriate properties
*/
/**************************************************************************/
Adafruit_ADS1115::Adafruit_ADS1115(uint8_t i2cAddress)
{
m_i2cAddress = i2cAddress;
m_conversionDelay = ADS1115_CONVERSIONDELAY;
m_bitShift = 0;
m_gain = GAIN_TWOTHIRDS; /* +/- 6.144V range (limited to VDD +0.3V max!) */
}
Mon programme devrait appeler "Adafruit_ADS1115::Adafruit_ADS1115(uint8_t i2cAddress)"
Dans lequel m_bitShift = 0; c'est à dire que les 4 bits de poids faible ne devraient pas êtres masqués ...
Ce qui n'est pas ce que j'ai constaté quand j'ai vérifié en faisant mesurer une petite tension d'une dizaine de mV par le convertisseur.
(En faisant croitre la tension à partir de 0, je devrais obtenir 0, 1, 2, 3 etc et non 0...16...32 ...48
Bon, pour tout dire, je galère pas mal.
Merci par avance
Serge .D