Reporte actividades

Javier Zavala

2026-03-17

bitacora:

02mar2026
09mar2026

Actualizacion: 17 Mar 2026

Emulador de sistemas dinamicos. Prototipo 0

Descripcion del sistema

Acondicionamiento 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]
               
              GND

Diagrama 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)

Filtro RC en lenguaje julia rc.jl

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’ + y

Reordenando: 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)

Codigo C de RC (version tiempo real)

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();
}

Imagenes

sampling
Chirp medida en microcontrolador



RC sampling
Resultado de filtrar la chirp . Se aprecia la atenuacion a causa del RC emulado. Fc : 40Hz



medidas tiempo
Midiendo tiempo de ejecucion



circuitos
Prototipo V0



Home