🛠 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é.

Objetivos

Utilizar lo que casi ningún otro Arduino clásico tiene: DOS salidas analógicas reales de 12 bits (el periférico DACC), en los pines DAC0 = pin digital 66 y DAC1 = pin 67. Se acabó el PWM que hay que filtrar: aquí la tensión de salida sigue directamente el valor escrito, entre 0 y 3,3 V. Vas a generar una rampa y luego una sinusoide, y descubrirás el detalle de la resolución por defecto (¡8 bits en escritura!).

Material

Código completo

// 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é");
}

Verificación esperada

En el osciloscopio (acoplamiento DC, base de tiempo ~50 ms/div), el pin 66 muestra una rampa continua real —no pulsos PWM— que sube de 0 a ~3,3 V, y luego una sinusoide muestreada en escalones de 32/4096 ≈ 25 mV. Con el multímetro en DC, un valor fijo escrito (por ejemplo, 2048) da ~1,65 V inmediatamente, sin filtro RC.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales