pwm_rampe.c

nRF52833-DK (id boards.json : nrf52833-dk) · Fichier : pwm_rampe.c · Langage : C · Usage : Rampe d’intensité LED par PWM

Variation d’intensité sans scintillement : le PWM 100 Hz de la puce nRF fait monter et descendre la luminosité par pas de 2 %. Le canal vient de l’alias pwm-0, un overlay dévie le contrôleur PWM vers une broche du connecteur si besoin.

Matériel requis

Une carte nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentée par USB : 4 LEDs sur P0.13-P0.16 (actives au niveau bas) et 4 boutons sur P0.11, P0.12, P0.24, P0.25 (actifs bas, pull-up interne à activer). Une LED + 330 Ω sur une broche routée en PWM (P2.xx sur le DK via overlay), ou la LED RVB du MDK si l’overlay la cible.

Câblage

LED entre la broche PWM et GND via 330 Ω. Les broches P1/P2 du DK sortent 3,3 V : vérifier la tension avant tout composant 5 V.

Fonctionnement

pwm_set_dt fixe période (10 ms) et impulsion (0 à période). La boucle balaie 0-100 % toutes les 20 ms, soit une rampe complète de 2 secondes.

Exécution

Projet Zephyr : west build -b nrf52833dk/nrf52833 puis west flash (J-Link embarqué) ; console série 115200 sur le connecteur USB UART.

Variantes

Trois canaux PWM = variation RVB, augmenter la fréquence au-delà de 1 kHz pour de l’audio filtré, ou piloter un servo avec une période de 20 ms.

pwm_rampe.c

/* Rampe PWM sur l'alias pwm-0 (100 Hz, rapport 0-100 %).
 * Le BSP ne route pas toujours PWM sur les LED : overlay minimal
 * à ajouter au projet pour coller PWM0 sur une broche libre, p.ex.
 *   &pwm20 { status = "okay"; };
 *   / { aliases { pwm-0 = &pwm20; }; };
 * (sur le DK, P2.xx du connecteur via le node pinctrl du PWM). */
#include <zephyr/kernel.h>
#include <zephyr/drivers/pwm.h>

static const struct pwm_dt_spec pwm_led = PWM_DT_SPEC_GET(DT_ALIAS(pwm_0));

#define PERIODE_NS 10000000U   /* 10 ms = 100 Hz, sans scintillement */

static void intensite(unsigned pct)
{
	pwm_set_dt(&pwm_led, PERIODE_NS, PERIODE_NS * pct / 100U);
}

int main(void)
{
	if (!pwm_is_ready_dt(&pwm_led)) {
		printk("Canal PWM indisponible\n");
		return 1;
	}

	while (1) {
		for (unsigned p = 0; p <= 100; p += 2) {
			intensite(p);
			k_msleep(20);
		}
		for (unsigned p = 100; p >= 2; p -= 2) {
			intensite(p);
			k_msleep(20);
		}
	}
	return 0;
}

← Retour à la fiche