BA Barış Akın~/blog

·8 min de lectura·40 lecturas

KAGAN A1: pedal de amplificador a válvulas EL34 con efectos DSP, archivos de KiCad y firmware

Un previo de válvulas de dos etapas hecho con MOSFET, una etapa EL34 y una cabina 4x12 simuladas, seguidos de ocho efectos DSP en un STM32G473 y un ES8388. Placa SMD de 6 capas lista para JLCPCB; proyecto de KiCad, Gerber/BOM/CPL y firmware descargables.

KAGAN A1: pedal de amplificador a válvulas EL34 con efectos DSP, archivos de KiCad y firmware

KAGAN A1 es un amp-in-a-box analógico que mete un previo de válvulas de alta ganancia con dos etapas, una etapa de potencia EL34 y una cabina 4×12 en una sola caja de pedal. No necesita ordenador: se conecta a una interfaz de audio, a monitores activos, a unos auriculares o a la entrada de un amplificador real. Este artículo trata de la versión SMD de la placa, que añade detrás del amplificador analógico un bloque DSP con un STM32G473 y un códec ES8388: noise gate, phaser, vibe, flanger, chorus, delay, reverb y trémolo.

Los archivos de KiCad, los Gerber/BOM/CPL y el código fuente del firmware se pueden descargar al final del artículo.

Modelo 3D del KAGAN A1 en una caja Hammond 1590XX: 17 potenciómetros, LED, footswitches BOOST y BYPASS (un render, aún sin fabricar)

Vista 3D superior de la placa KAGAN A1 SMD: las etapas del amplificador analógico a la izquierda y en el centro, el bloque DSP con el STM32 y el ES8388 abajo a la derecha

Cadena de señal

ENTRADA (1 MΩ) → buffer
 → V1a  2N7002, 680 Ω + 1k‖2.2µ en source    [BOOST: +8 dB]
 → GAIN + 100 pF bright
 → V1b  etapa fría (bias bajo, source sin desacoplar)
 → V2a  ×5 → V2b seguidor de source
 → circuito de tono pasivo: TREBLE / BASS / MIDDLE
 → MASTER
 → potencia EL34: ×2 (medios) / ×4 (graves, resonancia ~100 Hz), PRESENCE,
   recorte simétrico con diodos (armónicos impares, como un push-pull)
 → LEVEL → DSP (gate, phaser, vibe, flanger, chorus, delay, reverb, trémolo)
      ├─ AMP OUT   (sin simulación de cabina, a un amplificador real)
      └─ simulación de cabina: HPF 93 Hz Q1.8 + LPF de 5.º orden (−19 dB a 6 kHz)
           → LINE OUT, PHONES

Las etapas de triodo están hechas con MOSFET. La resistencia de drain, la de source y el condensador de desacoplo de cada etapa están elegidos para que se comporte como la etapa de válvula que representa: el 1k‖2.2µ del source de V1a recorta los graves más bajos, y V1b es una etapa "fría", con bias bajo y sin condensador, la que da al amplificador su recorte característico. El circuito de tono es el clásico pasivo de tres controles (33k, 470p, 22n, 22n; TREBLE y BASS 250k, MIDDLE 25k).

El footswitch de BOOST no está en el camino de la señal. Solo conmuta una línea de control en continua, que conecta 220 Ω + 22 µF al source de V1a a través de un MOSFET. Una rampa RC de 50 ms evita el chasquido.

Simulación

Todo el circuito analógico está simulado con ngspice (sim/kagan.py). Con una entrada de 220 Hz y 200 mV:

AjusteLINE OUTTHD
GAIN 1 / MASTER 265 mVrms0,7 % (limpio)
GAIN 5 / MASTER 5166 mVrms15 % (crunch)
GAIN 10 / MASTER 8240 mVrms35 %
GAIN 10 / MASTER 10 / BOOST, entrada de 1 V430 mVrms39 %

Gráficas de simulación: respuesta en frecuencia de la cabina, efecto de los controles de tono y forma de onda en LINE OUT con tres ajustes de ganancia

La tensión umbral del 2N7002 puede estar entre 1,0 y 2,5 V. Se simuló todo el rango y las tensiones de drain se quedan en la zona de trabajo sin ajuste. La placa no tiene trimmers.

El bloque DSP

Después del buffer de LEVEL, la señal se divide a la mitad y entra en el canal izquierdo del ADC del ES8388. El canal derecho recibe la señal DI limpia de la entrada, y el noise gate decide con ella, no con la señal distorsionada. Así el gate mira cuánto se está tocando de verdad, no la envolvente de una señal recortada y comprimida.

  • MCU: STM32G473CEU6, Cortex-M4F a 150 MHz. Casi todos sus 128 KB de RAM son para la línea de delay.
  • Códec: ES8388, I2S, 24 bits, Fs = 48,828 kHz (cristal de 12 MHz → PLL → 150 MHz → MCLK del SAI 12,5 MHz).
  • Buffers ping-pong de 32 muestras por DMA.
  • El delay funciona a fs/4 y se comporta como un BBD: cada repetición sale algo más oscura (paso bajo a 2,8 kHz) y más fina (120 Hz), y satura suavemente. Al girar D.TIME el tiempo se desliza en 0,25 s, con un cambio de tono parecido al de una cinta.
  • La reverb funciona a fs/2 y es una FDN de 8 líneas. El T60 va de 1,5 a 3 s con el potenciómetro.
  • Cada efecto tiene un solo potenciómetro y está apagado con él a la izquierda del todo. En el primer 10 % del recorrido el efecto entra suavemente, y phaser, flanger, chorus y vibe compensan el nivel: activarlos o no cambia el volumen como mucho ±0,7 dB.

Mi parte favorita es el vibe. En el Uni-Vibe original las cuatro etapas de desfase tienen condensadores distintos y una sola bombilla con sus LDR las mueve todas. La bombilla se calienta rápido y se enfría despacio, así que la modulación no es una senoidal sino un pulso asimétrico. El firmware modela justo eso:

float drive = 0.5f + 0.5f * sinf(6.2831853f * vb_lfo);
vb_lamp += (drive > vb_lamp ? vb_up : vb_dn) * (drive - vb_lamp);   /* 5 ms al calentar, 25 ms al enfriar */
/* LDR: conductancia ~ luz^0.6, ~2,5 octavas de barrido a profundidad máxima */
float m = exp2f(depth * 2.5f * (powf(vb_lamp, 0.6f) - 0.66f));
for (int i = 0; i < 4; i++) {                      /* 90, 240, 1100, 3600 Hz */
    float t = tanf(3.14159265f * VB_F[i] * m / fs_main);
    vb_a[i] = (t - 1.f) / (t + 1.f);
}

Bypass analógico

Cuando todos los efectos llevan 300 ms apagados, el MCU saca el DSP del camino y la señal va por la ruta analógica. Lo mismo ocurre al encender y cuando el MCU no está programado: el pin DSP_EN está a masa con 100k. Así que si nunca se grabó el firmware o el códec no responde, el pedal sigue funcionando como amplificador analógico. En simulación las dos rutas tienen la misma ganancia, y la fuga de la ruta inactiva está entre −57 y −75 dB.

LED de los potenciómetros

Cada potenciómetro del DSP tiene encima un LED de 3 mm. Los de nivel brillan según su valor (gamma 2,2), el de D.TIME destella 40 ms en cada eco, el de TREMOLO late con el trémolo y el de VIBE respira con la bombilla virtual. Los LED van por PWM, y la frecuencia del PWM es exactamente 2·Fs: 150 MHz / 1536 = 97,66 kHz. Si algo del PWM llega al códec por masa, el muestreo lo pliega a continua y no puede convertirse en un tono audible.

La placa

El lado del panel: las 17 posiciones de potenciómetro, los LED y los nombres de los controles

  • 110 × 132 mm, 6 capas, caja Hammond 1590XX, con una muesca abajo para dos footswitches.
  • 17 potenciómetros WH148 en el lado del panel: las dos filas de arriba son el amplificador analógico (GAIN, BASS, MIDDLE, TREBLE, PRESENCE, MASTER, LEVEL) y las dos de abajo el DSP (GATE, REVERB, D.TIME, D.REPEATS, D.MIX, VIBE, PHASER, CHORUS, FLANGER, TREMOLO).
  • Dos footswitches: BOOST y un true bypass 3PDT. El true bypass solo afecta a AMP OUT. LINE OUT y la salida de auriculares se silencian en bypass, porque la señal de guitarra sin procesar no suena bien en auriculares.
  • Todos los componentes SMD están en la cara superior, listos para el montaje a una cara de JLCPCB: 75 referencias distintas, 251 colocaciones. 36 piezas se sueldan a mano (potenciómetros, LED, pads de cable, conector SWD).
  • Condensadores: C0G en el tono, la cabina, presence y resonance; X7R/X5R para acoplo y desacoplo.

El esquema no está dibujado a mano. Las piezas y las redes están en un archivo Python (tools/parts.py) y tools/mksch.py genera con él el esquema de KiCad. tools/mkpcb.py coloca las piezas en el orden de la señal y luego mejora la colocación con simulated annealing, dando mucho peso a los nodos de alta impedancia y poco a masa y alimentación. El ruteado lo hizo fastroute, mi propio autorouter. El resultado: 0 violaciones de DRC en KiCad, 0 pads sin conectar y paridad total con el esquema.

Una nota: al guardar la placa desde pcbnew, KiCad devuelve las reglas de diseño del proyecto a sus valores por defecto (0,2 mm) y el DRC muestra cientos de violaciones. Las reglas de la placa son 0,15/0,15 mm para la clase Default y 0,3 mm para las alimentaciones. Ejecutar python3 tools/rules.py antes del DRC las vuelve a escribir. El archivo de proyecto de la descarga ya tiene las reglas correctas.

Firmware

Está escrito en C sin HAL ni CubeMX: los registros se configuran directamente con las cabeceras CMSIS. Ocupa unos 19 KB de flash y 103 KB de RAM.

make TOOLCHAIN=/ruta/arm-gnu-toolchain/bin/   # build/kagan_dsp.bin
make host-test                                # pruebas del DSP en el ordenador
st-flash write build/kagan_dsp.bin 0x08000000 # con un ST-Link, conector SWD J6

make host-test compila el código DSP en el ordenador y lo prueba: que la salida sea idéntica bit a bit a la entrada con los efectos apagados, el T60 de la reverb, el tiempo y la proporción de repeticiones del delay, la estabilidad con la realimentación al máximo y la compensación de nivel. Las pruebas también escriben archivos WAV. La entrada no es una grabación real de guitarra sino una señal sintética: dos notas, muy recortadas, con soplido de preamplificador encima. Aun así sirve para oír cómo se comportan los efectos:

Estado

El circuito está simulado, la placa está diseñada y pasa el DRC, el firmware compila y las pruebas del DSP pasan en el ordenador. La placa todavía no se ha fabricado. Antes de pedirla:

  • Medir con calibre la distancia del eje del WH148 a la fila de patas (el footprint supone 7,5 mm).
  • Revisar en la vista previa de montaje de JLCPCB la orientación de todos los circuitos integrados, transistores, diodos y electrolíticos.
  • Al encender por primera vez: el LED de la placa debe parpadear a 1 Hz (si parpadea rápido, el códec no responde por I2C), y con los efectos apagados la ruta DSP y la analógica deben dar el mismo nivel.

Si alguien la monta, me gustaría saber cómo sale.

Descargas

ArchivoContenidoTamaño
kagan-a1-smd-kicad.zipProyecto de KiCad 10: esquema, PCB, footprints, PDF del esquema y del montaje, capas, archivos de fabricación, scripts generadores, notas de diseño4,2 MB
kagan-a1-smd-gerber.zipSolo Gerber + Excellon, listo para subir a JLCPCB0,9 MB
kagan-a1-firmware.zipCódigo fuente del firmware, Makefile, cabeceras CMSIS, pruebas y un kagan_dsp.bin ya compilado0,6 MB

Los archivos BOM y CPL para JLCPCB (kagan_smd_bom_jlc.csv, kagan_smd_cpl_jlc.csv) están en la carpeta fab/ del paquete de KiCad. Las notas de diseño del paquete (NOTLAR.md) están en turco.

BA
Barış Akın

Arquitecto de soluciones de software con más de 25 años de experiencia. FinTech y sistemas distribuidos; creador de OxiDB, Rill y Cobra.