🛠 ADC 12 bits et PWM sur la Nucleo-F401RE : oversampling, millivolts et LED en fondu
Objetivos
Usa las dos caras analógicas de la F401RE: el ADC de 12 bits (16 canales) y la PWM controlada por temporizador mediante analogWrite. Construirás un bucle de entrada por potenciómetro y salida de brillo con una conversión correcta a milivoltios, y luego añadirás sobremuestreo para estabilizar las últimas cifras.
Hardware
- 1× Nucleo-F401RE + cable micro-USB
- Potenciómetro de 10 kΩ: patas exteriores a 3,3 V y GND, cursor a A0 (PA0)
- 1 LED + resistencia de ~330 Ω en D5 (cualquier pin del conector Arduino compatible con PWM mapeado por el núcleo)
Los hechos
- El ADC de la F401RE es de 12 bits (0–4095) sobre un rango de 0–3,3 V — escala los milivoltios con
raw * 3300 / 4095. - El núcleo implementa
analogWritesobre temporizadores de hardware; no hay bit-banging por software. - > SIN VERIFICAR: se describe ampliamente que la F401 carece del DAC analógico presente en las F405/F407 — trata "sin DAC" como no confirmado; si necesitas salida analógica, planifica PWM + filtro RC o un DAC externo en SPI/I2S.
- El chip también incluye I2S y SDIO en el chip para streaming real de audio/SD (consulta el tutorial avanzado de USB/SDIO).
Código
const int kFadePin = D5; // PWM-capable pin mapped by the core
const int kProbePin = A0; // PA0 on the Arduino connector
void setup {
Serial.begin(115200); // ST-LINK VCP (USART2, PA2/PA3)
analogWrite(kFadePin, 0);
}
void loop {
// oversample: 64 reads averaged to stabilise the low digits
long sum = 0;
for (int i = 0; i < 64; i++) sum += analogRead(kProbePin);
int raw = sum / 64;
unsigned long mv = (unsigned long)(raw * 3300 / 4095); // 12-bit scale
int duty = map(raw, 0, 4095, 0, 255);
analogWrite(kFadePin, duty);
Serial.printf("raw=%4d %4lu mV duty=%3d\n", raw, mv, duty);
delay(100);
}
Pasos
- Conecta el divisor de potenciómetro y el LED según lo descrito.
- Carga el código seleccionando la placa Nucleo F401RE; abre el monitor serie a 115200.
- Gira el potenciómetro: el brillo del LED y la columna de mV deben seguirse mutuamente.
- Compara una única lectura de
analogReadcon el promedio de 64 muestras — el parpadeo en la última cifra desaparece.
Resultado esperado
Un barrido suave de 0 → 3300 mV con un ciclo de trabajo PWM coincidente de 0–255. El bucle de parpadeo + desvanecimiento + sonda ADC incluido en los ejemplos propios del núcleo es el mismo patrón en un solo sketch: parpadeo duro en PA5, rampa PWM visible por software con analogWrite, y una sonda de 12 bits impresa a través del VCP ST-LINK.
Errores comunes
- Escalar con 1023 (costumbre de 10 bits) — las lecturas se detienen en un cuarto del rango.
- Alimentar una señal de 5 V directamente en A0: el dominio del MCU es de 3,3 V (VDD 1,7–3,6 V); usa un divisor.
- Conectar el LED directamente a un GPIO sin una resistencia en serie.
- Buscar una salida
analogWritede calidad DAC: en esta clase de componente, PWM + filtro RC es la respuesta honesta y de bajo coste.
Otros tutoriales para esta placa
- Prise en main de la Nucleo-F401RE : ST-LINK, LED LD2 et alimentation
- Premier Blink Arduino sur la Nucleo-F401RE avec le core STM32duino
- Console série sur le ST-LINK VCP : printf, ADC 12 bits et piège du USB
- STM32CubeF4 et HAL : blink + UART printf générés pour la Nucleo-F401RE
- Zephyr RTOS sur la Nucleo-F401RE : west build, devicetree et west flash
- Bare-metal sur le STM32F401 : clignoter LD2 en écrivant les registres GPIO