adc_ain1.c
L’ADC du nRF52 lu proprement : canal AIN1 (P0.03 sur le DK, broche A0 du connecteur Arduino), échantillon 12 bits contre la référence interne 0,6 V. Attention : au-delà de 0,6 V il faut un diviseur, pas une entrée directe.
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). Un potentiomètre monté en diviseur (broche A0 entre curseur et masse) ou une source de test 0-0,6 V sur la broche A0 du DK.
Câblage
Curseur du potentiomètre sur P0.03 (A0), les deux extrémités entre 3,3 V (ou VDD) et GND. Jamais plus de 0,6 V sans diviseur avec la référence interne.
Fonctionnement
adc_channel_setup configure gain/référence/canal ; adc_read déclenche une conversion DMA et remplit le tampon. Le code brut 0-4095 se convertit en volts par (raw/4095)×0,6.
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
Changer de canal (AIN2-P0.04, etc. selon la doc du DK), suréchantillonner et moyenner pour réduire le bruit, ou activer le gain 1/4 pour les tensions plus élevées.
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;
}