2026-03-17
bitacora:
02mar2026Acondicionamiento de señal
Acoplamiento señal analogica de audio (Tratamiento antes de entrar a uControlador)
+5V
│
[R1 4.5k]
│
|
│ hacia el ADC
Entrada ──||───●──> Vbias (~2.5V)
audio 10uF | Entrada a uControlador
│
[R2 4.5k]
│
GNDDiagrama a bloques
audio ───────┐
│
┌──┴───────┐
│ EMULADOR │
└──┬───────┘
│
serial ────> logs via serial Generacion de archivo de audio chirp.wav en Julia: chirp.jl
Chirp escalonada (con silencios) para barrer frecuencia con el fin de demostrar la funcionalidad de un RC emulado en uControlador. Audible desde cualquier reproductor.
using WAV
#Generar el chirp con silencios entre cada frecuencia
fs = 44100
#Vector de frecuencias en la señal chirp:
frecuencias = [20, 30, 40, 50, 60, 70, 80, 90, 100]
#Duración del silencio (20 ms) entre freq
silencio = zeros(Int(fs * 0.02))
#Genera chirp
chirp_signal = vcat([
vcat(
sin.(2π * fn .* (0:1/fs:(4/fn - 1/fs))),
silencio
)
for fn in frecuencias
]...)
# guardar archivo WAV
wavwrite(chirp_signal, "chirp.wav", Fs=fs)Un RC es un filtro pasa bajas de primer orden
R=1000; C=.100uF
x(entrada)-> ---/\/\/\/\---| |-----GND
-> i=Cy' -> ^
|
y(Vout)Si: y = voltage Vout de capacitor
La corriende de la rama es
i = Cy’
x = voltaje | audio de entrada , Por Kirchhoff:
x = RCy’ + yReordenando: RCy’=x-y o bien:
y'=(x-y)/RC //(ecuacion 1)Por otro lado, la derivada es:
y'=(y[n]-y[n-1])/dt //(ecuacion 2)Igualando ecuaciones 1 y 2:
y[n]-y[n-1] = (dt/RC) (x[n] - y[n])con
alpha = dt/(RC+dt)alpha
using WAV
# Leer archivo
x, fs = wavread("chirp.wav")
# Vin ── R ──┬── Vout
# |
# C
# |
# GND
fc = 40.0
RC = 1 / (2π * fc)
T = 1 / fs
alpha = T / (RC + T)
# Filtro RC discreto
y = similar(x)
y[1] = x[1]
for n in 2:length(x)
#rc();
y[n] = y[n-1] + alpha * (x[n] - y[n-1])
#traducir a lenguaje C...
end
# Guardar WAV
wavwrite(y, "chirp_despues_de_filtro_rc.wav", Fs=fs)El siguiente codigo muestra la (interrupcion) / ISR . Rutina de tiempo real
Ejecutada deterministicamente (hard real time) cada 1 ms:
Prueba de concepto
#define V_BIAS (512) //ADC de 10bits
isr_1ms()
{
// Filtro RC
static float y = 0.0;
static float alpha = 0.2;
// Alternar pin para medir con analizador lógico
// Tick de sistema de tiempo real
ToggleLedISR_D0();
//Mide tiempo de ejecucion:
Set_D0_High();
{
// Leer ADC
x = analogRead(pinADC);
// Centrar en 0 (Vbias de 2.5V)
x = x - V_BIAS;
// Aplicar filtro RC
y = y + alpha * (x - y);
sampleToSend = (int)(y + V_BIAS); // Recentrar para enviar valor entre 0-1023
readyToSend = true; // dato listo
}
Set_D0_Low();
}