DAC MCP4725 problème de sortie Vout

Bonjour à tous,

J'ai fait l'acquisition d'un convertisseur MCP4725 suivant :
ar-module-convertisseur-dac-mcp4725-20136

Je l'utilise avec une carte Uno que je branche de la manière suivante :

  • Vcc du dac branché sur la sortie 5V de ma carte
  • les deux GND du dac branché au GND de la carte Uno
  • SCL / SDA I2C bien relié entre les deux
  • Vout libre pour brancher sur une sortie de multimètre

Je me suis servi de la libraire Adafruit et de l'exemple SineWave en simplifiant au maximum le code :

/**************************************************************************/
/*!
    @file     sinewave.pde
    @author   Adafruit Industries
    @license  BSD (see license.txt)

    This example will generate a sine wave with the MCP4725 DAC.

    This is an example sketch for the Adafruit MCP4725 breakout board
    ----> http://www.adafruit.com/products/935

    Adafruit invests time and resources providing this open source code,
    please support Adafruit and open-source hardware by purchasing
    products from Adafruit!
*/
/**************************************************************************/
#include <Wire.h>
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;

// Set this value to 9, 8, 7, 6 or 5 to adjust the resolution
#define DAC_RESOLUTION (8)

/* Note: If flash space is tight a quarter sine wave is enough
   to generate full sine and cos waves, but some additional
   calculation will be required at each step after the first
   quarter wave.                                              */

const PROGMEM uint16_t DACLookup_FullSine_9Bit[512] = {
  2048, 2073, 2098, 2123, 2148, 2174, 2199, 2224,
  2249, 2274, 2299, 2324, 2349, 2373, 2398, 2423,
  2448, 2472, 2497, 2521, 2546, 2570, 2594, 2618,
  2643, 2667, 2690, 2714, 2738, 2762, 2785, 2808,
  2832, 2855, 2878, 2901, 2924, 2946, 2969, 2991,
  3013, 3036, 3057, 3079, 3101, 3122, 3144, 3165,
  3186, 3207, 3227, 3248, 3268, 3288, 3308, 3328,
  3347, 3367, 3386, 3405, 3423, 3442, 3460, 3478,
  3496, 3514, 3531, 3548, 3565, 3582, 3599, 3615,
  3631, 3647, 3663, 3678, 3693, 3708, 3722, 3737,
  3751, 3765, 3778, 3792, 3805, 3817, 3830, 3842,
  3854, 3866, 3877, 3888, 3899, 3910, 3920, 3930,
  3940, 3950, 3959, 3968, 3976, 3985, 3993, 4000,
  4008, 4015, 4022, 4028, 4035, 4041, 4046, 4052,
  4057, 4061, 4066, 4070, 4074, 4077, 4081, 4084,
  4086, 4088, 4090, 4092, 4094, 4095, 4095, 4095,
  4095, 4095, 4095, 4095, 4094, 4092, 4090, 4088,
  4086, 4084, 4081, 4077, 4074, 4070, 4066, 4061,
  4057, 4052, 4046, 4041, 4035, 4028, 4022, 4015,
  4008, 4000, 3993, 3985, 3976, 3968, 3959, 3950,
  3940, 3930, 3920, 3910, 3899, 3888, 3877, 3866,
  3854, 3842, 3830, 3817, 3805, 3792, 3778, 3765,
  3751, 3737, 3722, 3708, 3693, 3678, 3663, 3647,
  3631, 3615, 3599, 3582, 3565, 3548, 3531, 3514,
  3496, 3478, 3460, 3442, 3423, 3405, 3386, 3367,
  3347, 3328, 3308, 3288, 3268, 3248, 3227, 3207,
  3186, 3165, 3144, 3122, 3101, 3079, 3057, 3036,
  3013, 2991, 2969, 2946, 2924, 2901, 2878, 2855,
  2832, 2808, 2785, 2762, 2738, 2714, 2690, 2667,
  2643, 2618, 2594, 2570, 2546, 2521, 2497, 2472,
  2448, 2423, 2398, 2373, 2349, 2324, 2299, 2274,
  2249, 2224, 2199, 2174, 2148, 2123, 2098, 2073,
  2048, 2023, 1998, 1973, 1948, 1922, 1897, 1872,
  1847, 1822, 1797, 1772, 1747, 1723, 1698, 1673,
  1648, 1624, 1599, 1575, 1550, 1526, 1502, 1478,
  1453, 1429, 1406, 1382, 1358, 1334, 1311, 1288,
  1264, 1241, 1218, 1195, 1172, 1150, 1127, 1105,
  1083, 1060, 1039, 1017, 995, 974, 952, 931,
  910, 889, 869, 848, 828, 808, 788, 768,
  749, 729, 710, 691, 673, 654, 636, 618,
  600, 582, 565, 548, 531, 514, 497, 481,
  465, 449, 433, 418, 403, 388, 374, 359,
  345, 331, 318, 304, 291, 279, 266, 254,
  242, 230, 219, 208, 197, 186, 176, 166,
  156, 146, 137, 128, 120, 111, 103, 96,
  88, 81, 74, 68, 61, 55, 50, 44,
  39, 35, 30, 26, 22, 19, 15, 12,
  10, 8, 6, 4, 2, 1, 1, 0,
  0, 0, 1, 1, 2, 4, 6, 8,
  10, 12, 15, 19, 22, 26, 30, 35,
  39, 44, 50, 55, 61, 68, 74, 81,
  88, 96, 103, 111, 120, 128, 137, 146,
  156, 166, 176, 186, 197, 208, 219, 230,
  242, 254, 266, 279, 291, 304, 318, 331,
  345, 359, 374, 388, 403, 418, 433, 449,
  465, 481, 497, 514, 531, 548, 565, 582,
  600, 618, 636, 654, 673, 691, 710, 729,
  749, 768, 788, 808, 828, 848, 869, 889,
  910, 931, 952, 974, 995, 1017, 1039, 1060,
  1083, 1105, 1127, 1150, 1172, 1195, 1218, 1241,
  1264, 1288, 1311, 1334, 1358, 1382, 1406, 1429,
  1453, 1478, 1502, 1526, 1550, 1575, 1599, 1624,
  1648, 1673, 1698, 1723, 1747, 1772, 1797, 1822,
  1847, 1872, 1897, 1922, 1948, 1973, 1998, 2023
};

const PROGMEM uint16_t DACLookup_FullSine_8Bit[256] = {
  2048, 2098, 2148, 2198, 2248, 2298, 2348, 2398,
  2447, 2496, 2545, 2594, 2642, 2690, 2737, 2784,
  2831, 2877, 2923, 2968, 3013, 3057, 3100, 3143,
  3185, 3226, 3267, 3307, 3346, 3385, 3423, 3459,
  3495, 3530, 3565, 3598, 3630, 3662, 3692, 3722,
  3750, 3777, 3804, 3829, 3853, 3876, 3898, 3919,
  3939, 3958, 3975, 3992, 4007, 4021, 4034, 4045,
  4056, 4065, 4073, 4080, 4085, 4089, 4093, 4094,
  4095, 4094, 4093, 4089, 4085, 4080, 4073, 4065,
  4056, 4045, 4034, 4021, 4007, 3992, 3975, 3958,
  3939, 3919, 3898, 3876, 3853, 3829, 3804, 3777,
  3750, 3722, 3692, 3662, 3630, 3598, 3565, 3530,
  3495, 3459, 3423, 3385, 3346, 3307, 3267, 3226,
  3185, 3143, 3100, 3057, 3013, 2968, 2923, 2877,
  2831, 2784, 2737, 2690, 2642, 2594, 2545, 2496,
  2447, 2398, 2348, 2298, 2248, 2198, 2148, 2098,
  2048, 1997, 1947, 1897, 1847, 1797, 1747, 1697,
  1648, 1599, 1550, 1501, 1453, 1405, 1358, 1311,
  1264, 1218, 1172, 1127, 1082, 1038, 995, 952,
  910, 869, 828, 788, 749, 710, 672, 636,
  600, 565, 530, 497, 465, 433, 403, 373,
  345, 318, 291, 266, 242, 219, 197, 176,
  156, 137, 120, 103, 88, 74, 61, 50,
  39, 30, 22, 15, 10, 6, 2, 1,
  0, 1, 2, 6, 10, 15, 22, 30,
  39, 50, 61, 74, 88, 103, 120, 137,
  156, 176, 197, 219, 242, 266, 291, 318,
  345, 373, 403, 433, 465, 497, 530, 565,
  600, 636, 672, 710, 749, 788, 828, 869,
  910, 952, 995, 1038, 1082, 1127, 1172, 1218,
  1264, 1311, 1358, 1405, 1453, 1501, 1550, 1599,
  1648, 1697, 1747, 1797, 1847, 1897, 1947, 1997
};

const PROGMEM uint16_t DACLookup_FullSine_7Bit[128] = {
  2048, 2148, 2248, 2348, 2447, 2545, 2642, 2737,
  2831, 2923, 3013, 3100, 3185, 3267, 3346, 3423,
  3495, 3565, 3630, 3692, 3750, 3804, 3853, 3898,
  3939, 3975, 4007, 4034, 4056, 4073, 4085, 4093,
  4095, 4093, 4085, 4073, 4056, 4034, 4007, 3975,
  3939, 3898, 3853, 3804, 3750, 3692, 3630, 3565,
  3495, 3423, 3346, 3267, 3185, 3100, 3013, 2923,
  2831, 2737, 2642, 2545, 2447, 2348, 2248, 2148,
  2048, 1947, 1847, 1747, 1648, 1550, 1453, 1358,
  1264, 1172, 1082, 995, 910, 828, 749, 672,
  600, 530, 465, 403, 345, 291, 242, 197,
  156, 120, 88, 61, 39, 22, 10, 2,
  0, 2, 10, 22, 39, 61, 88, 120,
  156, 197, 242, 291, 345, 403, 465, 530,
  600, 672, 749, 828, 910, 995, 1082, 1172,
  1264, 1358, 1453, 1550, 1648, 1747, 1847, 1947
};

const PROGMEM uint16_t DACLookup_FullSine_6Bit[64] = {
  2048, 2248, 2447, 2642, 2831, 3013, 3185, 3346,
  3495, 3630, 3750, 3853, 3939, 4007, 4056, 4085,
  4095, 4085, 4056, 4007, 3939, 3853, 3750, 3630,
  3495, 3346, 3185, 3013, 2831, 2642, 2447, 2248,
  2048, 1847, 1648, 1453, 1264, 1082, 910, 749,
  600, 465, 345, 242, 156, 88, 39, 10,
  0, 10, 39, 88, 156, 242, 345, 465,
  600, 749, 910, 1082, 1264, 1453, 1648, 1847
};

const PROGMEM uint16_t DACLookup_FullSine_5Bit[32] = {
  2048, 2447, 2831, 3185, 3495, 3750, 3939, 4056,
  4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447,
  2048, 1648, 1264, 910, 600, 345, 156, 39,
  0, 39, 156, 345, 600, 910, 1264, 1648
};

void setup(void) {
  Serial.begin(9600);
  Serial.println("Hello!");

  // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
  // For MCP4725A0 the address is 0x60 or 0x61
  // For MCP4725A2 the address is 0x64 or 0x65
  dac.begin(0x60);

  Serial.println("Generating a sine wave");
}

void loop(void) {

  dac.setVoltage(4095, false);
  delay(4000);
  dac.setVoltage(0, false);
  delay(4000);
}

J'ai un relevé au multimètre à la borne Vcc de mon DAC : 4.98V

J'ai réglé au maxi ma valeur de sortie Vout " 4095 " mais je n'arrive à sortir en réel au multimètre que 3,23V. J'ai essayé plusieurs branchement de ma carte Uno ( par USB / alimentation 12V ) mais rien n'y change. Je devrais avoir au moins 4,5V en sortie logiquement.
J'ai également changé de convertisseur mais c'est la même chose.

Quelqu'un à une idée ou une piste à explorer ?

Merci par avance,

Ludo

Le multimètre retourne une tension efficace donc tu as un rapport √2 => 1.414.
Pour faire un test simple, il vaudrait mieux travailler en continu, plutôt qu'en alternatif, en faisant générer une dizaines de valeurs prises dans un tableau et que tu ferais changer toutes les 4 ou 5 secondes pour laisser à l'affichage du multimètre le temps de se stabiliser.

1 Like

Mon multimètre est réglé en 12V Dc, j’essaie de faire des photos de mes tests tout à l’heure.
Je ferais un relevé avec un petit oscilo portatif.

Voici mon montage et le relevé de tension DC sur la sortie Vout avec ma sortie réglé à fond dans le programme :

Voici le même relevé mais avec un oscilo portatif et le programme qui règle la sortie sur 5 secondes à 4095 et 5 autres secondes sur 0 :

Relevé MCP4725 oscilo

Bonjour @udina

Pour que l'oscilloscope montre correctement le signal carré sortant du DAC (avec ton code modifié)

void loop(void) {

  dac.setVoltage(4095, false);
  delay(4000);
  dac.setVoltage(0, false);
  delay(4000);
}

il faudrait quil soit utilisé en mode DC (continu) et pas AC (alternatif) faute de quoi l'oscilloscope lui fait subir une dérivation et l'on se retrouve avec une suite d'impulsions positives et négatives accompagnées des charges et décharges du condensateur d'entrée de l'oscillo en mode AC
image

Au pif je vois sur l'écran un signal montant aux alentours de 4V, donc OK,......le reste c'est l'artefact d'une mauvaise utilisation 'utilisation perfectible' de l'oscillo :wink:

PS une sonde défectueuse peut aussi produire un tel effet de liaison capacitive transformant le signal

void loop(void) {

  dac.setVoltage(4095, false);
  delay(400);
  dac.setVoltage(0, false);
  delay(400);
}

Je suis bien réglé en Dc, voici ce que ça donne avec le code si dessus :

As-tu réglé ta sonde 10x pour avoir des paliers horizontaux aux niveaux hauts et bas du signal carré ? (elle possède sans doute une fente permettant d'ajuster un condensateur variable interne)

(je ne sait pas quelle genre de sonde est fournie avec ce modèle de petit scope 'lw cost' )

Je t'avoue que je ne connais pas bien les oscilloscopes mais j’essaie de m’améliorer :sweat_smile:

Oui, il y a sur la sonde un contacteur 1x / 10x qui est réglé sur 10x

il n'y a pas également un trou permettant d'atteindre une fente pour tournevis (plastique) ?
(réglage de compensation de capacité)

https://www.rohde-schwarz.com/fr/produits/test-et-mesure/essentials-test-equipment/digital-oscilloscopes/comprehension-compensation-sonde_254520.html

Il y a quand même un truc bizarre
image
Bien que l'oscilloscope soit en DC, j'ai l'impression que le signal sort toujours autour de 0. Ou alors le marqueur à gauche serait le seuil de déclenchement mais ce n'est pas très habituel. Sur tous les scope que je connais, ce marqueur indique le 0V.
Il n'y aurait pas une capa qui traîne dans la sortie de ton module MCP4725 ou dans la sonde du scope?

1 Like

Je n'ai rien branché sur la sortie Vout pour le moment, je voulais faire des tests de relevé afin de maitriser son fonctionnement.
Sur mon montage final, j'ai deux MCP4725 qui vont fonctionner en même temps, j'ai réalisé la soudure de la pull-up pour l'adressage I2C, le premier est à l’adresse 0x60 et le deuxième est à l'adresse 0x61.
j'ai deux fonctions à créer qui devrait ressemeler à ceci :

void MonterDesVitesses () {

dac.setVoltage(dac0x60, 4095, false);
delay(400);
dac.setVoltage(dac0x61, 0, false);
delay(400);
dac.setVoltage(0x60, 0, false);
delay(400);
 }

Je ne sais pas comment écrire la ligne me permettant de sélectionner quel Dac je souhaite utiliser et lui demander dans la même ligne la valeur de sortie. Une idée ?

Ajouter un dac

#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;
Adafruit_MCP4725 dac2(0x61);


void MonterDesVitesses () {

dac.setVoltage(4095, false);
delay(400);
dac2.setVoltage( 0, false);
delay(400);
dac.setVoltage(0x60, 0, false);
delay(400);
 }

J'essaie de coder ça se soir et je te redemanderais une vérification de fonctionnalité. Merci

La création d'un deuxième élément dac marche niquel, merci pour l'aide.
Pour la déperdition de tension dans le Vout, je ne vais pas trop m'éterniser dessus car le contrôleur du véhicule qui lit la sortie Vout de mes dac réceptionne bien l'information.

Bonne journée à tous,
Ludo

Il faut juste être conscient que la tension en sortie dépend de la tension d'alimentation du module.
Par exemple si l'Arduino est alimenté par l'USB la tension à l'entrée du module sera autour des 4,8 à 4,9V. Si la carte est alimentée par son Vin, la tension à l'entrée du module pourra être autour des 5,0 à 5,2V. Ce qui va peut-être changer le fonctionnement de l'organe connecté au module.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.