dac-analogique.ino

Arduino UNO R4 Minima · Fichier : dac-analogique.ino · Langage : Arduino · Usage : Générer une tension continue avec le DAC 12 bits sur A0

Le R4 embarque un vrai DAC 12 bits sur A0 : il sort une tension continue propre, contrairement au PWM filtré des AVR. Ce script génère une rampe sinusoïdale pilotable à la volée depuis le moniteur série.

Matériel requis

Une Arduino UNO R4 Minima (Renesas RA4M1, Cortex-M4 @ 14 MHz, 5 V, DAC 12 bits, sans radio) alimentée par USB ou 6-24 V. Un multimètre pour vérifier, ou une entrée analogique à piloter (0-3,3 V).

Câblage

A0 vers l'entrée à piloter ; masses communes. Sortie 3,3 V pleine échelle, faible courant de sortie (tamponner pour piloter une charge).

Fonctionnement

analogWriteDAC0() écrit directement dans le convertisseur numérique-analogique intégré au RA4M1 ; la tension de sortie suit la valeur en temps réel, sans ripple PWM.

Exécution

Arduino IDE 2.x (core « Arduino UNO R4 Boards » installé), choisir « Arduino UNO R4 Minima », sélectionner le port et Téléverser. Le moniteur série est à 9600.

Variantes

Générer des formes d'onde (triangle, dents de scie) pour un synthé, ou piloter la consigne d'un moteur via un étage amplificateur.

dac-analogique.ino

// DAC 12 bits integration du R4 : tension continue sur A0.
// analogWriteDAC0(valeur) : 0..4095 pour 0..3,3 V.
// A verifier a l'ohmmetre/metre : A0 -> metre, GND commun.

void setup() {
  Serial.begin(9600);
  Serial.println(F("DAC0 sur A0 : 0..4095 -> 0..3,3 V"));
  Serial.println(F("Envoyez une valeur, ou 'r' pour un rampe."));
}

void loop() {
  static float phase = 0;

  // Petite rampe triangulaire 0..3,3 V visible au metre.
  phase += 0.02;
  float x = 0.5 + 0.5 * sin(phase);
  int valeur = (int)(x * 4095);
  analogWriteDAC0(valeur);

  static unsigned long t0 = 0;
  if (millis() - t0 >= 500) {
    t0 = millis();
    Serial.printf("DAC=%d  U=%.3f V\n", valeur, valeur * 3.3 / 4095.0);
  }

  // Commande serie : 's' suit une consigne saisie.
  if (Serial.available()) {
    int consigne = Serial.parseInt();
    if (consigne >= 0 && consigne <= 4095) {
      analogWriteDAC0(consigne);
      Serial.printf("force a %d (%.3f V)\n", consigne, consigne * 3.3 / 4095.0);
    }
  }
}

← Retour à la fiche