adc_ain1.c

nRF52833-DK (id de boards.json: nrf52833-dk) · Archivo : adc_ain1.c · Lenguaje : C · Uso : Lire une tension sur une entrée ADC

El ADC del nRF52 bien hecho: canal AIN1 (P0.03 en el DK, pin A0 del conector Arduino), muestra de 12 bits contra la referencia interna de 0,6 V. Ojo: por encima de 0,6 V hace falta un divisor, nunca entrada directa.

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 potenciómetro como divisor (A0 entre cursor y masa) o una fuente de prueba 0-0,6 V en el pin A0 del DK.

Cableado

Cursor del potenciómetro a P0.03 (A0), los dos extremos entre 3,3 V (o VDD) y GND. Nunca más de 0,6 V sin divisor con la referencia interna.

Funcionamiento

adc_channel_setup configura ganancia/referencia/canal; adc_read dispara una conversión DMA y rellena el búfer. El código 0-4095 se pasa a voltios con (raw/4095)×0,6.

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

Cambiar de canal (AIN2-P0.04, etc. según la guía del DK), sobremuestrear y promediar para reducir ruido, o activar la ganancia 1/4 para tensiones mayores.

adc_ain1.c

/* ADC canal 1 = AIN1. Sur le DK, AIN1 = P0.03 (broche A0
 * Arduino du connecteur) ; plage 0-Vref, Vref interne 0,6 V
 * avec gain 1 — diviser la tension si nécessaire ! */
#include <zephyr/kernel.h>
#include <zephyr/drivers/adc.h>

#define ADC_NODE DT_ALIAS(adc0)
#define CANAL    1

static const struct adc_channel_cfg ch_cfg = {
	.gain             = ADC_GAIN_1,
	.reference        = ADC_REF_INTERNAL,
	.acquisition_time = ADC_ACQ_TIME_DEFAULT,
	.channel_id       = CANAL,
};

static uint16_t echantillon;
static const struct adc_sequence seq = {
	.channels    = BIT(CANAL),
	.buffer      = &echantillon,
	.buffer_size = sizeof(echantillon),
	.resolution  = 12,
};

int main(void)
{
	const struct device *adc = DEVICE_DT_GET(ADC_NODE);
	if (!device_is_ready(adc)) {
		return 1;
	}
	adc_channel_setup(adc, &ch_cfg);

	while (1) {
		adc_read(adc, &seq);
		/* 0-4095 pour 0-0,6 V (Vref interne, gain 1) */
		printk("AIN1 = %u (raw 12 bits)\n", echantillon);
		k_msleep(1000);
	}
	return 0;
}

← Volver a la ficha