🛠 Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)
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
- 1 Arduino Due
- 1 osciloscopio (o un multímetro para la versión lenta) + pinza de medición en GND
- Cable micro-USB
- Auricular/piezo posible en variante (mediante un condensador de acoplamiento de 1 µF)
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
- Olvidar
analogWriteResolution(12): el core escribe por defecto en 8 bits, tus valores 0–4095 se recortan a 255 y la tensión se limita a ~2/3 del rango… sin mensaje de error. - Buscar el DAC en los pines PWM 2–13: el PWM (12 pines, 8 bits / 1 kHz por defecto) NO es el DAC; las únicas salidas analógicas reales son los pines 66 y 67.
- Medir con una masa del osciloscopio mal colocada y concluir que la señal tiene ruido: coloca la pinza GND lo más cerca posible de DAC0.
- Esperar corriente: el DACC maneja lógica, no un altavoz; añade un amplificador operacional o un transistor de potencia para cualquier actuador.
- Confundir DAC0 (66) con un pin digital en formato Mega: en una Due, el pin 66 es real, pero en un shield previsto para Mega está ocupado — verifica el plano de pines antes de apilar.
- Salir del rango: la salida nunca supera 0–3,3 V, cualquier expectativa de 5 V en recepción requiere un amplificador.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino