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 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.


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:
| Ajuste | LINE OUT | THD |
|---|---|---|
| GAIN 1 / MASTER 2 | 65 mVrms | 0,7 % (limpio) |
| GAIN 5 / MASTER 5 | 166 mVrms | 15 % (crunch) |
| GAIN 10 / MASTER 8 | 240 mVrms | 35 % |
| GAIN 10 / MASTER 10 / BOOST, entrada de 1 V | 430 mVrms | 39 % |

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

- 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:
- Señal seca
- Cadena completa: gate + chorus + delay + reverb
- Vibe, Phaser, Flanger, Chorus, Trémolo
- Delay girando D.TIME mientras suena, Respuesta al impulso de la reverb
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
| Archivo | Contenido | Tamaño |
|---|---|---|
| kagan-a1-smd-kicad.zip | Proyecto de KiCad 10: esquema, PCB, footprints, PDF del esquema y del montaje, capas, archivos de fabricación, scripts generadores, notas de diseño | 4,2 MB |
| kagan-a1-smd-gerber.zip | Solo Gerber + Excellon, listo para subir a JLCPCB | 0,9 MB |
| kagan-a1-firmware.zip | Código fuente del firmware, Makefile, cabeceras CMSIS, pruebas y un kagan_dsp.bin ya compilado | 0,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.
Comentarios
Sé el primero en comentar.
Inicia sesión con tu cuenta de Google para comentar. Tu nombre y tu comentario son públicos. Tu correo y tu dirección IP se guardan para combatir el abuso, pero nunca se muestran.