pwm-respiration.ino

Arduino Portenta H7 · Fichier : pwm-respiration.ino · Langage : Arduino · Usage : Respiration LED avec PWM haute fréquence

Les timers du H7 montent à des fréquences PWM bien au-delà des AVR : 100 kHz ici, idéal pour filtrer en vraie tension analogique avec un simple RC. La courbe gamma garde la respiration naturelle à l'œil.

Matériel requis

Une Arduino Portenta H7 (module ST STM32H747 double cœur Cortex-M7 @ 480 MHz + M4 @ 240 MHz, 8 Mo SDRAM, connecteur haut-density), alimentée par USB-C ou 5 V. 1 LED + résistance 330 Ω (broches en 3,3 V).

Câblage

LED + 330 Ω entre D9 et GND. Pour une tension analogique lisse : RC 10 kΩ / 100 nF après la broche.

Fonctionnement

analogWriteFrequency reconfigure le timer Mbed ; analogWrite applique le rapport cyclique. La boucle rampe en triangle avec gamma 2,2 toutes les 10 ms.

Exécution

Arduino IDE avec le core « Arduino Mbed OS Portenta Boards » : choisir « Portenta H7 » (cœur M7), le port USB-C puis Téléverser. Le sélecteur M7/M4 du mode DFU permet de charger aussi le cœur M4.

Variantes

Utiliser le vrai DAC (sortie A0) pour une tension continue, ou piloter un moteur DC en PWM 20 kHz.

pwm-respiration.ino

// Respiration LED sur PWM D9, frequence relevee a 100 kHz.
const int LED = 9;

float niveau = 0, pas = 0.02;
unsigned long t0 = 0;

void setup() {
  pinMode(LED, OUTPUT);
  analogWriteFrequency(LED, 100000);  // 100 kHz : hors spectre audible
  Serial.begin(9600);
}

void loop() {
  if (millis() - t0 < 10) return;
  t0 = millis();

  niveau += pas;
  if (niveau >= 1.0f) { niveau = 1.0f; pas = -pas; }
  if (niveau <= 0.0f) { niveau = 0.0f; pas = -pas; }

  analogWrite(LED, (int)(powf(niveau, 2.2f) * 255));
}

← Retour à la fiche