🛠 Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)
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
- 1 Arduino Due
- 1 oscilloscope (ou un multimètre pour la version lente) + pince de mesure sur GND
- Câble micro-USB
- Écouteur/piezo possible en variante (via un condensateur de couplage 1 µF)
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
- Oublier
analogWriteResolution(12): le core écrit par défaut en 8 bits, vos valeurs 0–4095 sont écrêtées à 255 et la tension plafonne à ~2/3 de la plage… sans message d'erreur. - Chercher le DAC sur les broches PWM 2–13 : le PWM (12 broches, 8 bits / 1 kHz par défaut) n'est PAS le DAC ; les seules vraies sorties analogiques sont 66 et 67.
- Mesurer avec une masse d'oscilloscope mal placée et conclure à un signal bruité : pince GND au plus près de DAC0.
- Attendre du courant : le DACC pilote de la logique, pas un haut-parleur ; ajouter un amplificateur opérationnel ou un transistor de puissance pour tout actionneur.
- Confondre DAC0 (66) avec une broche numérique au format Mega : sur une Due, la broche 66 est réelle, mais sur un shield prévu pour Mega elle est occupée — vérifier la plan de brochage avant d'empiler.
- Sortir hors plage : la sortie ne dépasse jamais 0–3,3 V, toute attente 5 V côté réception nécessite un amplificateur.
Autres tutoriels pour cette carte
- Faire clignoter la LED de l'Arduino Due et apprivoiser ses deux ports USB
- Lire un potentiomètre avec le vrai ADC 12 bits de la Due
- Allumer une LED externe en respectant les broches 3,3 V et 9 mA de la Due
- Dialoguer avec un GPS (ou tout module TTL) sur Serial1 sans bloquer la boucle
- Scanner les deux bus I2C de la Due (Wire sur 20/21, Wire1 sur 70/71)
- Monter la Due sur un bus CAN 500 kbit/s avec un transceiver externe
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino