🛠 Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)

Arduino Due · intermediaire · Schéma : IMG-due-intermediaire-1-dac-veritable-sortie-analogique.svg — Arduino Due, broche DAC0 (66) sortant vers l'entrée d'un oscilloscope affichant une rampe en dents de scie, puce DACC 12 bits annotée, broche DAC1 (67) disponible à côté.

Objectifs

Utiliser ce que presque aucune autre Arduino classique n'a : DEUX vraies sorties analogiques 12 bits (le périphérique DACC), sur les broches DAC0 = broche numérique 66 et DAC1 = broche 67. Fini le PWM qu'il faut filtrer : ici la tension de sortie suit directement la valeur écrite, entre 0 et 3,3 V. Vous allez générer une rampe puis une sinusoïde, et lever le lièvre de la résolution par défaut (8 bits en écriture !).

Matériel

Code complet

// Rampe + sinusoïde sur DAC0 (broche 66) — DACC 12 bits
#include <math.h>

const uint8_t DAC0_PIN = DAC0;   // 66 (PB15). DAC1 = 67 (PB16)

void setup {
  analogWriteResolution(12);     // sans ça : écritures 8 bits (0..255) par défaut !
  SerialUSB.begin(115200);
}

void loop {
  // 1) Rampe en dents de scie 0..4095
  for (int v = 0; v <= 4095; v += 32) {
    analogWrite(DAC0_PIN, v);
    delay(2);
  }
  // 2) Sinusoïde centrée 0..4095 autour de 1,65 V
  for (int i = 0; i < 64; i++) {
    float t = i * 2.0f * PI / 64.0f;
    int v = 2048 + (int)(2000.0f * sinf(t));
    analogWrite(DAC0_PIN, v);
    delay(2);
  }
  SerialUSB.println("cycle DAC0 terminé");
}

Vérification attendue

À l'oscilloscope (couplage DC, base de temps ~50 ms/div), la broche 66 montre une vraie rampe continue — pas des créneaux PWM — montant de 0 à ~3,3 V, puis une sinusoïde échantillonnée par paliers de 32/4096 ≈ 25 mV. Au multimètre en DC, une valeur écrite fixe (par ex. 2048) donne ~1,65 V immédiatement, sans filtre RC.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels