Table des matières

Sommaire Matériels

Convertisseur analogique numérique

[Mise à jour le 3/2/2020]

MCP3424

Le module DFR0316 est un module de conversion de données à circuit MCP3424 18-Bit ADC-4 Channel

*.cpp
// Connexion à un capteur de température LM35
 
#include <Wire.h>
#include <MCP342x.h>
 
// 0x68 est l'adresse par défaut des circuits MCP342x
uint8_t address = 0x68;
// Création de l'objet adc
MCP342x adc = MCP342x(address);
 
void setup(void)
{
    // Initialisation de la console
    Serial.begin(9600);
    // Initialisation du bus I2C
    Wire.begin();
 
    // Enable power for MCP342x (needed for FL100 shield only)
    //pinMode(9, OUTPUT);
    //digitalWrite(9, HIGH);
 
    // Reset du circuit
    MCP342x::generalCallReset();
    delay(1); // MC342x nécessite 300us pour se paramétrer, on attend 1ms
 
    // Vérification de la présence du MCP342x
    Wire.requestFrom(address, (uint8_t)1);
    if (!Wire.available())
    {
        Serial.print("Pas de circuit à cette adresse ");
        Serial.println(address, HEX);
        while (1)
            ;
    }
}
 
void loop(void)
{
    long value = 0, tension_mV = 0;
    int gain, resolution;
    MCP342x::Config status;
    // ---------------------------------------------------------------------------------------
    // Déclenchement d'une conversion. La méthode convertAndRead() attend la fin de la conversion
    // On passe les paramètres suivants à la fonction dans l'ordre :
    // - canal : channel1, channel2, channel3 ou channel4 pour un MCP3424
    // - type de conversions : oneshot ou continous
    // - résolution : resolution12, resolution14, resolution16 ou resolution18
    // - gain : gain1, gain2, gain4 ou gain8
    // timeout = temps accordé à la transaction en ms (1000000 dans cet exemple !)
    // A l'issue de la conversion
    // - value = gain * (2^résolution/2^12) * tension du canal sélectionné en mv
    // - status identifie la valeur du gain et de la résolution
    // | gain | résolution | status  |
    // |  1   |     12bits |    0    |
    // |  2   |     12     |    1    |
    // |  4   |     12     |    2    |
    // |  8   |     12     |    3    |
    // |  1   |     14bits |    4    |
    // etc.
    // |  1   |     16bits |    8    |
    // etc.
    // |  1   |     18bits |    12   |
    // etc.
    // ---------------------------------------------------------------------------------------
    // Conserver la valeur des trois derniers paramètres
    uint8_t err = adc.convertAndRead(MCP342x::channel1, MCP342x::oneShot,
                                     MCP342x::resolution12, MCP342x::gain4,
                                     1000000, value, status);
    if (err)
    {
        Serial.print("Erreur de conversion : ");
        Serial.println(err);
    }
    else
    {
        switch (status)
        {
        case 2:
            gain = 4;
            resolution = 12;
            break;
        case 6:
            gain = 4;
            resolution = 14;
            break;
        case 10:
            gain = 4;
            resolution = 16;
            break;
        case 14:
            gain = 4;
            resolution = 18;
            break;
        }
        Serial.print("value = ");
        Serial.println(value);
        Serial.print("Tension sur le canal 1 : ");
        tension_mV = value / (gain * pow(2, resolution - 12));
        Serial.print(tension_mV);
        Serial.println("mV");
        Serial.print("Temperature mesuree par le LM35 : ");
        Serial.print(tension_mV / 10.0);
        Serial.println("C");
    }
 
    delay(1000);
}

Le projet pour l'IDE VSCode de l'exemple ci-dessus est téléchargeable ici