pwm_rampe.c

nRF52833-DK (id de boards.json: nrf52833-dk) · Archivo : pwm_rampe.c · Lenguaje : C · Uso : Rampe d’intensité LED par PWM

Variación de intensidad sin parpadeo: el PWM del chip nRF a 100 Hz sube y baja el brillo en pasos del 2 %. El canal viene del alias pwm-0; un overlay encauza el controlador PWM a un pin del conector si hace falta.

Hardware

Una placa nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentada por USB: 4 LED en P0.13-P0.16 (activos a nivel bajo) y 4 botones en P0.11, P0.12, P0.24, P0.25 (activos a bajo, pull-up interno a activar). Un LED + 330 Ω en un pin enrutado como PWM (P2.xx en el DK vía overlay), o el LED RGB del MDK si el overlay lo apunta.

Cableado

LED entre el pin PWM y GND por 330 Ω. Los pines P1/P2 del DK entregan 3,3 V: verifica el voltaje antes de cualquier componente de 5 V.

Funcionamiento

pwm_set_dt fija periodo (10 ms) y ancho de pulso (0 a periodo). El bucle barre 0-100 % cada 20 ms, o sea una rampa completa de 2 segundos.

Ejecución

Proyecto Zephyr: west build -b nrf52833dk/nrf52833 y luego west flash (J-Link embarcado); consola serie 115200 en el conector USB UART.

Variantes

Tres canales PWM = fundido RGB, subir la frecuencia por encima de 1 kHz para audio filtrado, o mover un servo con periodo 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;
}

← Volver a la ficha