Class CMAX31865

La classe CMAX31865 regroupe toutes les fonctions nécessaires pour contrôler un périphérique MAX31865 pour la mesure de température via RTD.


Cette classe exporte les méthodes de base pour lire/écrire des données sur le bus SPI vers ce périphérique. Ce périphérique étant accessible depuis le bus SPI, cette classe hérite de la classe CSPIDevice.


Quelques détails sur le MAX31865 :

Ce chip fonctionne selon 2 modes de lecture de la température. En mode continu ou en mode one shot. Cette classe utilise le mode one shot qui permet un contrôle plus précis de l'instant auquel sont faites les mesures.

Ce chip est relativement mal documenté... ou alors j'ai raté des trucs !

Tout d'abord, lors d'une lecture sur le bus SPI, il retourne toujours un octet à 0x00 avant de renvoyer les données demandées. Je n'ai pas vu ce "détail" dans la documentation. Donc pour le lire, il vaut mieux lire tous les registres d'un seul coup, tout en lisant un octet de plus que ce que l'on attend. Avec la librairie bcm2835, cela impose d'envoyer d'abord 8 octets tous à 0, puis de lire 9 octets, on se retrouve alors avec le tableau suivant :

 - Element 0 : Octet à 0 inutile et bon à jeter
 - Element 1 : Valeur courante du registre de configuration : Sa valeur doit être celle appliquée lors de l'initialisation ou d'un trig sauf le bit D1 qui est alors à 0.
 - Element 2 : MSB de la mesure.
 - Element 3 : LSB de la mesure.
 - Elements 4 à 7 : Registres de fautes, non utilisés par cette classe.
 - Element 8 : Registre de faute d'état.

Voir le code de la méthode ReadRawADC, pour l'implémentation de tout cela.

Autre pépin, visiblement non documenté, la broche DRDY qui devrai indiquer que la mesure est prête à être lue semble ne pas fonctionner en mode one shot. Seule façon de lire la bonne mesure.... attendre un délai entre la méthode Trig et la méthode ReadRawADC. La valeur de ce délai ???? 52 ms si on utilise un réseau 60 Hz (et donc un filtre à 60 Hz), 62,5ms pour le 50 Hz. A ces valeurs il faut ajouter au moins 1 ms.

Utilisation de cette classe :

Initialisation :
 - Initialize
Obtention d'une mesure :
 - Trig
 - Attente de 52 ou 62.5 ms
 - ReadRawADC
 - RawADCToResistance
 - ResistanceToTemperature

Pour simplifier, une méthode nommée MeasureTemperature intègre tout le boulot décrit pour l'obtention d'une mesure. Ce n'est pas plus rapide, mais c'est plus simple.

Les valeurs par défaut du constructeur sont adaptées à la france (filtre 50 Hz), définissent une RTD 3 fils de 100 Ohms. En utilisant le bus SPI 0 et en définissant CS comme étant la pin GPIO22 (broche 15), cela permet de cabler tous les signaux du MAX31865 de mannère simple :

- - VIN sur la broche 17
- - GND sur la broche 25
- - CLK sur la broche 23
- - SDO sur la broche 21
- - SDI sur la broche 19
- - CS sur la broche 15

On a alors la possibilité de connecter le MAX31865 au Pi au moyen d'un connecteur 6 points contigus. Donc un meilleur cablage. Cela au prix de ne pas utiliser le CS standard qui serait sur les broches 20 ou 22. Cela oblige à gérer nous même le CS mais c'est un petit prix à payer. C'est ce que fait cette classe par défaut.

Exemple d'utilisation

Cet extrait de code est un pseudo code, il regroupe dans un même flot des opérations normalement disséminées dans diverses parties d'un programme.


// Déclaration des objets requis sous forme de pointeurs
C2835Driver* m_pDriver;
CSPIBus* m_pSPIBus;
CMAX31865* m_pMAX31865;

// Initialisation des pointeurs vers les objets requis à un pointeur nul
m_pDriver = nullptr;
m_pSPIBus = nullptr;
m_pMAX31865 = nullptr;

// Création et vérificaation de création des sobjets requis
if((m_pDriver = new C2835Driver()) == nullptr) return false;
if((m_pSPIBus = new CSPIBus(m_pDriver)) == nullptr) return false;
if((m_pMAX31865 = new CMAX31865(m_pSPIBus,
                   GPIO_15,
                   SPI_CS_POLARITY_NEGATIVE,
                   SPI_BIT_ORDER_MSBFIRST,
                   SPI_CLOCK_DIVIDER_1024,
                   SPI_DATA_MODE_1,
                   MAX31865_100_RTD_TYPE,
                   MAX31865_RTD_3_WIRES,
                   MAX31865_50HZ_FILTER) == nullptr) return false;

// Initialisation de la librairie et ouverture du bus SPI
if(!m_pDriver->Initialize()) return false;
if(!m_pSPIBus->Open(SPI_BIT_ORDER_MSBFIRST, SPI_CLOCK_DIVIDER_1024, SPI_DATA_MODE_1)) false;

// Initialisation du composant
if(m_pMAX31865->Initialize() != MAX31865_ERROR_CODE_NOERROR) return false;

// Prise de mesure et récupération des valeurs mesurées
float fTemp;
if(m_pMAX31865->MeasureTemperature(&fTemp) != MAX31865_ERROR_CODE_NOERROR) return false;
// En fin de programme, fermeture du bus I2C et arrêt de la librairie
if(m_pSPIBus != nullptr) m_pSPIBus->Close();
if(m_pDriver != nullptr) m_pDriver->Terminate();

// En fin de programme, effacement des objets utilisés
if(m_pMAX31865 != nullptr) delete m_pMAX31865;
if(m_pSPIBus != nullptr) delete m_pSPIBus;
if(m_pDriver != nullptr) delete m_pDriver;

Fonctions publiques

CMAX31865(CSPIBus* pSPIBus,
const GPIO_PIN& eSpiCSPin,
const SPI_CS_POLARITY& eSpiCSPolarity,
const SPI_BIT_ORDER& eSpiBitOrder,
const SPI_CLOCK_DIVIDER& eSpiClockDivider,
const SPI_DATA_MODE& eSpiDataMode,
const MAX31865_RTD_TYPE& eRTDType,
const MAX31865_RTD_WIRES& eRTDWires,
const MAX31865_FILTER& eFilter)
QStringGetErrorInfo(const int& nErrorCode)
MAX31865_ERROR_CODEInitialize()
MAX31865_ERROR_CODEMeasureTemperature(float* fTemperature)
floatRawADCToResistance(const ushort& unRadADC)
MAX31865_ERROR_CODEReadRawADC(ushort* punValue)
floatResistanceToTemperature(const float &fResistance)
MAX31865_ERROR_CODETrig()


CMAX31865::CMAX31865(CSpiBus* pSpiBus,
               const GPIO_PIN& eSpiCSPin,
               const SPI_CS_POLARITY& eSpiCSPolarity,
               const SPI_BIT_ORDER& eSpiBitOrder,
               const SPI_CLOCK_DIVIDER& eSpiClockDivider,
               const SPI_DATA_MODE& eSpiDataMode,
               const MAX31865_RTD_TYPE& eRTDType,
               const MAX31865_RTD_WIRES& eRTDWires,
               const MAX31865_FILTER& eFilter)

Description : Contructeur. Instancie un objet de la classe CMAX31865.


Paramètre : pSpiBus - type CSpiBus* - Pointeur vers l'objet CSpiBus auquel est connecté ce composant. L'objet CSpiBus aura été instancié et ouvert en amont de cet appel.

Paramètre : eSpiCSPin - type GPIO_PIN& - Broche du port GPIO pour le signal CS de ce composant. Valeur recommandée GPIO_15.

Paramètre : eSpiCSPolarity - type SPI_CS_POLARITY& - Polarité CS. Uniquement la valeur SPI_CS_POLARITY_NEGATIVE.

Paramètre : eSpiBitOrder - type SPI_BIT_ORDER& - Ordre des bit : Uniquement la valeur SPI_BIT_ORDER_MSBFIRST.

Paramètre : eSpiClockDivider - type SPI_CLOCK_DIVIDER& - Diviseur de féquence de l'horloge SPI. Toutes valeurs entre SPI_CLOCK_DIVIDER_1024 et SPI_CLOCK_DIVIDER_65536.

Paramètre : eSpiDataMode - type SPI_DATA_MODE& - Mode SPI de ce périphérique. Seules valeurs acceptables : SPI_DATA_MODE_1 ou SPI_DATA_MODE_3.

Paramètre : eRTDType - type MAX31865_RTD_TYPE& - Type de la sonde platine.

Paramètre : eRTDWires - type MAX31865_RTD_WIRES& - Nombre de fils de la sonde platine.

Paramètre : eFilter - type MAX31865_FILTER& - Filtre à appliquer. En France : MAX31865_50HZ_FILTER.



MAX31865_ERROR_CODE CMAX31865::Initialize(struct DS3231DateTime* pdt, bool* pValid)

Description : Initialise le compsoant MAX31865. Cette focntion doit être appelée avant les fonctions de mesure..


Valeur de retour : MAX31865_ERROR_CODE indiquant le succès (MAX31865_ERROR_CODE_NOERROR) ou l'échec (MAX31865_ERROR_CODE_2835DRIVER_ERROR OU MAX31865_ERROR_CODE_FAULT) de la fonction.



MAX31865_ERROR_CODE CMAX31865::MeasureTemperature(float* fTemperature)

Description : Déclenche une mesure sur le composant MAX31865, la linéarise et la convertie en température.


Paramètre de sortie : fTemperature - type float* - Pointeur vers la valeur mesurée en sortie de la fonction.

Valeur de retour : MAX31865_ERROR_CODE indiquant le succès (MAX31865_ERROR_CODE_NOERROR) ou l'échec (MAX31865_ERROR_CODE_2835DRIVER_ERROR OU MAX31865_ERROR_CODE_FAULT) de la fonction.



float CMAX31865::RawADCToResistance(const ushort& unRadADC)

Description : Linéarise une valeur retournée par la fonction ReadRAwADC en résistance.


Paramètre : unRadADC - ushort& - Valeur binaire mesurée et retournée par la fonction ReadRAwADC.

Valeur de retour : Valeur linéarisée en résistance.



MAX31865_ERROR_CODE CMAX31865::ReadRawADC(ushort* punValue)

Description : Fonction utilisée après la fonction Trig pour lire le contenu des registres de mesure du composant MAX31865.


Paramètre : punValue - type ushort* - Pointeur vers un ushort recevant la valeur lue dans les registres du composant MAX31865.

Valeur de retour : MAX31865_ERROR_CODE indiquant le succès (MAX31865_ERROR_CODE_NOERROR) ou l'échec (MAX31865_ERROR_CODE_2835DRIVER_ERROR OU MAX31865_ERROR_CODE_FAULT) de la fonction.



float CMAX31865::ResistanceToTemperature(const float &fResistance)

Description : Convertie une valeur de résistance en température pour la sonde platine utilisée.


Paramètre de sortie : fResistance - float& - Valeur de résistance telle que retournée par la fonction RawADCToResistance.

Valeur de retour : Valeur linéarisée en température.



MAX31865_ERROR_CODE CMAX31865::Trig()

Description : Déclenche une mesure dont le résultat pourra être lu via la fonction ReadRawADC.


Valeur de retour : MAX31865_ERROR_CODE indiquant le succès (MAX31865_ERROR_CODE_NOERROR) ou l'échec (MAX31865_ERROR_CODE_2835DRIVER_ERROR OU MAX31865_ERROR_CODE_FAULT) de la fonction.